激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

云服務器|WEB服務器|FTP服務器|郵件服務器|虛擬主機|服務器安全|DNS服務器|服務器知識|Nginx|IIS|Tomcat|

服務器之家 - 服務器技術 - 服務器知識 - Docker與iptables及實現bridge方式網絡隔離與通信操作

Docker與iptables及實現bridge方式網絡隔離與通信操作

2021-05-29 23:36yaoshengting 服務器知識

這篇文章主要介紹了Docker與iptables及實現bridge方式網絡隔離與通信操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

Docker提供了bridge, host, overlay等多種網絡。同一個Docker宿主機上同時存在多個不同類型的網絡,位于不同網絡中的容器,彼此之間是無法通信的。

Docker容器的跨網絡隔離與通信,是借助了iptables的機制。

iptables的filter表中默認分為INPUT, FORWARD和OUTPUT共3個鏈。

Docker在FORWARD鏈中(forward到自定義的鏈),還額外提供了自己的鏈,以實現bridge網絡之間的隔離與通信。

Docker的基本網絡配置

Docker與iptables及實現bridge方式網絡隔離與通信操作

當 Docker 啟動時,會自動在主機上創建一個 docker0 虛擬網橋,實際上是 Linux 的一個 bridge,可以理解為一個軟件交換機。它會在掛載到它的網口之間進行轉發。

同時,Docker 隨機分配一個本地未占用的私有網段中的一個地址給 docker0 接口。比如典型的 172.17.0.1,掩碼為 255.255.0.0。此后啟動的容器內的網口也會自動分配一個同一網段(172.17.0.0/16)的地址。

當創建一個 Docker 容器的時候,同時會創建了一對 veth pair 接口(當數據包發送到一個接口時,另外一個接口也可以收到相同的數據包)。

這對接口一端在容器內,即 eth0;另一端在本地并被掛載到 docker0 網橋,名稱以 veth 開頭(例如 veth1)。通過這種方式,主機可以跟容器通信,容器之間也可以相互通信。

Docker 就創建了在主機和所有容器之間一個虛擬共享網絡。

1. Docker在iptables的filter表中的鏈

在Docker 18.05.0(2018.5)及之后的版本中,提供如下4個chain:

DOCKER

DOCKER-ISOLATION-STAGE-1

DOCKER-ISOLATION-STAGE-2

DOCKER-USER

目前,Docker默認對宿主機的iptables設置規則完整一覽,在/etc/sysconfig/iptables文件中

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
##地址轉發表nat中的規則鏈及默認
*nat
#PREROUTING規則鏈默認策略是ACCEPT
:PREROUTING ACCEPT [0:0]
#INPUT規則鏈默認策略是ACCEPT
:INPUT ACCEPT [0:0]
#OUTPUT規則鏈默認策略是ACCEPT
:OUTPUT ACCEPT [4:272]
#POSTROUTING規則鏈默認策略是ACCEPT
:POSTROUTING ACCEPT [4:272]
#DOCKER規則鏈默認策略是ACCEPT
:DOCKER - [0:0]
 
#######################在PREROUTING規則鏈中添加的規則###########################
##-m表示使用擴展模塊進行數據包匹配,到達本機的數據包,如果目標地址類型是本地局域網,則指定到DOCKER鏈
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
 
#######################在OUTPUT規則鏈中添加的規則###########################
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
 
#######################在POSTROUTING規則鏈中添加的規則###########################
##這條規則是為了使容器和外部網絡通信
#將源地址為192.168.0.0/20的包(也就是從Docker容器產生的包),并且不是從docker0網卡發出的
#進行源地址轉換,轉換成主機網卡的地址。
-A POSTROUTING -s 192.168.0.0/20 ! -o docker0 -j MASQUERADE
 
############################在DOCKER規則鏈中添加的規則###########################
#由docker0接口輸入的數據包,返回到調用鏈;-i指定了要處理來自哪個接口的數據包
-A DOCKER -i docker0 -j RETURN
 
###############################################################################
##規則表中的鏈及默認策略
*filter
:INPUT DROP [4:160]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [59:48132]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
 
############################在FORWARD規則鏈中添加的規則###########################
##數據包全部指定到DOCKER-USER鏈
-A FORWARD -j DOCKER-USER
##數據包全部指定到DOCKER-ISOLATION-STAGE-1鏈
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
 
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
##由docker0接口輸出的數據包,指定到DOCKER鏈
-A FORWARD -o docker0 -j DOCKER
##由docker0接口輸入的數據包,且不是由docker0接口輸出的數據包,允許通過
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
##由docker0接口輸入的數據包,且由docker0接口輸出的數據包,允許通過
-A FORWARD -i docker0 -o docker0 -j ACCEPT
 
####################在DOCKER-ISOLATION-STAGE-1規則鏈中添加的規則#################
##由docker0接口輸入的數據包,且不是由docker0接口輸出的數據包,指定到DOCKER-ISOLATION-STAGE-2鏈
##也就是要處理來自docker0的數據包,但是不是由docker0輸出的數據包
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
##數據包直接返回到調用鏈
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
 
####################在DOCKER-ISOLATION-STAGE-2規則鏈中添加的規則#################
##由docker0接口輸出的數據包,丟棄掉
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
##數據包直接返回到調用鏈
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
 
############################在DOCKER-USER規則鏈中添加的規則###########################
##直接返回到調用鏈
-A DOCKER-USER -j RETURN

2. Docker的DOCKER鏈

僅處理從宿主機到docker0的IP數據包。

3. Docker的DOCKER-ISOLATION鏈(隔離在不同的bridge網絡之間的通信)

可以看到,為了隔離在不同的bridge網絡之間的通信,Docker提供了兩個DOCKER-ISOLATION階段實現。

DOCKER-ISOLATION-STAGE-1鏈過濾源地址是bridge網絡(默認docker0)的數據包,匹配的數據包再進入DOCKER-ISOLATION-STAGE-2鏈處理;

不匹配就返回到父鏈FORWARD。

在DOCKER-ISOLATION-STAGE-2鏈中,進一步處理目的地址是bridge網絡(默認是docker0)的數據包,匹配的數據包表示該數據包是從一個bridge網絡的網橋發出,到另一個bridge網絡的網橋,這樣的數據包來自其他bridge網絡,將被直接DROP;

不匹配的數據包就返回到父鏈FORWARD繼續進行后續處理。

4. Docker的DOCKER-USER鏈

Docker啟動時,會加載DOCKER鏈和DOCKER-ISOLATION(現在是DOCKER-ISOLATION-STAGE-1)鏈中的過濾規則,并使之生效。絕對禁止修改這里的過濾規則。

如果用戶要補充Docker的過濾規則,強烈建議追加到DOCKER-USER鏈。

DOCKER-USER鏈中的過濾規則,將先于Docker默認創建的規則被加載(在上面的規則一覽中,DOCKER_USER鏈被最早APPEND到規則鏈中),從而能夠覆蓋Docker在DOCKER鏈和DOCKER-ISOLATION鏈中的默認過濾規則。

例如,Docker啟動后,默認任何外部source IP都被允許轉發,從而能夠從該source IP連接到宿主機上的任何Docker容器實例。如果只允許一個指定的IP訪問容器實例,可以插入路由規則到DOCKER-USER鏈中,從而能夠在DOCKER鏈之前被加載。

示例如下:

?
1
2
3
4
5
6
#只允許192.168.1.1訪問容器
iptables -A DOCKER-USER -i docker0 ! -s 192.168.1.1 -j DROP
#只允許192.168.1.0/24網段中的IP訪問容器
iptables -A DOCKER-USER -i docker0 ! -s 192.168.1.0/24 -j DROP
#只允許192.168.1.1-192.168.1.3網段中的IP訪問容器(需要借助于iprange模塊)
iptables -A DOCKER-USER -m iprange -i docker0 ! --src-range 192.168.1.1-192.168.1.3 -j DROP

5. Docker在iptables的nat表中的規則

為了能夠從容器中訪問其他Docker宿主機,Docker需要在iptables的nat表中的POSTROUTING鏈中插入轉發規則,示例如下:

iptables -t nat -A POSTROUTING -s 172.18.0.0/16 -j MASQUERADE

上述配置,還進一步限制了容器實例的IP范圍,這是為了區分Docker宿主機上有多個bridge網絡的情況。

6. Docker中禁止修改iptables過濾表

dockerd啟動時,參數--iptables默認為true,表示允許修改iptables路由表。

要禁用該功能,可以有兩個選擇:

設置啟動參數--iptables=false

修改配置文件/etc/docker/daemon.json,設置"iptables": "false";然后執行systemctl reload docker重新加載

補充知識:docker網絡模式之 default bridge模式

上文提到,docker的網絡模式一共有五種,birdge 、host 、overlay、nacvlan、none、Network plugin 六種模式,這里主要介紹網橋(bridge)默認橋接模式。

一、簡介

在網絡概念中,橋接網絡是一種鏈路層設備,它在網絡段之間轉發通信。網橋是運行在主機內核上的一個硬件設備或者軟件設備。在docker中,橋接網絡是使用軟件橋接,連接到同一橋接網絡上的容器直接可相互通信,而且是全端口的,而與未連接到該橋接網絡的容器直接隔離,如此,橋接網絡管理同一主機上所有容器的連接與隔離。docker的橋接驅動程序自動在主機上安裝規則,同一網橋上的網絡可相互通信,不同網橋網絡容器相互隔離。

橋接網絡適用于同一主機docker daemon生成的容器,對于不同主機daocker daemon的容器間交互,要么使用操作系統級的路由操作,要么使用overlay網絡驅動。

當我們啟動docker時,systemctl start docker, 一個默認的橋接網絡(birbr0)將自動被創建,連接docker daemon 與宿主機器,同時創建一個網絡docker0,后續生產的容器將自動連接到該橋接網絡(docker0)上。我們可查看本地網橋 , 每創建一個容器,將新建一個橋接,連接容器與默認的橋接網絡。

?
1
2
3
4
5
[root@localhost hadoop]# brctl show
bridge name   bridge id        STP enabled   interfaces
docker0     8000.0242b47b550d    no
virbr0     8000.52540092a4f4    yes       virbr0-nic
[root@localhost hadoop]#

網橋 virbr0 連接docker0與宿主機器,在網橋上創建了接口virbr0-nic,該接口接收docker0網絡的數據。每生成一個容器,在docker0上新建一個接口,并且docker0的地址被設置成容器的網關。

?
1
2
3
4
5
6
7
8
9
[root@localhost hadoop]# docker run --rm -tdi nvidia/cuda:9.0-base
[root@localhost hadoop]# docker ps
CONTAINER ID    IMAGE         COMMAND       CREATED       STATUS       PORTS        NAMES
9f9c2b80062f    nvidia/cuda:9.0-base  "/bin/bash"     15 seconds ago   Up 14 seconds              quizzical_mcnulty
[root@localhost hadoop]# brctl show
bridge name   bridge id        STP enabled   interfaces
docker0     8000.0242b47b550d    no       vethabef17b
virbr0     8000.52540092a4f4    yes       virbr0-nic
[root@localhost hadoop]#

查看本地網絡 信息 ifconfig -a

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
[root@localhost hadoop]# ifconfig -a
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
    inet 192.168.0.1 netmask 255.255.240.0 broadcast 192.168.15.255
    inet6 fe80::42:b4ff:fe7b:550d prefixlen 64 scopeid 0x20<link>
    ether 02:42:b4:7b:55:0d txqueuelen 0 (Ethernet)
    RX packets 37018 bytes 2626776 (2.5 MiB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 46634 bytes 89269512 (85.1 MiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
 
eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
    inet 192.168.252.130 netmask 255.255.255.0 broadcast 192.168.252.255
    ether 00:25:90:e5:7f:20 txqueuelen 1000 (Ethernet)
    RX packets 14326014 bytes 17040043512 (15.8 GiB)
    RX errors 0 dropped 34 overruns 0 frame 0
    TX packets 10096394 bytes 3038002364 (2.8 GiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    device memory 0xfb120000-fb13ffff
 
eth1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
    ether 00:25:90:e5:7f:21 txqueuelen 1000 (Ethernet)
    RX packets 0 bytes 0 (0.0 B)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 0 bytes 0 (0.0 B)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    device memory 0xfb100000-fb11ffff
 
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
    inet 127.0.0.1 netmask 255.0.0.0
    inet6 ::1 prefixlen 128 scopeid 0x10<host>
    loop txqueuelen 0 (Local Loopback)
    RX packets 3304 bytes 6908445 (6.5 MiB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 3304 bytes 6908445 (6.5 MiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
 
oray_vnc: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1200
    inet 172.1.225.211 netmask 255.0.0.0 broadcast 172.255.255.255
    ether 00:25:d2:e1:01:00 txqueuelen 500 (Ethernet)
    RX packets 1944668 bytes 227190815 (216.6 MiB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 2092320 bytes 2232228527 (2.0 GiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
 
vethabef17b: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
    inet6 fe80::e47d:4eff:fe87:39d3 prefixlen 64 scopeid 0x20<link>
    ether e6:7d:4e:87:39:d3 txqueuelen 0 (Ethernet)
    RX packets 0 bytes 0 (0.0 B)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 8 bytes 648 (648.0 B)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
 
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
    inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
    ether 52:54:00:92:a4:f4 txqueuelen 0 (Ethernet)
    RX packets 0 bytes 0 (0.0 B)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 0 bytes 0 (0.0 B)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
 
virbr0-nic: flags=4098<BROADCAST,MULTICAST> mtu 1500
    ether 52:54:00:92:a4:f4 txqueuelen 500 (Ethernet)
    RX packets 0 bytes 0 (0.0 B)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 0 bytes 0 (0.0 B)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

docker 結合網橋與路由規則,設置同一宿主機器內,各容器間交互,docker 容器橋接網絡驅動下,網絡接入方式如下圖所示:

Docker與iptables及實現bridge方式網絡隔離與通信操作

如果啟動容器時,指定了端口映射,將內部端口 80 映射到主機端口8080,也可0.0.0.0:8080方式,指定網卡,如下

docker run --rm -ti -p 8080:80 nvidia/cuda:9.0-base

然后查看路由表,

iptables -t nat -vnL

可看到增加了路由轉發規則:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@localhost hadoop]# iptables -t nat -vnL
Chain PREROUTING (policy ACCEPT 55 packets, 2470 bytes)
 pkts bytes target   prot opt in   out   source        destination    
 161K 8056K PREROUTING_direct all -- *   *    0.0.0.0/0      0.0.0.0/0     
 161K 8056K PREROUTING_ZONES_SOURCE all -- *   *    0.0.0.0/0      0.0.0.0/0     
 161K 8056K PREROUTING_ZONES all -- *   *    0.0.0.0/0      0.0.0.0/0     
  0   0 DOCKER   all -- *   *    0.0.0.0/0      0.0.0.0/0      ADDRTYPE match dst-type LOCAL
 
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target   prot opt in   out   source        destination    
 
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target   prot opt in   out   source        destination    
 3442 258K OUTPUT_direct all -- *   *    0.0.0.0/0      0.0.0.0/0     
  0   0 DOCKER   all -- *   *    0.0.0.0/0      !127.0.0.0/8     ADDRTYPE match dst-type LOCAL
 
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target   prot opt in   out   source        destination    
  0   0 MASQUERADE all -- *   !docker0 192.168.0.0/20    0.0.0.0/0     
  0   0 RETURN   all -- *   *    192.168.122.0/24   224.0.0.0/24   
  0   0 RETURN   all -- *   *    192.168.122.0/24   255.255.255.255  
  0   0 MASQUERADE tcp -- *   *    192.168.122.0/24  !192.168.122.0/24   masq ports: 1024-65535
  0   0 MASQUERADE udp -- *   *    192.168.122.0/24  !192.168.122.0/24   masq ports: 1024-65535
  0   0 MASQUERADE all -- *   *    192.168.122.0/24  !192.168.122.0/24
 3442 258K POSTROUTING_direct all -- *   *    0.0.0.0/0      0.0.0.0/0     
 3442 258K POSTROUTING_ZONES_SOURCE all -- *   *    0.0.0.0/0      0.0.0.0/0     
 3442 258K POSTROUTING_ZONES all -- *   *    0.0.0.0/0      0.0.0.0/0     
  0   0 MASQUERADE tcp -- *   *    192.168.0.3     192.168.0.3     tcp dpt:80
 
Chain DOCKER (2 references)
 pkts bytes target   prot opt in   out   source        destination    
  0   0 RETURN   all -- docker0 *    0.0.0.0/0      0.0.0.0/0     
  0   0 DNAT    tcp -- !docker0 *    0.0.0.0/0      0.0.0.0/0      tcp dpt:8080 to:192.168.0.3:80

默認的端口類型為 TCP。

二、容器間訪問配置

首先啟動兩個容器,然后進入到容器內,查看個容器IP信息,

?
1
2
3
4
5
[root@localhost hadoop]# docker ps
CONTAINER ID    IMAGE         COMMAND       CREATED       STATUS       PORTS         NAMES
462751a70444    nvidia/cuda:9.0-base  "/bin/bash"     17 minutes ago   Up 17 minutes    0.0.0.0:8080->80/tcp  sad_heyrovsky
9f9c2b80062f    nvidia/cuda:9.0-base  "/bin/bash"     41 minutes ago   Up 41 minutes               quizzical_mcnulty
[root@localhost hadoop]#

我這里啟動兩個容器,然后調用 docker inspect 容器ID 查看容器IP

docker inspect -f {{.NetworkSettings.IPAddress}} 容器ID

我們這兩個容器 為 192.168.0.2 192.168.0.3

進入其中的一個容器, ping 另外一臺機器,會發現,僅僅只能采用地址模式才能ping的通 ping 192.168.0.3,

docker exec -ti 9f9c2b80062f /bin/bash

如果采用在/etc/hosts內追加 別名, 然后ping 名字,發現無法ping通。

192.168.0.3 node1

至于原因,下篇將繼續講解用戶自定義橋接網絡,解決該問題。

以上這篇Docker與iptables及實現bridge方式網絡隔離與通信操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://princeyao.blog.csdn.net/article/details/102651969

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品亚洲免费 | 天天舔夜夜操 | 日本大片在线播放 | 国产精品一品二区三区四区18 | 亚洲婷婷日日综合婷婷噜噜噜 | 色黄视频免费观看 | 国产欧美日韩在线不卡第一页 | 国产精品成人免费一区久久羞羞 | 国产精品免费小视频 | 久久久久久久国产a∨ | 夜夜b| 黄色网址在线免费 | 国产精品区一区二区三区 | 91av在线国产| 免费看综艺策驰影院 | 综合欧美一区二区三区 | 精品国内视频 | 日日草夜夜| 国产女同玩人妖 | 九色一区二区 | 欧美日韩一区,二区,三区,久久精品 | 成人羞羞视频在线观看 | 成人免费一区二区三区视频网站 | 91精品国产一区二区三区四区在线 | 中文字幕一二区 | 7m视频成人精品分类 | 久久久久久久一区二区 | 国产免费一级淫片a级中文 99国产精品自拍 | 一区二区三区四区精品 | 日韩视频网址 | 欧美视频不卡 | 国产精品福利一区 | 美女污污视频在线观看 | 精品一区二区久久久 | 一区二区三区四区视频在线观看 | 国产伦久视频免费观看视频 | 毛片大全在线观看 | 狠狠久久伊人中文字幕 | 欧美三级短视频 | 日本一区视频在线播放 | 国产在线一级片 |