1. 程式人生 > >模擬 Docker網橋連線外網

模擬 Docker網橋連線外網

文章目錄

模擬Docker0網橋

1.建立新的network namespace

sudo ip netns add first

2.建立veth pair

sudo ip link add veth-1 type veth peer name veth-2

3.namespace互聯

sudo ip link set dev veth-2 netns first

4.啟動兩個veth並給veth-2新增IP

sudo ip link set dev veth-1 up
sudo ip netns exec first ip link set dev veth-2 up
sudo ip netns exec first ip addr add 10.0.9.1/24 dev veth-2

5.在root namespace 裡面新增虛擬網橋,啟動網橋,配置IP

sudo ip link add br0 type bridge
sudo ip link set dev br0 up
sudo ip addr add 10.0.9.254/24 dev br0

6.把veth-1跟br0相連

sudo ip link set dev veth-1 master br0

7.在first名稱空間裡面新增預設路由

sudo ip netns exec first ip route add default via 10.0.9.254 dev veth-2

到現在為止,veth-2就可以ping通br0和宿主機上面的物理網口。

8. 新增iptables FORWARD 規則

sudo iptables -A FORWARD --out-interface eth0 --in-interface br0 -j ACCEPT
sudo iptables -A FORWARD --in-interface eth0 --out-interface br0 -j ACCEPT

9.新增iptables NAT 規則

sudo iptables -t nat -A POSTROUTING --source 10.0.9.0/24 --out-interface eth0 -j MASQUERADE

最後到這裡,就可以訪問外網了。

幾個注意點

1.namespace裡面的路由表,必須要新增

sudo ip route add 10.0.9.0/24 via 0.0.0.0 dev veth-2

要不然新增預設路由的時候會出現網路不可達的錯誤。
2.現在dns不能使用,還需要排查一下。
3.從namespace 訪問外網可以,但是從外網訪問namespace還不行,還需要其他的配置。

補充

想要從外網訪問namespace,比如服務等,那麼需要在宿主機上面配置DNAT的規則,比如我在first namespace裡面的8001埠起了一個http服務,那麼怎麼訪問這個服務呢?那麼就需要:

sudo iptables -t nat -A PREROUTING -p tcp --dport 8001 -j DNAT --to-destination 10.0.9.1

因為first裡面的虛擬網絡卡的ip是10.0.9.1,所以–to-destination 寫的是10.0.9.1,–dport就相當於啟動docker映象的時候的 -p 引數:指定宿主機上面的監聽埠,必須在PREROUTING 鏈上面來新增DNAT規則,而且使用tcp。
新增上面那條規則以後,就可以從外面來訪問namespace裡面的服務了。