问题的要点是,如果我创建并运行一个docker容器(从任何图像,我尝试了很多)容器没有外部网络访问权限超出 Docker 创建的默认桥;即使使用 IP 地址(而不是 URL/名称)。
IE
docker run --rm -it busybox ping 8.8.8.8
由于无法访问网络而挂起/失败docker run --rm -it busybox ping 172.17.0.1
也失败了(注意这172.17.0.1
是docker0
主机上的 IP,也是容器中 docker 设置的网关)- 如果我创建两个容器,我可以从另一个容器中 ping 通其中一个容器(因为它们都连接到了 Docker 桥)
主机网络连接正常(我可以 ping 出去等)。此外,当我运行 时docker run --network host --rm -it busybox ping 8.8.8.8
,它会到达服务器并及时响应。
这不是一个ping
问题:traceroute
和wget
也失败了。(它们会因 IP 地址和 URL 而失败;即使主机和容器中的apt-get update
DNS 服务器都正常。)/etc/resolv.conf
注意:
我有两个 Ubuntu 主机(相同版本),都运行 Docker 19.03.6。在其中一台(开发机)上我没有遇到这个问题(它运行正常),在另一台上遇到了。这意味着它很可能不是操作系统和/或 Docker 版本问题,而是某种配置错误。
这是不是我发现大多数问题都提到了 DNS 问题。事实上,这根本不是 DNS 问题。当我使用直接 IP 地址以及 URL 时,它就会出现。
iptables
我在主机上使用。这些是(来自iptables-save
)在它不起作用的地方的规则(它们在网络工作正常的开发机器上有所不同,但我无法在这里设置相同的规则):
# Generated by iptables-save v1.6.0 on Wed Apr 15 23:14:15 2020
*nat
:PREROUTING ACCEPT [14467:1224366]
:INPUT ACCEPT [479:21744]
:OUTPUT ACCEPT [249:15752]
:POSTROUTING ACCEPT [249:15752]
:DOCKER - [0:0]
COMMIT
# Completed on Wed Apr 15 23:14:15 2020
# Generated by iptables-save v1.6.0 on Wed Apr 15 23:14:15 2020
*filter
:INPUT DROP [4360:696740]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [9497:1567380]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
:f2b-postfix-sasl - [0:0]
:f2b-sshd - [0:0]
:fail2ban-ssh - [0:0]
-A INPUT -p tcp -m multiport --dports 25,465,587,220,993,110,995 -j f2b-postfix-sasl
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p udp -m udp --sport 123 -m state --state ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 465 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 465 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 587 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o eth0 -j ACCEPT
-A FORWARD -i eth0 -o docker0 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 123 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --dport 465 -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
-A f2b-postfix-sasl -j RETURN
-A f2b-sshd -j RETURN
-A fail2ban-ssh -j RETURN
-A fail2ban-ssh -j RETURN
COMMIT
# Completed on Wed Apr 15 23:14:15 2020
我尝试停止dockerd
,手动删除与docker相关的规则,然后重新启动守护进程。它重新创建了相同的规则,问题仍然存在。
我不是一名iptables
巫师,所以这可能是一个近乎琐碎的问题,或者与 iptables 完全无关的问题 ;/。
我不确定还需要添加什么来澄清。
我应该怎么办?
答案1
我在 ubuntu 18.04.4 LTS(pc1)上的 docker 19.03.8 桥接网络方面遇到了同样的问题,最终我设法解决了它。
我让 docker 在另一台电脑(pc2)上运行,该电脑也使用 ubuntu 18.04.4 LTS,但使用的是 docker 19.03.5。
我比较了 IPTABLES - 出于某种原因,在我尝试修复问题的过程中,我遗漏了一些规则。我现在在 pc1 上使用的规则是:
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
sudo iptables -N DOCKER
sudo iptables -N DOCKER-ISOLATION-STAGE-1
sudo iptables -N DOCKER-ISOLATION-STAGE-2
sudo iptables -N DOCKER-USER
sudo iptables -A FORWARD -j DOCKER-USER
sudo iptables -A FORWARD -j DOCKER-ISOLATION-STAGE-1
sudo iptables -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -o docker0 -j DOCKER
sudo iptables -A FORWARD -i docker0 ! -o docker0 -j ACCEPT
sudo iptables -A FORWARD -i docker0 -o docker0 -j ACCEPT
sudo iptables -A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
sudo iptables -A DOCKER-ISOLATION-STAGE-1 -j RETURN
sudo iptables -A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
sudo iptables -A DOCKER-ISOLATION-STAGE-2 -j RETURN
sudo iptables -A DOCKER-USER -j RETURN
我还删除了sudo rm /etc/docker/daemon.json
(与 VPN 存在一些冲突,并且我之前已更改了 bip)。最后一步是:sudo service docker restart
结果:
$ docker run --rm -it busybox ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=54 time=9.479 ms
64 bytes from 8.8.8.8: seq=1 ttl=54 time=7.697 ms
^C
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 7.697/8.588/9.479 ms