Indirizzo IP pubblico per il contenitore LXC


26

Ok, quindi voglio sapere come fare il networking sui container LXC. Non solo il tipo di informazioni vaghe ottenute dagli altri siti Web, ma una vera guida per principianti per farle funzionare .. Poiché la maggior parte degli esempi sono fondamentalmente configurati per le persone con cui testare, voglio eseguire un servizio su uno ... come un web server per esempio.

Sto eseguendo Ubuntu 12.04 LTS e ho LXC installato e posso creare, avviare e arrestare un contenitore. Il mio server ha ovviamente un IP pubblico e vorrei sapere come impostare un contenitore in modo che anch'esso possa avere un IP pubblico. Dal momento che sembra già esserci un ponte sul mio contenitore attuale, sembra che sia necessario assegnare ai contenitori un intervallo DHCP pubblico affinché possano funzionare o assegnare manualmente un indirizzo IP statico al mio contenitore.

Se desidero assegnare staticamente un IP al contenitore, come posso farlo? Devo apportare modifiche alla mia configurazione del bridge sull'host? In realtà è meglio farlo con l'opzione MACVLAN?

Qualsiasi aiuto sarebbe apprezzato.


Non ho familiarità con LXC, ma il tuo isp in genere ti darà solo un indirizzo IP pubblico. Hai un pacchetto con più ips statici?
wlraider70,

Gli IP pubblici non sono l'unico caso d'uso, vogliamo che vengano assegnati 2 IP pubblici ai nostri contenitori di bilanciamento del carico, ma vogliamo IP LAN dedicati dedicati a una varietà di altri servizi. In questo modo se spostiamo i container su hardware diverso è facile come spostare l'IP (DNS non funziona in questo senso per alcuni dei componenti che utilizziamo)
David Parks

Risposte:


23

Il mio approccio presuppone che il tuo server abbia una singola NIC e che tu debba condividere quella NIC tra l'host e i guest LXC. Ciò comporta l'uso di un ponte. Il ponte possiede e gestisce eth0. L'host ora configura il proprio networking br0invece che eth0. I guest LXC sono configurati per connettersi al bridge.

  1. Sull'ospite, sudo apt-get install bridge-utils.

  2. Sull'host, sostituire eth0con un bridge:

    Questo è pericoloso. Sbagli e potresti essere bloccato fuori dal tuo server. Assicurati di avere un accesso locale abilitato e che l'accesso alla console locale funzioni, in modo da poter annullare questa modifica in caso di problemi.

    In /etc/network/interfaces:

    1. Sostituisci auto eth0con auto br0.
    2. Sostituire:

      iface eth0 inet dhcp
      

      con:

      iface br0 inet dhcp
          bridge_ports eth0
      

      Se avessi una configurazione di rete statica, sostituiresti:

      iface eth0 inet static
          address ...
          netmask ...
          gateway ...
          etc.
      

      con:

      iface br0 inet static
          bridge_ports eth0
          address ...
          netmask ...
          gateway ...
          etc.
      

      Stai solo cambiando eth0per br0e aggiungendo la bridge_ports eth0linea.

    3. Riavvia l'host. Se lo facessi localmente, allora corri sudo ifdown eth0prima di iniziare, e sudo ifup br0dopo lo farebbe anche. Nota che il bridge può impiegare un po 'di tempo a salire, quindi dagli cinque minuti dopo il riavvio prima di presumere che tutto sia perduto.

  3. Per spostare un determinato contenitore LXC denominato su un IP pubblico:

    1. Ferma il contenitore.
    2. Sull'host, modifica e modifica in ./var/lib/lxc/container_name/configlxc.network.linkbr0
    3. Sull'host, modifica e configura il tuo IP pubblico come faresti normalmente (DHCP o una configurazione statica secondo necessità). Si noti che l'interfaccia viene comunque chiamata dal punto di vista del contenitore./var/lib/lxc/container_name/rootfs/etc/network/interfaceseth0
    4. Riavvia il contenitore.
  4. Per modificare l'impostazione predefinita per i nuovi contenitori LXC, modificare /etc/lxc/default.confsull'host e passare lxc.network.linka br0.

  5. Se non è necessario il bridge NAT fornito da LXC (ovvero tutti i container useranno invece il nuovo bridge), quindi sull'host, modificare /etc/default/lxce passare USE_LXC_BRIDGEa "false", e quindi sull'host in esecuzione sudo service lxc restart.


Grazie! Ci sono molte domande simili in giro. Ma questa risposta finalmente mi ha aiutato a far funzionare le cose.
Mausy5043,

1

Robie, grazie mille per aver postato questa risposta, mi sono tolto i capelli cercando di farlo e questo è stato l'unico metodo che ha funzionato!

Ho pensato di menzionare alcune cose che ho scoperto per aiutare a chiarire le istruzioni per gli altri amministratori.

Il mio host aveva più alias ip statici assegnati a eth0 sul guest, ad esempio:

iface eth0:1 inet static
  address 5.5.5.5
  netmask 255.255.255.5
  gateway 5.5.5.1
etc.

Ora non vogliamo impostare br0 allo stesso modo, vogliamo solo un IP senza alias come Robie indicato sopra.

Supponiamo quindi che si desideri assegnare 5.5.5.5 al contenitore debian8.

Modifica /var/lib/lxc/debian8/etc/network/interfacese aggiungi:

iface eth0 inet static 
      address 5.5.5.5
      netmask 255.255.255.5
      gateway 5.5.5.1
    etc.

Quindi emettere questo comando: route add default gw <gateway-ip, in my case 5.5.5.1>

Dopodiché, riavvia il contenitore e tutto dovrebbe finalmente funzionare! :)


1

Ho avuto lo stesso problema e ho questa soluzione (veloce e sporca).

server: eth0 = 10.1.0.77/24
server: lxdbr0 (lxd bridge) = 10.255.255.77/24

container: eth0 = 10.255.255.100/24 (same network as lxdbr0)
container: eth0:0 = 194.99.99.99/28  (public ip address on eth0 alias)

Sul server: route add -host 194.99.99.99 gw 10.255.255.100 dev lxdbr0

Inoltre, se necessario, aggiungere il percorso ai router upstream.

Probabilmente, non è la soluzione migliore ma non richiede grandi sforzi! Saluti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.