七天用Go寫個docker(網路篇)

pibigstar發表於2021-02-08

0.docker網路實現

docker網路分為兩部分,一部分是docker與宿主機之間的通訊,另一部分是docker與外部網路之間的通訊。docker與宿主機之前的通過是通過veth和bridge虛擬網路介面實現的,而與外部網路通訊是通過 iptables 流量轉發實現的。

1. veth和bridge

veth是一個虛擬的網路裝置,它都是成對出現的,你可以把它理解成馬里奧裡面的水管,馬里奧從一個水管進去,會從另一個水管裡面出來,在這裡,馬里奧就是流量,這兩個水管就是一對veth,我們看下實際操作

  1. 先建立兩個網路namespace

    ip netns add ns1
    ip netns add ns2
  2. 建立一對Veth

    ip link add veth1 type veth peer name veth2
  3. 為網路ns1和ns2設定veth

    ip link set veth1 netns ns1
    ip link set veth2 netns ns2
  4. 設定 veth1、veth2的網路地址

    ip netns exec ns1 ifconfig veth1 172.15.0.1/24 up
    

ip netns exec ns2 ifconfig veth2 172.15.0.2/24 up


5. 將ns1的流量預設從veth1中流出
> default代表0.0.0.0/0 即在ns1中的流量都經過veth1的網路裝置流出
```bash
ip netns exec ns1 route add default dev veth1

通過上面5步,我們就將一頭水管(veth1)安在了 ns1 上,另一頭水管(veth2)安在了 ns2 上,並且設定了ns1的流量從veth1中流出,這樣從ns1裡面流出的流量都會經過veth1流向veth2, 也就是流到 ns2上。這樣就實現了ns1和ns2的網路互通。

測試一下,我們在ns1中去ping ns2的ip地址看是否可以ping通

可以看到,已經完全可以ping通了,證明通過veth我們已經將這兩個隔離的namespace的網路打通了。

bridge

bridge也就是網橋,它是一個非常簡單的玩意,你可以把它理解成一個交換機,只不過它只有兩個口,並且是一個虛擬的網路裝置。

  1. 建立一個網橋
    brctl addbr br0
  2. 掛載網路裝置
    brctl addif br0 eth0
    brctl addif br0 veth1
  3. 配置路由規則
    # 將宿主機上的某個網段請求路由到br0的網橋上
    route add –net 172.15.0.2/24 dev br0
    我們將網橋br0一端掛在了eth0網路卡上,另一端掛在了 veth1 上這樣流量就能從宿主機流到我們的隔離的ns1上

2. iptables

解決了容器的namesepace與宿主機之間的通訊,我們看下如何解決ns與外部網路的通訊,我們知道,ns的ip地址是我們自己定義的,這樣當ns去訪問外部網路時,外部網路是不認識這個請求包裡面的源地址的,而外部網路也沒辦法去訪問我們ns裡面的ip地址,因為它只認識我們宿主機的ip地址。這時我們就需要用到iptables了。

2.1 MASQUERADE

iptables中的MASQUERADE功能可以幫助我們更改請求包的源地址,這樣當ns請求外部網路時,我們把源地址改成我們宿主機的是不是就可以了,看下實際配置:

  1. 開啟ip轉發
    sysctl -w net.ipv4.conf.all.forwarding=1
  2. 對ns1中發出的包新增地址轉換(更換源地址)
    iptables -t nat -A POSTROUTING -s 172.15.0.0/24 -o eth0 -j MASQUERADE

2.2 DNAT

iptables中的DNAT功能可以修改我們請求包的目的地址,並將請求轉發到我們目的地址上面,這樣當外部網路訪問我們宿主機的某個埠時,我們將該包的目標地址改成我們ns的地址,直接轉發到我們ns裡面是不是就可以了,看下實際配置:

將宿主機上80埠的請求轉發到ns1的ip上

iptables -t nat -A POSTROUTING -p tcp —dport 80 -j DNAT —to destination 172.15.0.1:80
附言

以上內容都是我自己的理解,如果理解的有偏差歡迎大家一起留言討論,針對 iptables 我後續會出一系列教程教大家如何使用這個神器,後續文章都會首發於我微信公眾號,歡迎大家關注

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章