Ponte de contêineres LXC para hospedar eth0 para que eles possam ter um IP público

8

ATUALIZAR:

Encontrei a solução lá: http://www.linuxfoundation.org/collaborate/workgroups/networking/bridge#No_traffic_gets_trough_.28except_ARP_and_STP.29

 # cd /proc/sys/net/bridge
 # ls
 bridge-nf-call-arptables  bridge-nf-call-iptables
 bridge-nf-call-ip6tables  bridge-nf-filter-vlan-tagged
 # for f in bridge-nf-*; do echo 0 > $f; done

Mas eu gostaria de ter opiniões de especialistas sobre isso: é seguro desativar todo o bridge-nf- *? Para que eles estão aqui?

FIM DA ATUALIZAÇÃO

Preciso conectar os contêineres LXC à interface física (eth0) do meu host, lendo vários tutoriais, documentos e postagens do blog sobre o assunto.

Eu preciso que os contêineres tenham seu próprio IP público (que eu já fiz no KVM / libvirt).

Após dois dias de pesquisa e tentativa, ainda não consigo fazê-lo funcionar com contêineres LXC.

O host executa um Ubuntu Server Quantal recém-instalado (12.10) com apenas libvirt (que não estou usando aqui) e o lxc instalado.

Criei os contêineres com:

lxc-create -t ubuntu -n mycontainer

Então eles também rodam o Ubuntu 12.10.

O conteúdo de / var / lib / lxc / mycontainer / config é:


lxc.utsname = mycontainer
lxc.mount = /var/lib/lxc/test/fstab
lxc.rootfs = /var/lib/lxc/test/rootfs


lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.name = eth0
lxc.network.veth.pair = vethmycontainer
lxc.network.ipv4 = 179.43.46.233
lxc.network.hwaddr= 02:00:00:86:5b:11

lxc.devttydir = lxc
lxc.tty = 4
lxc.pts = 1024
lxc.arch = amd64
lxc.cap.drop = sys_module mac_admin mac_override
lxc.pivotdir = lxc_putold

# uncomment the next line to run the container unconfined:
#lxc.aa_profile = unconfined

lxc.cgroup.devices.deny = a
# Allow any mknod (but not using the node)
lxc.cgroup.devices.allow = c *:* m
lxc.cgroup.devices.allow = b *:* m
# /dev/null and zero
lxc.cgroup.devices.allow = c 1:3 rwm
lxc.cgroup.devices.allow = c 1:5 rwm
# consoles
lxc.cgroup.devices.allow = c 5:1 rwm
lxc.cgroup.devices.allow = c 5:0 rwm
#lxc.cgroup.devices.allow = c 4:0 rwm
#lxc.cgroup.devices.allow = c 4:1 rwm
# /dev/{,u}random
lxc.cgroup.devices.allow = c 1:9 rwm
lxc.cgroup.devices.allow = c 1:8 rwm
lxc.cgroup.devices.allow = c 136:* rwm
lxc.cgroup.devices.allow = c 5:2 rwm
# rtc
lxc.cgroup.devices.allow = c 254:0 rwm
#fuse
lxc.cgroup.devices.allow = c 10:229 rwm
#tun
lxc.cgroup.devices.allow = c 10:200 rwm
#full
lxc.cgroup.devices.allow = c 1:7 rwm
#hpet
lxc.cgroup.devices.allow = c 10:228 rwm
#kvm
lxc.cgroup.devices.allow = c 10:232 rwm

Então mudei meu host / etc / network / interfaces para:


auto lo
iface lo inet loopback

auto br0
iface br0 inet static
        bridge_ports eth0
        bridge_fd 0
        address 92.281.86.226
        netmask 255.255.255.0
        network 92.281.86.0
        broadcast 92.281.86.255
        gateway 92.281.86.254
        dns-nameservers 213.186.33.99
        dns-search ovh.net

Quando tento a configuração da linha de comando ("brctl addif", "ifconfig eth0" etc.), meu host remoto fica inacessível e eu preciso reiniciá-lo.

Alterei o conteúdo de / var / lib / lxc / mycontainer / rootfs / etc / network / interfaces para:


auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 179.43.46.233
        netmask 255.255.255.255
        broadcast 178.33.40.233
        gateway 92.281.86.254

Leva alguns minutos para o mycontainer iniciar (lxc-start -n mycontainer).

Eu tentei substituir

        gateway 92.281.86.254
de :

        post-up route add 92.281.86.254 dev eth0
        post-up route add default gw 92.281.86.254
        post-down route del 92.281.86.254 dev eth0
        post-down route del default gw 92.281.86.254

Meu contêiner então inicia instantaneamente.

Mas qualquer que seja a configuração que eu defina em / var / lib / lxc / mycontainer / rootfs / etc / network / interfaces, não consigo executar ping do mycontainer para nenhum IP (incluindo o host):


ubuntu@mycontainer:~$ ping 92.281.86.226 
PING 92.281.86.226 (92.281.86.226) 56(84) bytes of data.
^C
--- 92.281.86.226 ping statistics ---
6 packets transmitted, 0 received, 100% packet loss, time 5031ms

E meu host não pode executar ping no contêiner:


root@host:~# ping 179.43.46.233
PING 179.43.46.233 (179.43.46.233) 56(84) bytes of data.
^C
--- 179.43.46.233 ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 4000ms

O ifconfig do meu contêiner:


ubuntu@mycontainer:~$ ifconfig
eth0      Link encap:Ethernet  HWaddr 02:00:00:86:5b:11  
          inet addr:179.43.46.233  Bcast:255.255.255.255  Mask:0.0.0.0
          inet6 addr: fe80::ff:fe79:5a31/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:64 errors:0 dropped:6 overruns:0 frame:0
          TX packets:54 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:4070 (4.0 KB)  TX bytes:4168 (4.1 KB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:32 errors:0 dropped:0 overruns:0 frame:0
          TX packets:32 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2496 (2.4 KB)  TX bytes:2496 (2.4 KB)

O ifconfig do meu host:


root@host:~# ifconfig
br0       Link encap:Ethernet  HWaddr 4c:72:b9:43:65:2b  
          inet addr:92.281.86.226  Bcast:91.121.67.255  Mask:255.255.255.0
          inet6 addr: fe80::4e72:b9ff:fe43:652b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1453 errors:0 dropped:18 overruns:0 frame:0
          TX packets:1630 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:145125 (145.1 KB)  TX bytes:299943 (299.9 KB)

eth0      Link encap:Ethernet  HWaddr 4c:72:b9:43:65:2b  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3178 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1637 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:298263 (298.2 KB)  TX bytes:309167 (309.1 KB)
          Interrupt:20 Memory:fe500000-fe520000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:300 (300.0 B)  TX bytes:300 (300.0 B)

vethtest  Link encap:Ethernet  HWaddr fe:0d:7f:3e:70:88  
          inet6 addr: fe80::fc0d:7fff:fe3e:7088/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:54 errors:0 dropped:0 overruns:0 frame:0
          TX packets:67 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:4168 (4.1 KB)  TX bytes:4250 (4.2 KB)

virbr0    Link encap:Ethernet  HWaddr de:49:c5:66:cf:84  
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Eu desativei o lxcbr0 (USE_LXC_BRIDGE = "false" em / etc / default / lxc).


root@host:~# brctl show
bridge name     bridge id               STP enabled     interfaces                                                                                                 
br0             8000.4c72b943652b       no              eth0                                                                                                       
                                                        vethtest        

Eu configurei o IP 179.43.46.233 para apontar para 02: 00: 00: 86: 5b: 11 no painel de configuração do meu provedor de hospedagem (OVH).
(Os IPs nesta postagem não são os reais.)

Obrigado por ler esta longa pergunta! :-)

Vianney

Vianney Stroebel
fonte

Respostas:

6

Uma maneira melhor de tornar sua alteração permanente é usar o sysctl em vez de gravar diretamente no / proc, pois essa é a maneira padrão de configurar os parâmetros do kernel em tempo de execução, para que sejam definidos corretamente na próxima inicialização:

# cat >> /etc/sysctl.d/99-bridge-nf-dont-pass.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
net.bridge.bridge-nf-filter-vlan-tagged = 0
EOF
# service procps start

Quanto à resposta para a pergunta na sua atualização ...

O bridge-netfilter (ou bridge-nf) é uma ponte muito simples para pacotes IPv4 / IPv6 / ARP (mesmo em cabeçalhos 802.1Q VLAN ou PPPoE) que fornece a funcionalidade para um firewall transparente com estado, mas funcionalidades mais avançadas como NAT IP transparente são fornecido ao passar esses pacotes para arptables / iptables para processamento adicional - no entanto, mesmo que os recursos mais avançados do arptables / iptables não sejam necessários, a passagem de pacotes para esses programas ainda está ativada por padrão no módulo do kernel e deve ser desativada explicitamente usando sysctl.

Para que eles estão aqui? Essas opções de configuração do kernel estão aqui para passar (1) ou não (0) pacotes para arptables / iptables, conforme descrito na FAQ da bridge-nf :

As of kernel version 2.6.1, there are three sysctl entries for bridge-nf behavioral control (they can be found under /proc/sys/net/bridge/):
bridge-nf-call-arptables - pass (1) or don't pass (0) bridged ARP traffic to arptables' FORWARD chain.
bridge-nf-call-iptables - pass (1) or don't pass (0) bridged IPv4 traffic to iptables' chains.
bridge-nf-call-ip6tables - pass (1) or don't pass (0) bridged IPv6 traffic to ip6tables' chains.
bridge-nf-filter-vlan-tagged - pass (1) or don't pass (0) bridged vlan-tagged ARP/IP traffic to arptables/iptables.

É seguro desativar todo o bridge-nf- *? Sim, não é apenas seguro fazê-lo, mas há uma recomendação de distribuições para desativá-lo por padrão para ajudar as pessoas a evitar confusão quanto ao tipo de problema que você encontrou:

Na prática, isso pode causar sérias confusões quando alguém cria uma ponte e descobre que algum tráfego não está sendo encaminhado pela ponte. Como é tão inesperado que as regras do firewall IP se aplicam aos quadros em uma ponte, pode levar algum tempo para descobrir o que está acontecendo.

e para aumentar a segurança :

Eu ainda acho que o risco com a ponte é maior, especialmente na presença de virtualização. Considere o cenário em que você tem duas VMs em um host, cada uma com uma ponte dedicada com a intenção de que nenhuma delas saiba nada sobre o tráfego da outra.

Com o conntrack sendo executado como parte da ponte, o tráfego agora pode atravessar o que é uma grave falha de segurança.

ATUALIZAÇÃO: maio de 2015

Se você estiver executando um kernel anterior a 3.18, poderá estar sujeito ao antigo comportamento de filtragem de ponte ativado por padrão; se você tem mais de 3.18, ainda poderá ser mordido por isso se tiver carregado o módulo bridge e não tiver desativado a filtragem de pontes. Vejo:

https://bugzilla.redhat.com/show_bug.cgi?id=634736#c44

Depois de todos esses anos solicitando que o padrão da filtragem de ponte seja "desabilitado" e a alteração sendo recusada pelos mantenedores do kernel, agora a filtragem foi movida para um módulo separado que não é carregado (por padrão) quando o módulo de ponte é carregado, efetivamente tornando o padrão "desativado". Yay!

Eu acho que isso está no kernel a partir do 3.17 (ele definitivamente está no kernel 3.18.7-200.fc21 e parece estar no git antes da tag "v3.17-rc4")

aculich
fonte
0

Eu tenho uma configuração semelhante executando em um hypervisor Debian Wheezy. Não precisei modificar / etc / network / interfaces nos rootfs do contêiner; ter lxc.network. * configurado na configuração do LXC é suficiente.

Você deve conseguir fazer a ponte funcionar independentemente de estar executando um contêiner ou não. Eu tenho as seguintes configurações definidas em br0 em / etc / network / interfaces no host:

% grep bridge /etc/network/interfaces
  bridge_ports eth0
  bridge_fd 0
  bridge_stp off
  bridge_waitport 0
  bridge_maxwait 0

Depois de configurar isso e mover minha configuração de endereço IP de eth0 para br0, sudo service networking restartreconfigurei as interfaces de forma transparente na minha máquina host sem descartar a sessão SSH.

Feito isso, tente remover a configuração 'eth0' em / etc / network / interfaces e reinicie seu contêiner.

Murali Suriar
fonte