用nat设置docker容器

时间:2014-05-23 00:22:02

标签: containers iptables docker nat

我正在设置两个泊坞容器

     container1                 container2
     |        |                     |
    eth0     eth1                   |
     |        |                    eth1
   docker0   docker1<----------------
     |            
     |
   internet

docker0和docker1是桥梁。

我在主机和容器中都有ip转发为1。 我已经设置了

iptables -I POSTROUTING -t nat -o eth0 -j MASQUERADE in container 1

仍然我无法ping从容器2到互联网的任何东西。我可以看到正在容器1的eth1接收数据包。

OS: ubuntu 13.10
docker version: 0.11.1, build fb99f99

我错过了一些配置吗?

重现的步骤:

SERV=$(docker run --privileged=true -i -d -t -v ~/Projects/code/myproject/build:/build:ro debian:7.4 /bin/bash)
CLI=$(docker run --privileged=true -i -d -t -v ~/Projects/code/myproject/build:/build:ro debian:7.4 /bin/bash)
sudo pipework br1 $SERV 10.1.0.1/8
sudo pipework br1 $CLI 10.1.0.3/8 

在$ SERV中:    iptables -I POSTROUTING -t nat -o eth0 -j MASQUERADE

在$ CLI中    禁用接口eth0。设置eth1接口的缺省路由。

现在ping正在从$ CLI发生到10.1.0.1但不发生在互联网上。

2 个答案:

答案 0 :(得分:0)

嗯,它应该像你描述的那样工作。可能未正确配置默认路由。 这就是我所做的:

SERV=$(docker run -i --privileged -d -t debian:7.4 /bin/bash)
CLI=$(docker run --privileged -i -d -t debian:7.4 /bin/bash)

docker exec -ti $CLI ping google.de  # Internet up

docker exec -ti $CLI ip link set eth0 down
docker exec -ti $CLI ping google.de  # Internet down

pipework br1 $SERV 10.1.0.1/8
pipework br1 $CLI 10.1.0.2/8

docker exec -ti $SERV apt-get install -y iptables
docker exec -ti $SERV iptables -I POSTROUTING -t nat -o eth0 -j MASQUERADE
docker exec -ti $CLI ip route add default via 10.1.0.1 dev eth1
docker exec -ti $CLI ping google.de  # Internet up

docker exec -ti $CLI apt-get install -y traceroute
docker exec -ti $CLI traceroute google.de

答案 1 :(得分:0)

更改iptables的唯一方法是从使用

运行的容器上的Docker主机执行

- 特权

这是一个脚本:

在图像构建期间安装了iptables以及一些工具(Dcokerfile) inetutils-traceroute iputils-tracepath iptables

我在这里使用&#34; phusion-dockerbase&#34;,你可以使用你想要的任何图像:

#!/bin/bash

### ==> Install & configure iptable during build
#RUN sudo apt-get install -y inetutils-traceroute iputils-tracepath iptables
# Build the image 
#sudo docker build -t mybimage -f phusion-dockerbase .

### container1
C1=$(docker run --privileged -i -d -t mybimage /bin/bash)
sudo docker exec -ti $C1 iptables -I POSTROUTING -t nat -o eth0 -j MASQUERADE
sleep 2
sudo pipework br6 -i eth1 $C1 192.168.66.1/24

### container2
lxterminal -e "sudo docker run -ti --name c2name mybimage /bin/bash"
sleep 2
C2="$(sudo docker ps | grep c2name | awk '{ print $1; }')"
sudo pipework br6 -i eth1 $C2 192.168.66.2/24@192.168.66.1

结果:

./lab.sh

从Container1(我使用lxterminal在新窗口中打开它):

From container1

请注意,一旦停止container1,相应的管道和iptable修改就会丢失,即使重新启动已停止的容器,也需要重新发出命令:

pipework br6 -i eth1 52b95d6052f7 192.168.66.1/24

docker exec 52b95d6052f7 iptables -I POSTROUTING -t nat -o eth0 -j MASQUERADE

让container1像nat box一样再次行动。

即使将正在运行的container1提交到新图像并从中运行新容器,也无济于事。