{"id":444,"date":"2025-12-26T22:46:50","date_gmt":"2025-12-26T21:46:50","guid":{"rendered":"https:\/\/www.carinato.net\/?p=444"},"modified":"2025-12-26T22:46:50","modified_gmt":"2025-12-26T21:46:50","slug":"multipli-siti-web-in-diversi-container-su-un-server-proxmox-9-con-un-solo-ip-pubblico","status":"publish","type":"post","link":"https:\/\/carinato.com\/?p=444","title":{"rendered":"Multipli siti web in diversi container su un server Proxmox 9 con un solo IP Pubblico"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">tratto da: <a href=\"https:\/\/community.ovhcloud.com\/community\/en\/new-os-available-proxmox-virtual-environment-ve-9?id=community_question&amp;sys_id=362f0572b1e7ae14f07803b560bfcdaf\">https:\/\/community.ovhcloud.com\/community\/en\/new-os-available-proxmox-virtual-environment-ve-9?id=community_question&amp;sys_id=362f0572b1e7ae14f07803b560bfcdaf<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Prerequisiti<\/h2>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<ul class=\"wp-block-list\">\n<li>OVH\/Kimsufi dedicated server<\/li>\n\n\n\n<li>Proxmox 9 installed by OVH<\/li>\n\n\n\n<li>SSH access to the server<\/li>\n\n\n\n<li>Basic understanding of Linux networking<\/li>\n<\/ul>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Parte 1: Installazione iniziale<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.1 Setup utente amministratore<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\"># SSH into server as root<br>ssh root@YOUR_SERVER_IP<br><br># Create admin user<br>adduser <strong>utente<\/strong><br>usermod -aG sudo <strong>utente<\/strong><br><br># Set up SSH key access<br>mkdir -p \/home\/<strong>utente<\/strong>\/.ssh<br>cp \/root\/.ssh\/authorized_keys \/home\/<strong>utente<\/strong>\/.ssh\/<br>chown -R <strong>utente<\/strong>:<strong> <\/strong>\/home\/<strong>utente<\/strong>\/.ssh<br>chmod 700 \/home\/<strong>utente<\/strong>\/.ssh<br>chmod 600 \/home\/<strong>utente<\/strong>\/.ssh\/authorized_keys<br><br># Configure passwordless sudo<br>echo \"<strong>utente <\/strong>ALL=(ALL) NOPASSWD:ALL\" > \/etc\/sudoers.d\/<strong>utente<\/strong><br>chmod 440 \/etc\/sudoers.d\/<strong>utente<\/strong><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">1.2 Accesso Interfaccia Web <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Imposto la password di root per poter accedere all&#8217;interfaccia web<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">passwd root<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Posso ora accedere alla pagina web di Proxmox: <strong>https:\/\/YOUR_SERVER_IP:8006<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Parte 2: Configurazione di rete dei container<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">2.1 il problema<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La configurazione di default della rete dei container su OVH fallisce a causa di:<\/p>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<ul class=\"wp-block-list\">\n<li>I container si connettono direttamente alla rete esterna vmbr0<\/li>\n\n\n\n<li>Non \u00e8 prevista la configurazione NAT per i container<\/li>\n\n\n\n<li>Mancano le regole di FORWARD tra le reti esterne ed interne<\/li>\n<\/ul>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">2.2 Creo una rete Bridge interna<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Modifica&nbsp;<code>\/etc\/network\/interfaces<\/code>&nbsp;e aggiungi:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">auto vmbr6<br>iface vmbr6 inet static<br>    address 10.0.0.254\/24<br>    bridge-ports none<br>    bridge-stp off<br>    bridge-fd 0<br>    post-up echo 1 &gt; \/proc\/sys\/net\/ipv4\/ip_forward<br>    post-up iptables -t nat -A POSTROUTING -s 10.0.0.0\/24 -o vmbr0 -j MASQUERADE<br>    post-down iptables -t nat -D POSTROUTING -s 10.0.0.0\/24 -o vmbr0 -j MASQUERADE<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">2.3 Attivo il bridge interno<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># Bring up the new bridge<br>ifup vmbr6<br><br># Verify bridge creation<br>ip addr show vmbr6<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">2.4 Configuro l&#8217;inoltro dei pacchetti:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># Enable IP forwarding permanently<br>echo 'net.ipv4.ip_forward = 1' &gt;&gt; \/etc\/sysctl.conf<br>sysctl -p<br><br># Add FORWARD rules for container-to-internet traffic<br>iptables -I FORWARD -i vmbr6 -o vmbr0 -j ACCEPT  <br>iptables -I FORWARD -i vmbr0 -o vmbr6 -m state --state RELATED,ESTABLISHED -j ACCEPT<br><br># Importo il forward dei pacchetti web<br>iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.100:15080<br>iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 443 -j DNAT --to-destination 10.0.0.100:15443<br>iptables -A FORWARD -p tcp -d 10.0.0.100 --dport 15080 -j ACCEPT<br>iptables -A FORWARD -p tcp -d 10.0.0.100 --dport 15443 -j ACCEPT<br><br># Save iptables rules<br>mkdir -p \/etc\/iptables<br>iptables-save &gt; \/etc\/iptables\/rules.v4<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Parte 3: Creazione del container di routing<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">3.1 Download del Template per il Container<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dall&#8217;interfaccia web di Proxmox:<\/p>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<ul class=\"wp-block-list\">\n<li>Vai sul nodo &#8211;&gt;  local storage<\/li>\n\n\n\n<li>Clicca sul tab: &#8220;CT Templates&#8221;<\/li>\n\n\n\n<li>Clicca sul tasto &#8220;Templates&#8221;<\/li>\n\n\n\n<li>Scarica Debian-13-standard<\/li>\n<\/ul>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">3.2 Crea il container dall&#8217;interfaccia web<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dal nodo proxmox premo il tasto destro e scelgo &#8220;Crea CT&#8221;<\/p>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<ul class=\"wp-block-list\">\n<li>General tab:\n<ul class=\"wp-block-list\">\n<li>CT ID: 100<\/li>\n\n\n\n<li>Hostname: your-container-name<\/li>\n\n\n\n<li>Set password<\/li>\n\n\n\n<li>Add SSH public key (opzionale)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Template tab:\n<ul class=\"wp-block-list\">\n<li>Select debian-13-standard<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Root Disk tab:\n<ul class=\"wp-block-list\">\n<li>Size: 8GB (adjust as needed)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>CPU\/Memory tabs:\n<ul class=\"wp-block-list\">\n<li>Set as needed (1 core, 1GB RAM for basic web server)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Network tab:\n<ul class=\"wp-block-list\">\n<li><strong>CRITICAL<\/strong>: Change bridge from vmbr0 to vmbr6<\/li>\n\n\n\n<li>Set static IP: 10.0.0.100\/24 (increment for additional containers)<\/li>\n\n\n\n<li>Gateway: 10.0.0.254<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>DNS tab:\n<ul class=\"wp-block-list\">\n<li>Use host settings<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">3.3 Verifica e configurazione Container di routing<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># Start container<br>pct start 100<br><br># Enter container<br>pct enter 100<br><br># Test connectivity<br>ping -c 3 10.0.0.254    # Gateway<br>ping -c 3 8.8.8.8       # Internet<br><br># Applico gli aggiornamenti come di prassi<br>apt update &amp;&amp; apt upgrade -y<br><br># Scarico i pacchetti nginx e Let's Encrypt<br>apt install python3-acme python3-certbot python3-mock python3-openssl python3-pkg-resources python3-pyparsing python3-zope.interface python3-certbot-nginx nginx<br><br># Rimuovo la configurazione per il sito di default<br>rm \/etc\/nginx\/sites-enabled\/default<br><br># Creo una configurazione di routing per un primo sito web: example.com sul server locale 10.0.0.101<br>echo 'server {<br>    listen 15080;<br>    listen [::]:15080; # Also listen on IPv6<br>    server_name example.com;<br><br>    location \/ {<br>        proxy_pass http:\/\/10.0.0.101:80; # Indirizzo del server di destinazione<br>        proxy_set_header Host $host;<br>        proxy_set_header X-Real-IP $remote_addr;<br>        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br>        proxy_set_header X-Forwarded-Proto $scheme;<br>    }<br>}' &gt; \/etc\/nginx\/conf.d\/router.conf<br><br># Riavvio il server NGINX<br>service nginx restart<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">3.4 Test raggiungibilit\u00e0 sito web<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I record DNS del vostro sito &#8220;example.com&#8221; deve essere configurato con un record di tipo A che punta all&#8217;indirizzo IP del vostro server Proxmox<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Puntate il vostro browser verso l&#8217;indirizzo <strong>http:\/\/example.com<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se tutto e&#8217; andato a buon fine dovreste vedere la pagina di Welcome di NGINX<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3.5 Richiesta del certificato Let&#8217;s Encrypt<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">certbot --nginx -d example.com -m mymail@mydomain.com --agree-tos --no-eff-email --http-01-port 15080<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Certbot vi chieder\u00e0 se redirigere il traffico http a https. Per ora rispondete no.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3.6 Modificate la porta per https:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sed -i 's\/listen 443 ssl\/listen 15443 ssl\/g' \/etc\/nginx\/conf.d\/router.conf<br><br># Riavvio NGINX<br>service nginx restart<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Parte 4: Server Web <\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Potete ora creare un nuovo container per ospitare il sito example.com (potete ripetere questi passaggi per altri nuovi container):<\/p>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<ul class=\"wp-block-list\">\n<li>General tab:\n<ul class=\"wp-block-list\">\n<li>CT ID: 101<\/li>\n\n\n\n<li>Hostname: example.com<\/li>\n\n\n\n<li>Set password<\/li>\n\n\n\n<li>Add SSH public key (opzionale)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Template tab:\n<ul class=\"wp-block-list\">\n<li>Select debian-13-standard<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Root Disk tab:\n<ul class=\"wp-block-list\">\n<li>Size: 8GB (adjust as needed)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>CPU\/Memory tabs:\n<ul class=\"wp-block-list\">\n<li>Set as needed (1 core, 1GB RAM for basic web server)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Network tab:\n<ul class=\"wp-block-list\">\n<li><strong>CRITICAL<\/strong>: Change bridge from vmbr0 to vmbr6<\/li>\n\n\n\n<li>Set static IP: 10.0.0.101\/24 (increment for additional containers)<\/li>\n\n\n\n<li>Gateway: 10.0.0.254<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>DNS tab:\n<ul class=\"wp-block-list\">\n<li>Use host settings<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Nota che l&#8217;indirizzo IP 10.0.0.101 \u00e8 quello indicato nel file router.conf visto sopra.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dalla shell di proxmox:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># Start container<br>pct start 101<br><br># Enter container<br>pct enter 101<br><br># Test connectivity<br>ping -c 3 10.0.0.254    # Gateway<br>ping -c 3 8.8.8.8       # Internet<br><br># Applico gli aggiornamenti come di prassi<br>apt update &amp;&amp; apt upgrade -y<br><br># Scarico, installo e configuro Caddy<br>wget -O \/tmp\/caddy.tar.gz 'https:\/\/github.com\/caddyserver\/caddy\/releases\/download\/v2.7.6\/caddy_2.7.6_linux_amd64.tar.gz'<br>tar -xzf \/tmp\/caddy.tar.gz -C \/usr\/local\/bin\/ caddy<br>chmod +x \/usr\/local\/bin\/caddy<br><br># Verify installation<br>\/usr\/local\/bin\/caddy version<br><br># Create directory structure<br>mkdir -p \/etc\/caddy \/var\/www\/html<br><br># Create test page<br>echo '&lt;h1&gt;Working Caddy Web Server&lt;\/h1&gt;&lt;p&gt;Container networking successful!&lt;\/p&gt;' &gt; \/var\/www\/html\/index.html<br><br># Create basic Caddyfile<br>echo ':80 {<br>    root * \/var\/www\/html<br>    file_server<br>}' &gt; \/etc\/caddy\/Caddyfile<br><br># Start Caddy<br>nohup \/usr\/local\/bin\/caddy run --config \/etc\/caddy\/Caddyfile &gt; \/var\/log\/caddy.log 2&gt;&amp;1 &amp;<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Potete ora navigare su <strong>https:\/\/example.com<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Avete finito !!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nel file \/etc\/nginx\/conf.d\/router.conf potete aggiungere la configurazione anche per altri siti o server locali modificando il nome del sito o l&#8217;indirizzo del server (10.0.0.102, 10.0.0.103 &#8230;)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>tratto da: https:\/\/community.ovhcloud.com\/community\/en\/new-os-available-proxmox-virtual-environment-ve-9?id=community_question&amp;sys_id=362f0572b1e7ae14f07803b560bfcdaf Prerequisiti Parte 1: Installazione iniziale 1.1 Setup utente amministratore # SSH into server as rootssh root@YOUR_SERVER_IP# Create admin useradduser utenteusermod -aG sudo utente# Set up SSH key accessmkdir -p \/home\/utente\/.sshcp \/root\/.ssh\/authorized_keys \/home\/utente\/.ssh\/chown -R utente: \/home\/utente\/.sshchmod 700 \/home\/utente\/.sshchmod 600 \/home\/utente\/.ssh\/authorized_keys# Configure passwordless sudoecho &#8220;utente ALL=(ALL) NOPASSWD:ALL&#8221; > \/etc\/sudoers.d\/utentechmod 440 \/etc\/sudoers.d\/utente 1.2 Accesso Interfaccia [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,18,4],"tags":[6,16,2,3],"class_list":["post-444","post","type-post","status-publish","format-standard","hentry","category-linux","category-networking","category-webutils","tag-linux","tag-proxmox","tag-utils","tag-web"],"_links":{"self":[{"href":"https:\/\/carinato.com\/index.php?rest_route=\/wp\/v2\/posts\/444","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/carinato.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/carinato.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/carinato.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/carinato.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=444"}],"version-history":[{"count":0,"href":"https:\/\/carinato.com\/index.php?rest_route=\/wp\/v2\/posts\/444\/revisions"}],"wp:attachment":[{"href":"https:\/\/carinato.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=444"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/carinato.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=444"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/carinato.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=444"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}