iptables规则破坏了Docker容器之间的通信

nginx-proxy是一个Docker容器,充当其他容器的反向代理。 它使用Docker API来检测其他容器并自动代理它们的stream量。

我有一个简单的nginx代理设置:(其中subdomain.example.com被replace为我的域)

 docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy docker run -e VIRTUAL_HOST=subdomain.example.com kdelfour/cloud9-docker 

当我closures防火墙时,它没有问题。 当我打开防火墙时,我得到了来自nginx的504网关超时错误。 这意味着我可以在端口80上看到nginx,但是我的防火墙规则似乎限制了容器到容器和/或Docker API的stream量。

我创build了一个GitHub的问题 ,但nginx-proxy的创build者说,他从来没有遇到过这个问题。

这些是“防火墙closures”规则:(这些工作)

 iptables -F iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT 

这些是我的“防火墙”规则:(这些不起作用)

 # Based on tutorial from http://www.thegeekstuff.com/scripts/iptables-rules / http://www.thegeekstuff.com/2011/06/iptables-rules-examples/ # Delete existing rules iptables -F # Set default chain policies iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP # Allow loopback access iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # Allow inbound/outbound SSH iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT # Allow inbound/outbound HTTP iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT # Allow inbound/outbound HTTPS iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT # Ping from inside to outside iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT # Ping from outside to inside iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT # Allow outbound DNS iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT # Allow outbound NTP iptables -A OUTPUT -p udp -o eth0 --dport 123 -j ACCEPT iptables -A INPUT -p udp -i eth0 --sport 123 -j ACCEPT # This bit is from https://blog.andyet.com/2014/09/11/docker-host-iptables-forwarding # Docker Rules: Forward chain between docker0 and eth0. iptables -A FORWARD -i docker0 -o eth0 -j ACCEPT iptables -A FORWARD -i eth0 -o docker0 -j ACCEPT ip6tables -A FORWARD -i docker0 -o eth0 -j ACCEPT ip6tables -A FORWARD -i eth0 -o docker0 -j ACCEPT iptables-save > /etc/network/iptables.rules 

为什么在启用防火墙时代理服务器不工作?

感谢Joel C的建议(参见上面的评论),FORWARD链中存在一个问题,我这样解决:

iptables -A FORWARD -i docker0 -j ACCEPT