日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

iptables限制docker端口禁止對某臺主機進行提供服務

作者:星光落入哥哥眼里 更新時間: 2022-07-19 編程語言

前言
在Linux上docker映射了端口,想著對服務端口進行限制指定IP訪問,發現在filter表的INPUT鏈限制無效。

[root@ext100 ~]# iptables -L -nv --line-numbers
Chain INPUT (policy ACCEPT 200K packets, 8397K bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 DROP       tcp  --  *      *       192.168.4.200        0.0.0.0/0            tcp dpt:443

分析
Docker容器啟動防火墻上的變動
如果暴露本機端口,在nat表的DOCKER鏈上增加一條規則

DNAT tcp -- !<docker-network> 0.0.0.0/0 0.0.0.0/0 tcp dpt:<dest port> to:<new address>:<new port>

可以通過命令sudo iptables -t nat -nvL DOCKER查看。通過在nat表增加規則來drop掉所有訪問容器暴露端口的連接
最后處理結果如下:

[root@ext100 ~]# iptables -L -nv --line-numbers
Chain DOCKER (2 references)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 DROP       tcp  --  *      *       192.168.4.202        0.0.0.0/0            tcp
2        3   180 DROP       tcp  --  *      *       192.168.4.200        0.0.0.0/0            tcp
3        2   120 DROP       tcp  --  *      *       192.168.4.200        0.0.0.0/0            tcp dpt:443
4        0     0 ACCEPT     tcp  --  !br-9c0d36154c4e br-9c0d36154c4e  0.0.0.0/0            172.18.0.11          tcp dpt:6379

知識

Configure the daemon and containers
在Linux上,Docker操縱iptables提供網絡隔離的規則。雖然這是一個實現細節,您不應該修改Docker插入到您的iptables政策,如果你想在Docker管理的政策之外擁有自己的政策,它確實對你需要做的事情有一些影響。
如果您在一臺暴露于互聯網的主機上運行Docker,那么您可能希望有iptables策略來防止對容器或其他在您的主機上運行的服務的未授權訪問。
在這里插入圖片描述

在Docker規則之前添加iptables策略

Docker安裝了兩個定制的iptables鏈,名為DOCKER-USER和DOCKER,它確保傳入的數據包總是首先由這兩個鏈檢查。

Docker的所有iptables規則都被添加到Docker鏈中。不要手動操作該鏈條。如果您需要添加在Docker規則之前加載的規則,請將它們添加到DOCKER-USER鏈中。這些規則是在Docker自動創建任何規則之前應用的。

添加到轉發鏈中的規則——無論是手動添加的,還是由另一個基于iptables的防火墻添加的——都會在這些鏈之后進行評估。這意味著如果您通過Docker暴露一個端口,無論您的防火墻配置了什么規則,該端口都會被暴露。如果您希望這些規則即使在端口通過Docker暴露時也適用,那么您必須將這些規則添加到DOCKER-USER鏈中。

限制與Docker主機的連接

默認情況下,允許所有外部源IP連接到Docker主機。要僅允許特定的IP或網絡訪問容器,請在DOCKER-USER過濾器鏈的頂部插入一個否定的規則。例如以下規則限制除192.168.1.1之外的所有IP地址的外部訪問:

iptables -I DOCKER-USER -i ext_if ! -s 192.168.1.1 -j DROP

請注意,您將需要更改ext_if以符合您的主機的實際外部接口。您可以允許來自源子網的連接。以下規則僅允許來自子網192.168.1.0/24的訪問:

iptables -I DOCKER-USER -i ext_if ! -s 192.168.1.0/24 -j DROP

最后,可以使用 --src-range 指定要接受的IP地址范圍(請記住,在使用 --src-range或 --dst-range時。還要添加-m iprange):

iptables -I DOCKER-USER -m iprange -i ext_if ! --src-range 192.168.1.1-192.168.1.3 -j DROP

您可以將 -s/--src-range-d/--dst-range 結合使用來控制源和目標。例如如果Docker守護進程監聽192.168.1.99和10.1.2.3,您可以制定特定于10.1.2.3的規則,并保持192.168.1.99開放。Linux 2.4操作指南

Docker on a router

Docker還設置丟棄轉發鏈的策略。如果您的Docker主機也充當路由器,這將導致該路由器不再轉發任何流量。如果您希望您的系統繼續充當路由器,您可以向DOCKER-USER鏈添加顯式接受規則以允許它:

iptables -I DOCKER-USER -i src_if -o dst_if -j ACCEPT

防止Docker操縱iptables

可以在Docker引擎的配置文件/etc/docker/daemon.json中將iptables鍵設置為false,但是該選項不適合大多數用戶。完全阻止Docker創建iptables規則是不可能的,而且事后創建iptables規則非常復雜,超出了這些說明的范圍。將iptables設置為false很可能會中斷Docker引擎的容器網絡。 對于希望將Docker運行時構建到其他應用程序中的系統集成商,可以探索moby項目。

為容器設置默認綁定地址

默認情況下Docker守護程序將暴露0.0.0.0地址上的端口,即主機上的任何地址。如果您想更改這種行為,只暴露內部ip地址上的端口,您可以使用 --ip 選項來指定不同的IP地址。但是設置- ip只會更改默認值,而不會將服務限制到該ip。

與防火墻的集成d

如果您運行的是docker版本20.10.0或更高版本,并且在系統上啟用了firewalld并啟用了iptables,則docker會自動創建一個名為Docker的firewalld區域,并將其創建的所有網絡接口(例如docker0)插入到Docker區域中,以實現無縫聯網。
考慮運行以下firewalld命令,從區域中刪除docker接口。

# 請替換適當的區域和docker接口
firewall-cmd --zone=trusted --remove-interface=docker0 --permanent
firewall-cmd --reload

重新啟動docker守護程序會將接口插入docker區域。

iptables規則永久生效

#1、安裝iptables軟件
yum install iptables -y && yum install iptables-services -y
systemctl start iptables.service && systemctl enable iptables.service
systemctl stop firewalld.service && systemctl mask firewalld.service

#2、在DOCKER-USER鏈上配置規則
iptables -I DOCKER-USER -m iprange -i ens33 ! --src-range 192.168.1.11-192.168.1.13 -j DROP
[root@master ~]# iptables -L DOCKER-USER -n 
Chain DOCKER-USER (1 references)
target     prot opt source               destination         
DROP       all  --  0.0.0.0/0            0.0.0.0/0            source IP range ! 192.168.1.11-192.168.1.13
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           

#3、將我們配置好的規則保存到備份配置文件中
service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  確定  ]

如果安裝了iptables軟件,則必須設置開機自啟,否則即使保存了iptables的配置文件,重啟服務器后之前在DOCKER-USER鏈上配置的規則也會失效。
原因分析:服務器重啟后,iptables服務先啟動啟動后會去加載備份的配置文件,但是此時docker服務還未啟動,DOCKER規則鏈還未創建,所以雖然iptables有加載我們備份的配置,但他沒法加載DOCKER規則鏈上的內容,從而導致我們寫的DOCKER規則鏈上的規則沒有成功加載,而docker啟動后,DOCKER規則鏈就存在了,這時不管是手動讓iptables加載配置文件還是直接重啟iptables讓他自己再讀一遍配置,我們備份的DOCKER規則就都能成功加載了。

iptables-restore < /etc/sysconfig/iptables

實例

[root@master ~]# docker run -itd -p 80:80 --name qq httpd bash

啟動docker后,在防火墻上nat表上會自動生成如下配置:

# 查看DOCKER鏈規則
[root@master ~]# iptables -S -t nat
-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80

[root@master ~]# iptables -L -nv --line-numbers -t nat
Chain PREROUTING (policy ACCEPT 4 packets, 281 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        2  1472 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 4 packets, 281 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 30 packets, 2368 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 DOCKER     all  --  *      *       0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 30 packets, 2368 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0           
2        0     0 MASQUERADE  tcp  --  *      *       172.17.0.2           172.17.0.2           tcp dpt:80

Chain DOCKER (2 references)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0           
2        0     0 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.2:80

將docker 80端口映射到本機80端口,現在需要對80端口進行限制端口訪問
在filter表中指定DOCKER 鏈,端口指定為在docker中的端口

-t filter -I DOCKER -s 192.168.1.1 -p tcp -m tcp --dport 80 -j DROP	#拒絕特定端口
-t filter -I DOCKER -s 192.168.1.1 -p tcp -m tcp -j DROP			#拒絕所有tcp端口

[root@master ~]# iptables -L -nv --line-numbers -t filter
Chain DOCKER (1 references)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 DROP       tcp  --  *      *       192.168.1.1          0.0.0.0/0            tcp dpt:80
2        0     0 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0         172.17.0.2           tcp dpt:80

When you can overcome that, be unstoppable!

原文鏈接:https://blog.csdn.net/qq_50573146/article/details/125833273

欄目分類
最近更新