Konfigurowanie zmostkowanych kontenerów LXC ze statycznymi adresami IP

15

Próbuję skonfigurować wiele kontenerów LXC na hoście, każdy z własnymi publicznymi statycznymi adresami IP.

Na moim hoście działa najnowsza wersja Ubuntu. Ma pojedynczy interfejs sieciowy o nazwie eth0. Statyczne adresy IP są pingowane z Internetu i noszą nazwy eth0: 210, eth0: 211 ... Liczby po dwukropku są najmniej znaczącym bajtem adresów. Oprócz tych interfejsów mam konfigurację br0 na publicznym adresie IP hosta. Istnieją również interfejsy lo, veth2LPP9A i lxcbr0. Lxcbr0 ma adres prywatnego adresu IP.

Interfejs host / etc / network / wygląda następująco:

auto br0
iface br0 inet static
        bridge_ports eth0
        bridge_fd 0
        [...]

Do tej pory korzystałem z różnych źródeł online, w tym z kontenerów Bridging LXC do hostowania eth0, aby mogli mieć publiczny adres IP, który pomoże mi to skonfigurować.

Plik konfiguracyjny kontenera zawiera:

lxc.network.type = veth
lxc.network.link = br0

Usunąłem z tego pliku statyczną konfigurację lxc.network.ipv4, ponieważ spowodowała problemy. Kiedy uruchomiłem lxc-ls - fantazyjne w tej konfiguracji, zobaczyłem dwa razy ten sam publiczny adres IP na wyjściu. Ponadto bałagan z konfiguracją podsieci / etc / network / interfaces kontenera.

Mówiąc o pliku interfejsów kontenera, wygląda to trochę tak:

auto eth0
iface eth0 inet static
        address [...]
        netmask 255.255.255.255
        #gateway [...]
        dns-nameservers 8.8.8.8

        post-up route add [...] dev eth0
        post-up route add default gw [...]
        post-down route del [...] dev eth0
        post-down route del default gw [...]

Musiałem skomentować bramę i dodać polecenie trasy dodaj do tego pliku. W przeciwnym razie uruchomienie kontenera zajmie kilka minut.

Wszystkie pliki / proc / sys / net / bridge / bridge-nf- * na hoście są ustawione na 0. Wartość / proc / sys / net / ipv4 / ip_forward wynosi 1.

Problem w tym, że chociaż „route -n” kontenera wygląda tak, jak powinno, nie mogę pingować z kontenera. SSHing do adresu IP kontenera łączy mnie z hostem.

EDYCJA: Usunięcie statycznego adresu IP kontenera z hosta pomogło, ale teraz pojawia się nowy błąd. Próba pingowania kontenera z hosta powoduje przekierowanie HostFrom, New nexthop. Pakiety wielokrotnie przechodzą od bramki do hosta. Uruchomienie traceroute z hosta pokazuje, że pierwszy przystanek znajduje się w bramie. Wszystkie pozostałe trasy to * * *. Mam ten sam problem niezależnie od tego, czy kontener jest online, czy nie.

Kabel Ethernet
źródło

Odpowiedzi:

17

W rzeczywistości można ustawić adres i bramę od wewnątrz do hosta i skonfigurować pojemnik, aby nie dotknąć interfejs w ogóle za pomocą słowa kluczowego manual.

Umieść to wśród gości /etc/network/interfaces:

auto eth0
iface eth0 inet manual

Pozostaw także plik konfiguracyjny kontenera, aby skonfigurować interfejs:

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxc-bridge-nat
lxc.network.ipv4 = 192.168.100.16/24
lxc.network.ipv4.gateway = auto

Gość będzie zachowywał się tak, jakby BIOS już skonfigurował interfejs i po prostu go używał.

Szczególnie odkrywaj lxc.network.ipv4.gateway.

sebastianwagner
źródło
Dzięki! To uratowało mi życie ... mój kontener zawsze próbował uzyskać nowy adres dhcp ... ustawienie go na stałą wartość w kontenerze (statycznym) powodowało, że kontener nawet się nie uruchamia!
Dominik Dorn,
Pamiętaj, że nie działa to dobrze, jeśli host jest zawieszony i wznowiony. Lxc kontynuuje przydzielanie adresu IP, ale host uważa, że ​​nie ma już adresu IP. Odkryłem, że lepiej jest skonfigurować dnsmasq dla lxc-net i podać tam stały adres.
HRJ,
@HRJ - W komentarzu lub linku do referencji należy umieścić „jak”, a nie tylko „zrób to”. To jest strona techniczna i powinieneś powiedzieć coś naprawdę użytecznego.
Ian Macintosh,
2
Wygląda na to, że właściwym miejscem do tego jest zarówno plik / etc / default / lxc, w którym możesz ustawić swój zakres (patrz LXC_DHCP_RANGE), jak i /etc/dnsmasq.d-available/lxc zgodnie z dokumentami dnsmasq lub manpage
Ian Macintosh
4

Ponieważ jesteś pomostowych, trzeba ustawić adresy IP w pojemniku tylko , a nie na komputerze. Host powinien mieć tylko własny adres (adresy) IP.

Michael Hampton
źródło
2

Właśnie zrobiłem to z Ubuntu 14.04. To jest proste. Musisz tylko edytować /etc/network/interfacesplik w kontenerze i ustawić to:

auto eth0
iface eth0 inet static
 address $IP
 netmask $NETMASK
 gateway $GW
 dns-nameservers $DNS

Zastąp każdą zmienną żądaną wartością.

Ty NIE trzeba robić nic innego!

PS: Zwróć uwagę na spację przed niektórymi liniami. Jest to obowiązkowe

Namiot Enrique Moreno
źródło
Spowodowało to, że mój kontener już się nie uruchamia (serwer Ubuntu 14.04) .. Odpowiedź sebastianwagner działa dla mnie.
Dominik Dorn,
2

Najlepszym sposobem, jaki znajduję i najszybszym, jest użycie profili lxc

lxc profile list - polecenie listy wszystkich profili, które masz Następnie

lxc profile copy default minecraft(to jest nazwa twojego nowego profilu)

Następnie lxc profile edit minecraft

To się pojawi

devices:
  eth0:
    ipv4.address: 192.168.1.114/24  - add this line and enter any ip address you like
    name: eth0
    nictype: macvlan - this is my setting
    parent: enp0s25
    type: nic
  root:
    path: /
    pool: lxc_zfs
    type: disk
name: mine
used_by:

następnie zapisz to

następnie przypisz profil do swojego kontenera LXC w ten sposób

lxc profile assign YOUR_CONTAINER_NAME YOUR_NEW_PROFILE_NAME

następnie ponownie uruchom kontener, a nowy adres IP zostanie ustawiony na ten kontener

Jayferret
źródło
1

Mógłbym poprawnie skonfigurować moje pojemniki LXC po podążeniu za odpowiedzią @Enrique Moreno Tent, więc wyjaśnię, co robić bardziej szczegółowo, na wypadek, gdybyś nie wiedział, jak skonfigurować inne przedmioty.

1. Uzyskaj dostęp do kontenera LXC za pomocą lxc-attachpolecenia

Komenda:

$ lxc-attach -n YOUR-CONTAINER-NAME

2. Zobacz swoje obecne konfiguracje za pomocą ifconfig

Komenda

root@mycontainer:~# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.3.160  netmask 255.255.255.0  broadcast 10.0.3.255
        inet6 fe80::216:3eff:fec9:2fa0  prefixlen 64  scopeid 0x20<link>
        ether 00:16:3e:c9:2f:a0  txqueuelen 1000  (Ethernet)
        RX packets 62  bytes 7142 (7.1 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 60  bytes 9788 (9.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 20285  bytes 175021803 (175.0 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 20285  bytes 175021803 (175.0 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

``

3. Uzyskiwanie adresu, maski sieci i bramy

Widząc wynik ifconfigpowyższego polecenia, widzimy:

Adres to żądany adres, możesz go zmienić na 10.0.3.166.

Maska sieci jest tam: 255.255.255.0

Brama : W przypadku bramy, której używasz adresu rozgłoszeniowego, tutaj jest 10.0.3.255

Jak widać powyżej, obecnie masz wszystkie informacje potrzebne do wypełnienia gościa (kontenera) /etc/network/interfaces.

4. Uzyskiwanie dns-nameserverswartości.

Wydaj polecenie:

cat /etc/resolv.conf

Ale może najlepiej jest używać Google DNS, który docenia 8.8.8.8i8.8.4.4

5. Edycja /etc/network/interfacesWEWNĄTRZ POJEMNIKA

auto eth0 iface eth0 inet static address 10.0.3.166 netmask 255.255.255.0 gateway 10.0.3.255 dns-nameservers 8.8.8.8

Iacchus
źródło
ifconfigzostał zastąpiony nowszymiip a wersjami debian / ubuntu linuxconfig.org/…
rvazquezglez