模擬 Docker網橋連線外網
阿新 • • 發佈:2018-11-26
文章目錄
模擬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裡面的服務了。