成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[譯] Docker如何使用Linux iptables 和 Interfaces管理容器網(wǎng)絡(luò)

Prasanta / 1325人閱讀

摘要:使用相同網(wǎng)橋的容器有自己的子網(wǎng),并且可以相互通信默認(rèn)情況下。在虛擬接口上來(lái)自主機(jī)的流量捕獲將顯示容器在特定子網(wǎng)上發(fā)送的所有流量規(guī)則用于阻止不同的網(wǎng)絡(luò)有時(shí)網(wǎng)絡(luò)中的主機(jī)使用過(guò)濾器表進(jìn)行通信。

我使用docker至今已有一段時(shí)間了,與絕大部分的人一樣,我被docker強(qiáng)大的功能和易用性深深的折服。簡(jiǎn)單方便是docker的核心之一,它強(qiáng)大的功能被抽象成了非常簡(jiǎn)單的命令。當(dāng)我在使用和學(xué)習(xí)docker的時(shí)候,我很想知道docker在后臺(tái)都做了一些什么事情,特別是在網(wǎng)絡(luò)這一塊(我最感興趣的一塊)

我找到了很多關(guān)于創(chuàng)建和操作容器網(wǎng)絡(luò)的文檔,但是關(guān)于docker如何使網(wǎng)絡(luò)工作的卻沒(méi)有那么多。 Docker廣泛使用linux iptables和網(wǎng)橋接口,這篇文章是我如何用于創(chuàng)建容器網(wǎng)絡(luò)的總結(jié),大部分信息來(lái)自github上的討論,演示文稿,以及我自己的測(cè)試。文章結(jié)尾我會(huì)給出我認(rèn)為非常有用的資料鏈接。

我寫(xiě)這篇文章使用的是docker 1.12.3,但這不是作為對(duì)docker網(wǎng)絡(luò)的全面描述,也不作為docker網(wǎng)絡(luò)的介紹。我只希望這篇文章能給大家開(kāi)拓視野,也非常感謝所有對(duì)文章錯(cuò)誤,缺失的反饋和批評(píng)。

Docker網(wǎng)絡(luò)概覽

Docker的網(wǎng)絡(luò)建立在允許任何一方編寫(xiě)自己的網(wǎng)絡(luò)驅(qū)動(dòng)程序的容器網(wǎng)絡(luò)模型(CNM)之上。這允許不同的網(wǎng)絡(luò)類型可用于在docker引擎上運(yùn)行的容器,并且容器可以同時(shí)連接到多個(gè)網(wǎng)絡(luò)。除了各種第三方網(wǎng)絡(luò)驅(qū)動(dòng)程序可用,docker自帶四個(gè)內(nèi)置網(wǎng)絡(luò)驅(qū)動(dòng)程序:

Bridge: 這是啟動(dòng)容器的默認(rèn)網(wǎng)絡(luò)。通過(guò)docker主機(jī)上的網(wǎng)橋接口實(shí)現(xiàn)連接。 使用相同網(wǎng)橋的容器有自己的子網(wǎng),并且可以相互通信(默認(rèn)情況下)。

Host:這個(gè)驅(qū)動(dòng)程序允許容器訪問(wèn)docker主機(jī)自己的網(wǎng)絡(luò)空間(容器將看到和使用與docker主機(jī)相同的接口)。

Macvlan:此驅(qū)動(dòng)程序允許容器直接訪問(wèn)主機(jī)的接口或子接口(vlan)。 它還允許中繼鏈接。

Overlay:此驅(qū)動(dòng)程序允許在運(yùn)行docker的多個(gè)主機(jī)(通常是docker群集群)上構(gòu)建網(wǎng)絡(luò)。 容器還具有自己的子網(wǎng)和網(wǎng)絡(luò)地址,并且可以直接相互通信,即使它們?cè)诓煌奈锢碇鳈C(jī)上運(yùn)行。

Bridge和Overlay可能是最常用的網(wǎng)絡(luò)驅(qū)動(dòng)程序,在本文和下一篇文章中我將主要關(guān)注這兩個(gè)驅(qū)動(dòng)程序。

Docker Bridge 網(wǎng)絡(luò)

在docker主機(jī)上運(yùn)行的容器的默認(rèn)網(wǎng)絡(luò)是。 Docker在首次安裝時(shí)創(chuàng)建一個(gè)名為“bridge”的默認(rèn)網(wǎng)絡(luò)。 我們可以列出所有docker網(wǎng)絡(luò)來(lái)查看此網(wǎng)絡(luò) docker network ls

$ docker network ls

NETWORK ID          NAME                DRIVER              SCOPE
3e8110efa04a        bridge              bridge              local
bb3cd79b9236        docker_gwbridge     bridge              local
22849c4d1c3a        host                host                local
3kuba8yq3c27        ingress             overlay             swarm
ecbd1c6c193a        none                null                local

要檢查其屬性,運(yùn)行docker network inspect bridge

$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "3e8110efa04a1eb0923d863af719abf5eac871dbac4ae74f133894b8df4b9f5f",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

你還可以使用docker network create命令并指定選項(xiàng)--driver bridge創(chuàng)建自己的網(wǎng)絡(luò),例如
docker network create --driver bridge --subnet 192.168.100.0/24 --ip-range 192.168.100.0/ 24 my-bridge-network創(chuàng)建另一個(gè)網(wǎng)橋網(wǎng)絡(luò),名稱為“my-bridge-network”,子網(wǎng)為192.168.100.0/24。

Linux 網(wǎng)橋接口

docker創(chuàng)建的每個(gè)網(wǎng)橋網(wǎng)絡(luò)由docker主機(jī)上的網(wǎng)橋接口呈現(xiàn)。、 默認(rèn)橋網(wǎng)絡(luò)“bridge”通常具有與其相關(guān)聯(lián)的接口docker0,并且使用docker network create命令創(chuàng)建的每個(gè)后續(xù)網(wǎng)橋網(wǎng)絡(luò)將具有與其相關(guān)聯(lián)的新接口。

$ ifconfig docker0
docker0   Link encap:Ethernet  HWaddr 02:42:44:88:bd:75
          inet addr:172.18.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

要找到與你創(chuàng)建的docker網(wǎng)絡(luò)關(guān)聯(lián)的linux接口,可以使用ifconfig列出所有接口,然后找到你指定了子網(wǎng)的接口,例如,我們想查看我們之前創(chuàng)建的網(wǎng)橋接口my-bridge-network 我們可以這樣:

$ ifconfig | grep 192.168.100. -B 1
br-e6bc7d6b75f3 Link encap:Ethernet  HWaddr 02:42:bc:f1:91:09
          inet addr:192.168.100.1  Bcast:0.0.0.0  Mask:255.255.255.0

linux橋接接口與交換機(jī)的功能類似,因?yàn)樗鼈儗⒉煌慕涌谶B接到同一子網(wǎng),并根據(jù)MAC地址轉(zhuǎn)發(fā)流量。 我們將在下面看到,連接到網(wǎng)橋網(wǎng)絡(luò)的每個(gè)容器將在docker主機(jī)上創(chuàng)建自己的虛擬接口,并且docker引擎將同一網(wǎng)絡(luò)中的所有容器連接到同一個(gè)網(wǎng)橋接口,這將允許它們與彼此進(jìn)行通信。 您可以使用brctl獲取有關(guān)網(wǎng)橋狀態(tài)的更多詳細(xì)信息。

$ brctl show docker0
bridge name     bridge id               STP enabled     interfaces
docker0         8000.02424488bd75       no

一旦我們有容器運(yùn)行并連接到這個(gè)網(wǎng)絡(luò),我們將看到interfaces列下面列出的每個(gè)容器的接口。 并且在橋接器接口上運(yùn)行流量捕獲將允許我們看到同一子網(wǎng)上的容器之間的相互通信。

Linux 虛擬網(wǎng)絡(luò)接口(veth)

容器網(wǎng)絡(luò)模型(CNM)允許每個(gè)容器具有其自己的網(wǎng)絡(luò)空間。 從容器內(nèi)部運(yùn)行ifconfig將顯示容器內(nèi)部的網(wǎng)絡(luò)接口:

$ docker run -ti ubuntu:14.04 /bin/bash
root@6622112b507c:/#
root@6622112b507c:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:12:00:02
          inet addr:172.18.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe12:2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:9 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:766 (766.0 B)  TX bytes:508 (508.0 B)


lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

然而,上面看到的eth0只能從那個(gè)容器中可用,而在Docker主機(jī)的外部,docker會(huì)創(chuàng)建一個(gè)與其對(duì)應(yīng)的雙虛擬接口,并作為到容器外的鏈接。 這些虛擬接口連接到上面討論的橋接器接口,以便于在同一子網(wǎng)上的不同容器之間的連接。

我們可以通過(guò)啟動(dòng)連接到默認(rèn)網(wǎng)橋的兩個(gè)容器來(lái)查看此過(guò)程,然后查看docker主機(jī)上的接口配置。

在運(yùn)行啟動(dòng)任何容器之前,docker0 橋接接口沒(méi)有連接的接口:

$ sudo brctl show docker0
$ sudo brctl show docker0
bridge name     bridge id               STP enabled     interfaces
docker0         8000.02424488bd75       no

然后我從ubuntu:14.04 鏡像啟動(dòng)2個(gè)容器

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a754719db594        ubuntu:14.04        "/bin/bash"         5 seconds ago       Up 4 seconds                            zen_kalam
976041ec420f        ubuntu:14.04        "/bin/bash"         7 seconds ago       Up 5 seconds                            stupefied_easley

您能馬上看到現(xiàn)在有兩個(gè)接口連接到docker0網(wǎng)橋接口(每個(gè)容器一個(gè))

$ sudo brctl show docker0
bridge name     bridge id               STP enabled     interfaces
docker0         8000.02424488bd75       no              veth2177159
                                                        vethd8e05dd

從其中一個(gè)容器ping到google,然后從docker主機(jī)對(duì)容器的虛擬接口進(jìn)行流量捕獲,將顯示容器流量

$ docker exec a754719db594 ping google.com
PING google.com (216.58.217.110) 56(84) bytes of data.
64 bytes from iad23s42-in-f110.1e100.net (216.58.217.110): icmp_seq=1 ttl=48 time=0.849 ms
64 bytes from iad23s42-in-f110.1e100.net (216.58.217.110): icmp_seq=2 ttl=48 time=0.965 ms

ubuntu@swarm02:~$ sudo tcpdump -i veth2177159 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth2177159, link-type EN10MB (Ethernet), capture size 262144 bytes
20:47:12.170815 IP 172.18.0.3 > iad23s42-in-f14.1e100.net: ICMP echo request, id 14, seq 55, length 64
20:47:12.171654 IP iad23s42-in-f14.1e100.net > 172.18.0.3: ICMP echo reply, id 14, seq 55, length 64
20:47:13.170821 IP 172.18.0.3 > iad23s42-in-f14.1e100.net: ICMP echo request, id 14, seq 56, length 64
20:47:13.171694 IP iad23s42-in-f14.1e100.net > 172.18.0.3: ICMP echo reply, id 14, seq 56, length 64

同樣,我們可以從一個(gè)容器平到另一個(gè)容器。
首先,我們需要獲取容器的IP地址,這可以通過(guò)在容器中運(yùn)行ifconfig或使用docker inspect命令檢查容器來(lái)完成:

$ docker inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" a754719db594 
172.18.0.3 

然后我們從一個(gè)容器ping另一個(gè)容器

$ docker exec 976041ec420f ping 172.18.0.3
PING 172.18.0.3 (172.18.0.3) 56(84) bytes of data.
64 bytes from 172.18.0.3: icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from 172.18.0.3: icmp_seq=2 ttl=64 time=0.053 ms

要從docker主機(jī)看到這個(gè)流量,我們可以在對(duì)應(yīng)于容器的任何一個(gè)虛擬接口上捕獲,或者我們可以在橋接口(在這個(gè)實(shí)例中為docker0)上捕獲,顯示所有的容器間通信子網(wǎng):

$ sudo tcpdump -ni docker0 host 172.18.0.2 and host 172.18.0.3
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on docker0, link-type EN10MB (Ethernet), capture size 262144 bytes
20:55:37.990831 IP 172.18.0.2 > 172.18.0.3: ICMP echo request, id 14, seq 200, length 64
20:55:37.990865 IP 172.18.0.3 > 172.18.0.2: ICMP echo reply, id 14, seq 200, length 64
20:55:38.990828 IP 172.18.0.2 > 172.18.0.3: ICMP echo request, id 14, seq 201, length 64
20:55:38.990866 IP 172.18.0.3 > 172.18.0.2: ICMP echo reply, id 14, seq 201, length 64
定位一個(gè)容器的vet接口

沒(méi)有直接的方法來(lái)找到docker主機(jī)上的哪個(gè)veth接口鏈接到容器內(nèi)的接口,但是在各種docker論壇和github中討論了幾種方法。在我看來(lái)最簡(jiǎn)單的是以下(基于這個(gè)解決方案做了稍微的修改),這也取決于ethtool在容器中可訪問(wèn)

例如:我的系統(tǒng)上運(yùn)行了3個(gè)容器

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ccbf97c72bf5        ubuntu:14.04        "/bin/bash"         3 seconds ago       Up 3 seconds                            admiring_torvalds
77d9f02d61f2        ubuntu:14.04        "/bin/bash"         4 seconds ago       Up 4 seconds                            goofy_borg
19743c0ddf24        ubuntu:14.04        "/bin/sh"           8 minutes ago       Up 8 minutes                            high_engelbart

首先我運(yùn)行如下命令來(lái)獲得peer_ifindex 號(hào)

$ docker exec 77d9f02d61f2 sudo ethtool -S eth0
NIC statistics:
     peer_ifindex: 16

然后在docker主機(jī)上,通過(guò)peer_ifindex 找到接口名稱

$ sudo ip link | grep 16
16: veth7bd3604@if15:  mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default

所以,在目前的情況下,接口名稱是:veth7bd3604

iptables

Docker使用linux iptables來(lái)控制與它創(chuàng)建的接口和網(wǎng)絡(luò)之間的通信。 Linux iptables由不同的表組成,但我們主要關(guān)注兩個(gè):filternat。過(guò)濾器是網(wǎng)絡(luò)或接口的流量的安全規(guī)則表,用于允許或拒絕IP地址,而nat包含負(fù)責(zé)屏蔽IP地址或端口的規(guī)則。Docker使用nat允許橋接網(wǎng)絡(luò)上的容器與docker主機(jī)之外的目的地進(jìn)行通信(否則指向容器網(wǎng)絡(luò)的路由必須在docker主機(jī)的網(wǎng)絡(luò)中添加)

iptables:filter

iptables中的表由對(duì)應(yīng)于處理docker主機(jī)上的數(shù)據(jù)包的不同條件或階段的不同鏈組成。默認(rèn)情況下,過(guò)濾器表具有3個(gè)鏈:用于處理到達(dá)主機(jī)并且去往同一主機(jī)的分組的輸入鏈,用于發(fā)送到外部目的地的主機(jī)的分組的輸出鏈,以及用于進(jìn)入主機(jī)但具有目的地外部主機(jī)。每個(gè)鏈由一些規(guī)則組成,這些規(guī)則規(guī)定對(duì)分組采取一些措施(例如拒絕或接受分組)以及匹配規(guī)則的條件。 順序處理規(guī)則,直到找到匹配項(xiàng),否則應(yīng)用鏈的默認(rèn)策略。 也可以在表中定義自定義鏈。

要查看過(guò)濾器表中鏈的當(dāng)前配置的規(guī)則和默認(rèn)策略,可以運(yùn)行iptables -t filter -L(或iptables -L,如果未指定表,則默認(rèn)使用過(guò)濾器表)

$ sudo iptables -t filter -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:bootps
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootps
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DOCKER-ISOLATION  all  --  anywhere             anywhere
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
Chain DOCKER (3 references)
target     prot opt source               destination
Chain DOCKER-ISOLATION (1 references)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

突出顯示的是不同的鏈,以及每個(gè)鏈的默認(rèn)策略(沒(méi)有自定義鏈的默認(rèn)策略)。 我們還可以看到Docker已經(jīng)添加了兩個(gè)自定義鏈:DockerDocker-Isolation,并且在Forward鏈中插入了以這兩個(gè)新鏈作為目標(biāo)的規(guī)則。

Docker-isolation chain

Docker-isolation包含限制不同容器網(wǎng)絡(luò)之間的訪問(wèn)的規(guī)則。 要查看更多詳細(xì)信息,請(qǐng)?jiān)谶\(yùn)行iptables時(shí)使用-v選項(xiàng)

$ sudo iptables -t filter -L -v
….
Chain DOCKER-ISOLATION (1 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DROP       all  --  br-e6bc7d6b75f3 docker0  anywhere             anywhere
    0     0 DROP       all  --  docker0 br-e6bc7d6b75f3  anywhere             anywhere
    0     0 DROP       all  --  docker_gwbridge docker0  anywhere             anywhere
    0     0 DROP       all  --  docker0 docker_gwbridge  anywhere             anywhere
    0     0 DROP       all  --  docker_gwbridge br-e6bc7d6b75f3  anywhere             anywhere
    0     0 DROP       all  --  br-e6bc7d6b75f3 docker_gwbridge  anywhere             anywhere
36991 3107K RETURN     all  --  any    any     anywhere             anywhere

您可以在上面看到一些刪除規(guī)則,阻止任何由docker創(chuàng)建的橋接接口之間的流量,從而確保容器網(wǎng)絡(luò)不能通信。

icc=false

可以傳遞到docker network create命令的選項(xiàng)之一是com.docker.network.bridge.enable_icc,它代表容器間通信。 將此選項(xiàng)設(shè)置為false會(huì)阻止同一網(wǎng)絡(luò)上的容器彼此通信。 這是通過(guò)在前向鏈中添加一個(gè)丟棄規(guī)則來(lái)實(shí)現(xiàn)的,該丟棄規(guī)則匹配來(lái)自與去往同一接口的網(wǎng)絡(luò)相關(guān)聯(lián)的橋接器接口的分組。

舉個(gè)例子,我們用以下命令創(chuàng)建一個(gè)新的網(wǎng)絡(luò)

docker network create --driver bridge --subnet 192.168.200.0/24 --ip-range 192.168.200.0/24 -o "com.docker.network.bridge.enable_icc"="false" no-icc-network
$ ifconfig | grep 192.168.200 -B 1
br-8e3f0d353353 Link encap:Ethernet  HWaddr 02:42:c4:6b:f1:40
          inet addr:192.168.200.1  Bcast:0.0.0.0  Mask:255.255.255.0

$ sudo iptables -t filter -S FORWARD
-P FORWARD ACCEPT
-A FORWARD -j DOCKER-ISOLATION
-A FORWARD -o br-8e3f0d353353 -j DOCKER
-A FORWARD -o br-8e3f0d353353 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i br-8e3f0d353353 ! -o br-8e3f0d353353 -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
-A FORWARD -o br-e6bc7d6b75f3 -j DOCKER
-A FORWARD -o br-e6bc7d6b75f3 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i br-e6bc7d6b75f3 ! -o br-e6bc7d6b75f3 -j ACCEPT
-A FORWARD -i br-e6bc7d6b75f3 -o br-e6bc7d6b75f3 -j ACCEPT
-A FORWARD -o docker_gwbridge -j DOCKER
-A FORWARD -o docker_gwbridge -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i docker_gwbridge ! -o docker_gwbridge -j ACCEPT
-A FORWARD -o lxcbr0 -j ACCEPT
-A FORWARD -i lxcbr0 -j ACCEPT
-A FORWARD -i docker_gwbridge -o docker_gwbridge -j DROP
-A FORWARD -i br-8e3f0d353353 -o br-8e3f0d353353 -j DROP

iptables:nat

NAT允許主機(jī)更改數(shù)據(jù)包的IP地址或端口。在這種情況下,它用于屏蔽源IP地址來(lái)自docker網(wǎng)絡(luò)(例如172.18.0.0/24子網(wǎng)中的主機(jī)),目的地為容器外,位于docker主機(jī)的IP地址之后的數(shù)據(jù)包。此功能由com.docker.network.bridge.enable_ip_masquerade選項(xiàng)控制,可以在docker network create(如果未指定,則默認(rèn)為true)命令中使用。

你可以在iptables的nat表中看到此命令的效果

$ sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  anywhere             anywhere             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  --  anywhere            !127.0.0.0/8          ADDRTYPE match dst-type LOCAL


Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.18.0.0/16        anywhere
MASQUERADE  all  --  192.168.100.0/24     anywhere
MASQUERADE  all  --  172.19.0.0/16        anywhere
MASQUERADE  all  --  10.0.3.0/24         !10.0.3.0/24


Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

postrouting鏈中,您可以看到在與自己網(wǎng)絡(luò)外部的任何主機(jī)通信時(shí),通過(guò)應(yīng)用偽裝操作創(chuàng)建的所有docker網(wǎng)絡(luò)。

總結(jié)

網(wǎng)橋網(wǎng)絡(luò)在docker主機(jī)上具有對(duì)應(yīng)的linux網(wǎng)橋接口,其作為layer2交換機(jī),并且連接在同一子網(wǎng)上的不同容器。

容器中的每個(gè)網(wǎng)絡(luò)接口在Docker主機(jī)上具有在容器運(yùn)行時(shí)創(chuàng)建的對(duì)應(yīng)虛擬接口。

橋接接口上來(lái)自Docker主機(jī)的流量捕獲等效于在交換機(jī)上配置SPAN端口,可以在該網(wǎng)絡(luò)上查看所有集群間通信。

在虛擬接口(veth- *)上來(lái)自docker主機(jī)的流量捕獲將顯示容器在特定子網(wǎng)上發(fā)送的所有流量

Linux iptables規(guī)則用于阻止不同的網(wǎng)絡(luò)(有時(shí)網(wǎng)絡(luò)中的主機(jī))使用過(guò)濾器表進(jìn)行通信。 這些規(guī)則通常添加在DOCKER-ISOLATION鏈中。

容器通過(guò)橋接接口與外部通信,其IP被隱藏在docker主機(jī)的IP地址后面。 這是通過(guò)向iptables中的nat表添加規(guī)則來(lái)實(shí)現(xiàn)的。

相關(guān)連接

Docker networking concepts

Deep dive into Docker 1.12 Networking

Docker container networking user guide

Linux iptables overview

原文:docker-networking-internals-how-docker

【云盟認(rèn)證成員】: 超兒哥

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/27985.html

相關(guān)文章

  • Docker容器管理

    摘要:容器管理網(wǎng)絡(luò)連接單機(jī)網(wǎng)絡(luò)配置虛擬網(wǎng)橋的特點(diǎn)可以設(shè)置地址相當(dāng)于擁有一個(gè)隱藏的虛擬網(wǎng)卡的地址自動(dòng)劃分分配地址分配地址子網(wǎng)掩碼每一個(gè)主機(jī)都對(duì)應(yīng)一個(gè)容器網(wǎng)卡自定義地址自定義虛擬網(wǎng)橋添加虛擬網(wǎng)橋更改守護(hù)進(jìn)程的啟動(dòng)配置容器互聯(lián)默認(rèn)允許所有容器間互聯(lián) Docker容器管理 Docker網(wǎng)絡(luò)連接 單機(jī)Docker網(wǎng)絡(luò)配置 linux虛擬網(wǎng)橋的特點(diǎn): 可以設(shè)置IP地址 相當(dāng)于擁有一個(gè)隱藏的虛擬網(wǎng)卡...

    hiyayiji 評(píng)論0 收藏0
  • CloudBest:干貨 | 手把手帶你搞定4大容器網(wǎng)絡(luò)問(wèn)題

    摘要:一直以來(lái),網(wǎng)絡(luò)都是容器中令人頭疼的問(wèn)題。本文的主要目的是帶你解決容器網(wǎng)絡(luò)問(wèn)題,讓你不再對(duì)它恐懼。或者,更準(zhǔn)確地說(shuō),是單主機(jī)容器網(wǎng)絡(luò)問(wèn)題。與其創(chuàng)建完全隔離的容器,不如將范圍限制在網(wǎng)絡(luò)堆棧中。一直以來(lái),網(wǎng)絡(luò)都是容器中令人頭疼的問(wèn)題。本文的主要目的是帶你解決容器網(wǎng)絡(luò)問(wèn)題,讓你不再對(duì)它恐懼。使用容器總是感覺(jué)像變魔術(shù)一樣。對(duì)那些了解其內(nèi)部原理的人來(lái)說(shuō),它是一種很好的方式;而對(duì)那些不了解其內(nèi)部原理的人來(lái)...

    Tecode 評(píng)論0 收藏0
  • Docker網(wǎng)絡(luò)

    摘要:容器與主機(jī)共享同一,共享同一套網(wǎng)絡(luò)協(xié)議棧路由表及規(guī)則等?;揪W(wǎng)絡(luò)配置平臺(tái)下,容器網(wǎng)絡(luò)資源通過(guò)內(nèi)核的機(jī)制實(shí)現(xiàn)隔離,不同的有各自的網(wǎng)絡(luò)設(shè)備協(xié)議棧路由表防火墻規(guī)則等,反之,同一下的進(jìn)程共享同一網(wǎng)絡(luò)視圖。設(shè)計(jì)的網(wǎng)絡(luò)模型。 整理自《Docker進(jìn)階與實(shí)戰(zhàn)》 Docker網(wǎng)絡(luò)現(xiàn)狀 為了解決容器網(wǎng)絡(luò)性能低下、功能不足的問(wèn)題,Docker啟動(dòng)了子項(xiàng)目Libnetwork。Libnetwork提出了新的...

    Euphoria 評(píng)論0 收藏0
  • [] 如何在云服務(wù)提供商的平臺(tái)上使用Docker Machine

    摘要:大家好,今天我們來(lái)了解如何使用在各種云服務(wù)提供商的平臺(tái)上部署。是一個(gè)可以幫助我們?cè)谧约旱碾娔X云服務(wù)提供商的平臺(tái)以及我們數(shù)據(jù)中心的機(jī)器上創(chuàng)建機(jī)器的應(yīng)用程序。支持幾個(gè)流行的云平臺(tái),如及其它等等,所以我們可以在不同的平臺(tái)使用相同的接口來(lái)部署。 大家好,今天我們來(lái)了解如何使用Docker Machine在各種云服務(wù)提供商的平臺(tái)上部署Docker。Docker Machine是一個(gè)可以幫助我們?cè)?..

    call_me_R 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<