O host do docker CoreOS não pode acessar contêineres por IP; outros computadores em LAN podem

1

Temos um problema que o nosso servidor que hospeda nossos contêineres não consegue acessá-los com seu IP, enquanto outros computadores na rede podem. Nós temos a seguinte configuração para a nossa LAN:

  • Um servidor conectado ao roteador por dois cabos (executando o CoreOS 1068.10.0 e o Docker 1.10.3)
  • Um roteador que conecta o servidor e os clientes
  • Vários computadores-cliente conectados diretamente ao roteador ou por um comutador conectado ao roteador

Nossa rede é assim, super simples:

    |---------|           |---------|           |---------|
    | Docker  |-----------| Router  |-----------| Other computers/
    | Host    |-----------|         |           | NAS/etc |
    |---------|           |---------|           |---------|

Para expor nossos contêineres à nossa rede, seguimos a seguinte resposta: link

Ou seja. os comandos que usamos são estes:

 docker network create \
  --subnet 192.168.0.0/16 \
  --aux-address "DefaultGatewayIPv4=192.168.0.1" \
  --gateway=192.168.1.1 \
  -o com.docker.network.bridge.name=br-internal_lan internal_lan

 sudo brctl addif br-internal_lan eno1
 sudo ip a del 192.168.1.1/16 dev br-internal_lan

Até aí tudo bem. Nosso servidor tem o IP 192.168.0.3 em eno3 , que é o que queremos. eno1 é conectado por um cabo separado ao roteador e é usado para a ponte. A ponte obtém o IP 192.168.0.83. Se então começarmos o nosso container com:

docker run --net=internal_lan -d --ip 192.168.1.0 serverimage:latest

Obtemos o seguinte cenário:

  • Works: pingar contêineres de clientes (e vice-versa)
  • Works: pingar host de clientes (e vice-versa)
  • Obras: ping IP de ponte de contêineres, host, clientes
  • Works: pingar host de contêineres
  • Works: execute docker exec container01 /bin/bash para acessar os contêineres
  • NÃO FUNCIONA: pingar contêineres do host , a perda de pacotes é de 100%

Estas são algumas configurações de amostra do nosso servidor:

ifconfig

br-internal_lan: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 192.168.0.83  netmask 255.255.0.0  broadcast 192.168.255.255
    inet6 fe80::42:8cff:fe30:3b4a  prefixlen 64  scopeid 0x20<link>
    ether 02:42:8c:30:3b:4a  txqueuelen 0  (Ethernet)
    RX packets 430214  bytes 62591783 (59.6 MiB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 4244  bytes 546612 (533.8 KiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet6 fe80::225:90ff:fe5d:6b80  prefixlen 64  scopeid 0x20<link>
    ether 00:25:90:5d:6b:80  txqueuelen 1000  (Ethernet)
    RX packets 829691  bytes 296523943 (282.7 MiB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 78684  bytes 87560787 (83.5 MiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    device memory 0xdf400000-df47ffff

eno3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 192.168.0.3  netmask 255.255.0.0  broadcast 192.168.255.255
    inet6 fe80::225:90ff:fe5d:6b82  prefixlen 64  scopeid 0x20<link>
    ether 00:25:90:5d:6b:82  txqueuelen 1000  (Ethernet)
    RX packets 1744808  bytes 1583970565 (1.4 GiB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 1019186  bytes 1085667196 (1.0 GiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    device memory 0xdf200000-df27ffff

<other interfaces omitted>

rota

default         router.asus.com 0.0.0.0         UG    1024   0        0 eno3
default         router.asus.com 0.0.0.0         UG    1024   0        0 br-internal_lan
172.17.0.0      *               255.255.0.0     U     0      0        0 docker0
192.168.0.0     *               255.255.0.0     U     0      0        0 eno3
192.168.0.0     *               255.255.0.0     U     0      0        0 br-internal_lan
router.asus.com *               255.255.255.255 UH    1024   0        0 eno3
router.asus.com *               255.255.255.255 UH    1024   0        0 br-internal_lan

Nós tentamos alterar /proc/sys/net/ipv4/[eno1,eno3,br-internal_lan]/rp_filter para 2, mas isso não mudou nada (não sei se deveria). /proc/sys/net/ipv4/ip_forward está definido como 1.

O que poderia estar errado com nossa configuração? Como podemos obter acesso por IP aos nossos contêineres? Qualquer ajuda é apreciada, se eu precisar fornecer informações adicionais, por favor, avise-nos.

(Observe que atualmente estamos executando o Docker 1.10.3 (que é a versão mais recente do Docker ao usar o CoreOS estável), portanto, o macvlan não é uma opção para nós.)

    
por Fredrik Kiby Zetterman 07.09.2016 / 12:50

0 respostas