Rede do Docker desabilitada: AVISO: o encaminhamento de IPv4 está desabilitado. A rede não vai funcionar

106

Os contêineres em um host "repentinamente" perdem a conexão com os contêineres do mundo externo. No entanto, alguns hosts foram atualizados e de repente tivemos a seguinte situação:

  1. O host pode se comunicar com outros hosts.
  2. Os contêineres em execução no host não podem se comunicar com outros hosts.

Aqui está um exemplo:

[root@pprdespap322 deploy]# ping ci.docker.company.net
PING pprdespap324.corp.company.net (10.137.55.22) 56(84) bytes of data.
64 bytes from pprdespap324.corp.company.net (10.137.55.22): icmp_seq=1 ttl=64 time=0.282 ms
64 bytes from pprdespap324.corp.company.net (10.137.55.22): icmp_seq=2 ttl=64 time=0.341 ms
^C
--- pprdespap324.corp.company.net ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.282/0.311/0.341/0.034 ms

Agora, do próprio contêiner, não podemos executar ping no mesmo host:

[root@pprdespap322 deploy]# docker run -ti quay.io/coreos/registry ping ci.docker.company.net
WARNING: IPv4 forwarding is disabled. Networking will not work.
ping: unknown host ci.docker.company.net

A primeira vez que vi esse aviso foi nas versões iniciais do Docker ... Tendo Docker 1.9.1 e 1.10.3, como resolver este problema?

Marcello de Sales
fonte

Respostas:

177

Eu revisei http://chrisgilmerproj.github.io/ubuntu/network/docker/2013/09/05/ipv4-forwarding-and-docker.html e me ajudou a resolver o problema no host.

Eu adicionei o seguinte a /etc/sysctl.conf :

net.ipv4.ip_forward=1

Em seguida, reiniciei o serviço de rede e validei a configuração:

[root@pprdespap322 deploy]#  systemctl restart network
[root@pprdespap322 deploy]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
[root@pprdespap322 deploy]# docker run -ti quay.io/coreos/registry ping ci.docker.company.net
PING pprdespap324.corp.company.net (10.137.55.22) 56(84) bytes of data.
64 bytes from pprdespap324.corp.company.net (10.137.55.22): icmp_seq=1 ttl=63 time=0.329 ms
64 bytes from pprdespap324.corp.company.net (10.137.55.22): icmp_seq=2 ttl=63 time=0.306 ms
^C
--- pprdespap324.corp.company.net ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.306/0.317/0.329/0.021 ms

Todos os containers agora podem se comunicar com containers externos!

Marcello de Sales
fonte
15
No Ubuntu eu precisei sudo sysctl -precarregar as configurações (systemctl não foi encontrado).
Nacho Coloma de
2
Esta solução era necessária no Centos 7 ao simplesmente tentar acessar o contêiner do host (para teste).
Dave C de
Estou tendo semelhante em contêineres em execução em um host Windows (no Hyper-V). Existe uma configuração semelhante em algum lugar para o Windows?
Anthony Mastrean
4
mas POR QUE é necessário? a rede está funcionando perfeitamente sem encaminhamento, portanto, o docker também não deve exigi-lo ...
user3338098
2
@ user3338098, porque a rede interna subjacente está encaminhando o tráfego entre as interfaces para obter acesso à Internet. Isso foi necessário para indicar a qualquer sistema Linux que ele deve rotear o tráfego entre as interfaces da maneira que um roteador de rede faz há muito tempo. Isso é desativado por padrão porque a maioria das máquinas Linux não faz encaminhamento e encaminhar o tráfego acidentalmente seria uma ameaça à segurança na pior das hipóteses ou realmente complicaria a sua rede.
Josiah
25

Tente reiniciar o serviço Docker.

Por exemplo, para Ubuntu:

$ sudo systemctl restart docker

DmitrySandalov
fonte
5
No CentOS7, esse problema apareceu de repente e simplesmente reiniciar o serviço docker funcionou perfeitamente.
steven87vt
1
Isso funcionou, me deixa nervoso por não saber por que funcionou. Alguém tem uma pista? Ou pelo menos passos para repetir a falha?
Josiah
reprodução? Aconteceu aqui depois de atualizar o Docker e reinicializar (no Oracle Linux Server versão 7.8 com kernel: - 3.10.0-1127.el7.x86_64 # 1 SMP Quarta-feira 1 de abril 10:20:09 PDT 2020 x86_64 x86_64 x86_64 GNU / Linux - atualizar Docker para: docker-ce-3: 19.03.8-3.el7.x86_64 via yum repo: @ docker-ol7-prod)
JohannesB
Funciona, obrigado! Mas alguém sabe como funcionou?
c0degeas
17

Tente adicionar --network=hostjunto com o docker runcomando para corrigir isso.

https://medium.com/@gchandra/docker-ipv4-forwarding-is-disabled-8499ce59231e

Ganesh Chandrasekaran
fonte
2
Útil para um único contêiner em execução. O parâmetro é--net=host
Max13
1
Agora, o problema com essa abordagem é se você tiver vários contêineres em execução em paralelo, como no Jenkins, as portas são compartilhadas e você corre o risco de ter problemas nessas portas compartilhadas. Para ser específico, estamos executando testes e2e com o Cypress e estamos tendo problemas com o Xvfb que não consegue gerar uma nova instância porque as portas já estão em uso.
Alex Rashkov
1

Resolvi meu problema ao reiniciar a rede.

systemctl restart network
Cristiano Kubiaki
fonte