Iptables规则集,以便Docker容器可以访问主机IP上的服务

我有麻烦访问从docker集装箱的主机专用接口(IP)。 我相当肯定,这是关系到我的Iptables规则(或者路由)。 当我添加--net=host标志docker run ,一切正常。 同样,当我指定INPUT策略遵循宽泛的-P INPUT ACCEPT ,事情也按我的预期工作。 然而,这些是我不想要的和不安全的选项,我想避免。

由于它不是特定于我的服务(DNS),所以我排除了这个问题,因为与docker结合search会在不同的(stream行的)问题区域中生成search结果,从而增加search结果的噪音。

也链接的Docker容器不是一个可行的select,因为某些容器需要运行与–net =主机选项,防止链接,我想在可能的情况下创build一个一致的情况。

我有以下的Iptables规则。 我假设的是CoreOS,Digital Ocean和Docker的组合。

 -P INPUT DROP -P FORWARD ACCEPT -P OUTPUT ACCEPT -N DOCKER -A INPUT -i lo -j ACCEPT -A INPUT -i eth1 -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT -A FORWARD -o docker0 -j DOCKER -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i docker0 ! -o docker0 -j ACCEPT -A FORWARD -i docker0 -o docker0 -j ACCEPT 

我的(相关)主机接口:

 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 inet 10.129.112.210/16 brd 10.129.255.255 scope global eth1 valid_lft forever preferred_lft forever 4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default inet 172.17.42.1/16 scope global docker0 valid_lft forever preferred_lft forever 

我运行一个docker集装箱:

 $ docker run --rm -it --dns=10.129.112.210 debian:jessie # Specifying the DNS is so that the public DNS servers aren't used. 

在这一点上,我想能够使用本地服务,绑定在10.129.112.210:53。 所以下面应该回答:

 $ ping google.com ^C $ ping user.skydns.local ^C 

当我从主机运行相同的命令时:

 $ ping photo.skydns.localPING photo.skydns.local (10.129.112.206) 56(84) bytes of data. 64 bytes from 10.129.112.206: icmp_seq=1 ttl=64 time=0.790 ms ^C 

我的resolv.conf

 $ cat /etc/resolv.conf nameserver 10.129.112.210 nameserver 127.0.0.1 nameserver 8.8.8.8 nameserver 8.8.4.4 

这里的重点不是访问公共主机,而是访问内部主机,使用主机上可用的本地DNS服务(通过另一个docker实例)。

为了进一步说明(我的ascii艺术devise技能超过了我的iptables fu,所以在这一点上应该说够了):

  ______________________________________________ | __________________________ Host | | | Docker DNS container | | | ``````````````````````|``` | | | | | ,----------,---( private n. interface ) | | | | | | | | ( public n. interface )--- | | | | | | | ( loopbck n. interface ) | | | | | | | | | | | __|_______________________ | | | | Docker service container | | | | `````````````````````````` | | | | | | | | [ Local host service using DNS. ] | | | |______________________________________________| private (host) network interface: eth1 (10.129.0.0/16) Docker network interface: docker0 (172.17.0.0/16) 

我已经search,阅读并应用了不同的示例Iptablesconfiguration,但是我对“更先进”的Iptables规则知之甚less,无法理解正在发生什么,从而得到期望的结果。

iptables -t nat -nL输出iptables -t nat -nL

 Chain PREROUTING (policy ACCEPT) target prot opt source destination DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0 Chain DOCKER (2 references) target prot opt source destination 

cat /proc/sys/net/ipv4/ip_forward

 1 

    容器使用docker0接口与主机通信。 要允许来自容器的stream量添加:

     -A INPUT -i docker0 -j ACCEPT