Publiczny adres IP kontenera LXC

26

Ok, więc chcę wiedzieć, jak tworzyć sieci w kontenerach LXC. Nie tylko rodzaj niejasnych informacji, które otrzymujesz z innych stron internetowych, ale prawdziwy przewodnik dla początkujących, jak je uruchomić. Ponieważ większość przykładów jest w zasadzie skonfigurowana do testowania przez ludzi, chcę uruchomić usługę na jednym ... jak serwer WWW na przykład.

Używam Ubuntu 12.04 LTS i mam zainstalowany LXC i mogę tworzyć, uruchamiać i zatrzymywać kontener. Mój serwer ma oczywiście publiczny adres IP i chciałbym wiedzieć, jak skonfigurować kontener, aby również mógł mieć publiczny adres IP. Ponieważ wydaje się, że istnieje już mostek z mojego obecnego kontenera, wydaje się, że albo muszę nadać kontenerom zakres DHCP, który jest publiczny, aby działały, albo ręcznie przypisać statyczny adres IP do mojego kontenera.

Jeśli chcę statycznie przypisać adres IP kontenerowi, jak to zrobić? Czy muszę wprowadzić zmiany w konfiguracji mostka na hoście? Czy faktycznie lepiej jest to zrobić z opcją MACVLAN?

Każda pomoc będzie mile widziana.

użytkownik132151
źródło
Nie znam LXC, ale Twój typowy ISP da ci tylko jeden publiczny adres IP. Czy masz pakiet z wieloma statycznymi ips?
wlraider70
Publiczne adresy IP nie są jedynym przypadkiem użycia, chcemy, aby 2 publiczne adresy IP zostały przypisane do naszych kontenerów usługi równoważenia obciążenia, ale chcemy dedykowanych adresów IP sieci LAN dedykowanych do wielu innych usług. W ten sposób przenoszenie kontenerów na innym sprzęcie jest tak proste, jak przenoszenie adresu IP (DNS nie działa w tym względzie w przypadku niektórych używanych przez nas komponentów)
David Parks

Odpowiedzi:

23

Moje podejście zakłada, że ​​twój serwer ma jedną kartę sieciową i musisz udostępnić tę kartę pomiędzy gospodarzem a gośćmi LXC. Wymaga to użycia mostu. Most jest właścicielem i zarządza eth0. Host konfiguruje teraz własną sieć br0zamiast eth0. Goście LXC są skonfigurowani do łączenia się z mostem.

  1. Na gospodarza sudo apt-get install bridge-utils.

  2. Na hoście zastąp eth0mostem:

    To jest niebezpieczne. Zrozum to źle, a możesz zostać zablokowany na serwerze. Upewnij się, że masz włączone logowanie lokalne i że dostęp do lokalnej konsoli działa, abyś mógł cofnąć tę zmianę, jeśli masz jakiekolwiek problemy.

    W /etc/network/interfaces:

    1. Wymień auto eth0się auto br0.
    2. Zastąpić:

      iface eth0 inet dhcp
      

      z:

      iface br0 inet dhcp
          bridge_ports eth0
      

      Jeśli miałeś statyczną konfigurację sieci, zastąpiłbyś:

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

      z:

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

      Jesteś po prostu zmieniając eth0za br0i dodaniebridge_ports eth0 linię.

    3. Uruchom ponownie hosta. Jeśli robisz to lokalnie, to działaj sudo ifdown eth0zanim zaczniesz, a sudo ifup br0potem również. Zwróć uwagę, że most może zająć trochę czasu, więc zaczekaj pięć minut po ponownym uruchomieniu, zanim podejmiesz, że wszystko przepadło.

  3. Aby przenieść podany kontener LXC do publicznego adresu IP:

    1. Zatrzymaj pojemnik.
    2. Na hoście edytuj i zmień na/var/lib/lxc/container_name/configlxc.network.linkbr0 .
    3. Na hoście edytuj i konfiguruj swój publiczny adres IP tak, jak zwykle (DHCP lub konfiguracja statyczna w razie potrzeby). Zauważ, że interfejs jest nadal wywoływany/var/lib/lxc/container_name/rootfs/etc/network/interfaceseth0 z punktu widzenia kontenera.
    4. Uruchom ponownie pojemnik.
  4. Aby zmienić domyślne dla nowych kontenerów LXC, edytuj /etc/lxc/default.confna hoście i zmień lxc.network.linkna br0.

  5. Jeśli nie potrzebujesz wcale mostu NAT dostarczonego przez LXC (tzn. Wszystkie kontenery będą używać nowego mostu), wtedy na hoście edytuj /etc/default/lxci zmień USE_LXC_BRIDGEna "false", a następnie na uruchomieniu hosta sudo service lxc restart.

Robie Basak
źródło
Dzięki! Wokół jest wiele podobnych pytań. Ale ta odpowiedź w końcu pomogła mi zacząć działać.
Mausy5043,
1

Robie, dziękuję bardzo za opublikowanie tej odpowiedzi, staram się, aby moje włosy się rozluźniły i to była jedyna metoda, która zadziałała!

Pomyślałem, że powinienem wymienić kilka rzeczy, które wymyśliłem, aby pomóc w wyjaśnieniu instrukcji dla innych administratorów.

Mój host miał wiele statycznych aliasów ip przypisanych do eth0 na gościu, na przykład:

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

Teraz nie chcemy konfigurować br0 w ten sam sposób, chcemy tylko jednego adresu IP bez aliasów takich jak Robie wskazany powyżej.

Powiedzmy, że chcesz przypisać 5.5.5.5 do kontenera debian8.

Edytuj /var/lib/lxc/debian8/etc/network/interfacesi dodaj:

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

Następnie wydaj polecenie: route add default gw <gateway-ip, in my case 5.5.5.1>

Następnie uruchom ponownie pojemnik i wszystko w końcu powinno działać! :)

Gregory Wolf
źródło
1

Miałem ten sam problem i mam to rozwiązanie (szybkie i brudne).

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)

Na serwerze: route add -host 194.99.99.99 gw 10.255.255.100 dev lxdbr0

W razie potrzeby dodaj trasę do routerów wysyłających.

Prawdopodobnie nie jest to najlepsze rozwiązanie, ale nie wymaga wielkiego wysiłku! Twoje zdrowie.

andrea
źródło