我有麻烦访问从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