Configurando contêineres LXC em ponte com IPs estáticos

15

Estou tentando configurar vários contêineres LXC em um host, cada um com seus próprios IPs estáticos públicos.

Meu host está executando o Ubuntu mais recente. Ele tem uma única interface de rede chamada eth0. Os IPs estáticos são pingáveis ​​da Internet e são nomeados eth0: 210, eth0: 211 ... Os números após os dois pontos são o byte menos significativo dos endereços. Além dessas interfaces, tenho a configuração br0 no IP público do host. Existem também as interfaces lo, veth2LPP9A e lxcbr0. O lxcbr0 tem o endereço de um IP privado.

O host / etc / network / interfaces se parece com:

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

Até agora, eu usei várias fontes online, incluindo Bridging LXC containers para hospedar eth0, para que eles possam ter um IP público para me ajudar a configurar isso.

O arquivo de configuração do contêiner possui:

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

Eu removi a configuração estática do lxc.network.ipv4 deste arquivo, pois causava problemas. Quando executei lxc-ls --fancy com essa configuração, veria o mesmo IP público duas vezes na saída. Além disso, interferiria na configuração de sub-rede das interfaces / etc / network / do contêiner.

Falando no arquivo de interfaces do contêiner, ele se parece um pouco com:

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 [...]

Eu tive que comentar o gateway e adicionar os comandos route add neste arquivo. Caso contrário, o contêiner levaria alguns minutos para inicializar.

Os arquivos / proc / sys / net / bridge / bridge-nf- * no host estão todos definidos como 0. O valor / proc / sys / net / ipv4 / ip_forward é 1.

O problema é que, embora a "rota-n" do contêiner pareça como deveria, não consigo executar ping no contêiner. SSHing para o que deveria ser o IP do contêiner, me conecta ao host.

EDIT: Remover o IP estático do contêiner do host ajudou, mas agora estou recebendo um novo erro. Tentar executar ping no contêiner do host resulta em Redirect HostFrom, New nexthop. Os pacotes estão apenas indo do gateway para o host, repetidamente. A execução de um traceroute a partir do host mostra que a primeira parada está no gateway. Todas as outras rotas são * * *. Eu recebo o mesmo problema, independentemente de o contêiner estar online ou não.

Cabo Ethernet
fonte

Respostas:

17

Na verdade, você pode definir o endereço e o gateway de dentro do host e configurar o contêiner para não tocar na interface, usando a palavra-chave manual.

Coloque isso entre os convidados /etc/network/interfaces:

auto eth0
iface eth0 inet manual

Também deixe que o arquivo de configuração do contêiner configure a interface:

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

O convidado se comportará como se o BIOS já configurasse a interface e apenas a usasse.

Especialmente explorar lxc.network.ipv4.gateway.

sebastianwagner
fonte
Valeu! Isso salvou minha vida ... meu contêiner sempre tentaria obter um novo endereço dhcp ... configurá-lo para um valor fixo dentro do contêiner (estático) fazia com que o contêiner nem inicializasse mais!
Dominik Dorn
Observe que isso não funciona bem se o host for suspenso e retomado. O lxc continua com o endereço IP alocado, mas o host acha que não tem mais um endereço IP. Eu descobri que é melhor configurar o dnsmasq para lxc-net e distribuir um endereço fixo lá.
HRJ
@HRJ - Você deve incluir o 'como' no seu comentário ou link para o juiz, em vez de apenas dizer 'fazer'. Este é um site técnico e você deve dizer algo realmente útil.
21815 Ian Macintosh
2
Parece que o local correto para fazer isso é em / etc / default / lxc, onde você pode definir seu intervalo (consulte LXC_DHCP_RANGE) e em /etc/dnsmasq.d-available/lxc conforme os documentos ou a página de manual do dnsmasq
Ian Macintosh
4

Desde que você está bridging, você precisa definir os endereços IP no recipiente única , e não no host. O host deve ter apenas seu próprio endereço IP.

Michael Hampton
fonte
2

Eu fiz isso outro dia com o Ubuntu 14.04. É simples Você só precisa editar o /etc/network/interfacesarquivo dentro do seu contêiner e definir isso:

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

Substitua todas as variáveis ​​pelo valor desejado.

Você não precisa fazer mais nada!

PS: Observe o espaço antes de algumas linhas. É obrigatório.

Tenda Enrique Moreno
fonte
isso resultou no meu contêiner não inicializando mais (servidor ubuntu 14.04) .. a resposta do sebastianwagner funciona para mim.
Dominik Dorn
2

A melhor maneira de encontrar e o mais rápido é usar os perfis lxc

lxc profile list - comande a lista de todos os perfis que você tem

lxc profile copy default minecraft(este é o nome do seu novo perfil)

Então lxc profile edit minecraft

Isso vai aparecer

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:

então salve

Em seguida, atribua o perfil ao seu contêiner LXC como este

lxc profile assign YOUR_CONTAINER_NAME YOUR_NEW_PROFILE_NAME

basta reiniciar o contêiner e seu novo endereço IP é definido para esse contêiner

Jayferret
fonte
1

Eu poderia configurar corretamente meus contêineres lxc depois de seguir a resposta da @Enrique Moreno Tent, então explicarei o que fazer com mais detalhes, caso você não saiba como configurar os outros itens.

1. Acesse seu contêiner LXC via lxc-attachcomando

Comando:

$ lxc-attach -n YOUR-CONTAINER-NAME

2. Veja suas configurações atuais com ifconfig

Comando

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. Obtendo endereço, máscara de rede e gateway

Vendo o resultado do ifconfigcomando acima, vemos então:

Endereço é o endereço que você deseja, você pode alterá-lo para 10.0.3.166.

A máscara de rede está lá: 255.255.255.0

Gateway : para o gateway em que você usa o endereço de broadcast, aqui é 10.0.3.255

Como você pode ver acima, atualmente você tem todas as informações necessárias para preencher seu convidado (contêiner) /etc/network/interfaces.

4. Obtendo dns-nameserversvalor.

Emita o comando:

cat /etc/resolv.conf

Mas talvez seja melhor usar o Google DNS, que asre 8.8.8.8e8.8.4.4

5. Edição /etc/network/interfacesDENTRO DO RECIPIENTE

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
fonte
ifconfigfoi substituído pelas ip aversões mais recentes do debian / ubuntu linuxconfig.org/…
rvazquezglez