網站首頁 編程語言 正文
前言
在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
相關推薦
- 2022-09-29 Shell函數返回值方式_linux shell
- 2022-09-01 Django定時任務Django-crontab的使用詳解_python
- 2022-03-07 android?studio?項目?:UI設計高精度實現簡單計算器_Android
- 2022-03-15 C#實現時間戳與標準時間的互轉_C#教程
- 2023-12-19 SQLSyntaxErrorException異常產生原因及解決方案
- 2022-08-23 Rx.NET庫中IDisposable對象的用法_實用技巧
- 2022-07-03 C#?Winform中DataGridView導出為Excel的實現示例_C#教程
- 2022-11-14 正則表達式手冊以備平時自己看
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支