【iptables&docker】對運(yùn)行docker的服務(wù)器開啟iptables策略

一、背景

在Linux上docker映射了端口筷屡,想著對服務(wù)端口進(jìn)行限制指定IP訪問涧偷,發(fā)現(xiàn)在filter表的INPUT鏈限制無效。

二毙死、 分析

# 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容器啟動防火墻上的變動,如果暴露本機(jī)端口喻鳄,在nat表的DOCKER鏈上增加一條規(guī)則:

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表增加規(guī)則來drop掉所有訪問容器暴露端口的連接,最后處理結(jié)果如下:

# 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

在Linux上除呵,Docker操縱iptables提供網(wǎng)絡(luò)隔離的規(guī)則再菊。
雖然這是一個(gè)實(shí)現(xiàn)細(xì)節(jié),您不應(yīng)該修改Docker插入到您的iptables政策颜曾,如果你想在Docker管理的政策之外擁有自己的政策纠拔,它確實(shí)對你需要做的事情有一些影響。
如果您在一臺暴露于互聯(lián)網(wǎng)的主機(jī)上運(yùn)行Docker泛豪,那么您可能希望有iptables策略來防止對容器或其他在您的主機(jī)上運(yùn)行的服務(wù)的未授權(quán)訪問稠诲。

image.png

Docker安裝了兩個(gè)定制的iptables鏈,名為DOCKER-USER和DOCKER诡曙,它確保傳入的數(shù)據(jù)包總是首先由這兩個(gè)鏈檢查臀叙。

Docker的所有iptables規(guī)則都被添加到Docker鏈中,不要手動操作該鏈條价卤。
如果您需要添加在Docker規(guī)則之前加載的規(guī)則劝萤,請將它們添加到DOCKER-USER鏈中。這些規(guī)則是在Docker自動創(chuàng)建任何規(guī)則之前應(yīng)用的慎璧。

添加到轉(zhuǎn)發(fā)鏈中的規(guī)則——無論是手動添加的床嫌,還是由另一個(gè)基于iptables的防火墻添加的——都會在這些鏈之后進(jìn)行評估跨释。這意味著如果您通過Docker暴露一個(gè)端口,無論您的防火墻配置了什么規(guī)則厌处,該端口都會被暴露鳖谈。

如果您希望這些規(guī)則即使在端口通過Docker暴露時(shí)也適用,那么您必須將這些規(guī)則添加到DOCKER-USER鏈中嘱蛋。

三蚯姆、實(shí)例

只允許 192.168.1.101 ~ 192.168.1.103 的主機(jī)訪問本機(jī)的 1~65535/tcp 1~65535/udp。

# cat set_iptables_rules.sh

#!/bin/bash

nic="eth0"

ips="
192.168.1.101
192.168.1.102
192.168.1.103
"

iptables -I DOCKER  -i ${nic} -p tcp --dport 1:65535 -j DROP
iptables -I DOCKER  -i ${nic} -p udp --dport 1:65535 -j DROP

for ip  in ${ips}
do
  iptables -I DOCKER -i ${nic}  -s ${ip} -p tcp --dport 1:65535 -j ACCEPT
  iptables -I DOCKER -i ${nic}  -s ${ip} -p udp --dport 1:65535 -j ACCEPT
done

注:此操作是臨時(shí)生效洒敏,服務(wù)器重啟失效

四龄恋、將iptables策略注冊成系統(tǒng)服務(wù),實(shí)現(xiàn)開機(jī)自啟

# setenforce 0

# sed -i 's/^SELINUX=.*/SELINUX=permissive/g'   /etc/selinux/config

# cat /etc/systemd/system/iptables.service

[Unit]
Description=iptables rules service
After=network.target

[Service]
Type=oneshot
ExecStart=/bin/bash   /usr/sbin/set_iptables_rules.sh
ExecStop=/usr/sbin/iptables -P INPUT ACCEPT
ExecStop=/usr/sbin/iptables -F
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

image.png

# cat /usr/sbin/set_iptables_rules.sh

#!/bin/bash

nic="eth0"

ips="
192.168.1.101
192.168.1.102
192.168.1.103
"

iptables -I DOCKER  -i ${nic} -p tcp --dport 1:65535 -j DROP
iptables -I DOCKER  -i ${nic} -p udp --dport 1:65535 -j DROP

for ip  in ${ips}
do
  iptables -I DOCKER -i ${nic}  -s ${ip} -p tcp --dport 1:65535 -j ACCEPT
  iptables -I DOCKER -i ${nic}  -s ${ip} -p udp --dport 1:65535 -j ACCEPT
done
image.png

# systemctl daemon-reload

# systemctl  start   iptables.service

# systemctl  enable  iptables.service

# systemctl  status  iptables.service

image.png
# iptables  -nvL  --line
Chain INPUT (policy ACCEPT 188 packets, 19400 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 DOCKER-ISOLATION  all  --  *      *       0.0.0.0/0            0.0.0.0/0
2        0     0 DOCKER     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0
3        0     0 ACCEPT     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
4        0     0 ACCEPT     all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0
5        0     0 ACCEPT     all  --  docker0 docker0  0.0.0.0/0            0.0.0.0/0

Chain OUTPUT (policy ACCEPT 154 packets, 21532 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain DOCKER (1 references)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     udp  --  eth0   *       192.168.1.103        0.0.0.0/0            udp dpts:1:65535
2        0     0 ACCEPT     tcp  --  eth0   *       192.168.1.103        0.0.0.0/0            tcp dpts:1:65535
3        0     0 ACCEPT     udp  --  eth0   *       192.168.1.102        0.0.0.0/0            udp dpts:1:65535
4        0     0 ACCEPT     tcp  --  eth0   *       192.168.1.102        0.0.0.0/0            tcp dpts:1:65535
5        0     0 ACCEPT     udp  --  eth0   *       192.168.1.101        0.0.0.0/0            udp dpts:1:65535
6        0     0 ACCEPT     tcp  --  eth0   *       192.168.1.101        0.0.0.0/0            tcp dpts:1:65535
7        0     0 DROP       udp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            udp dpts:1:65535
8        0     0 DROP       tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpts:1:65535

Chain DOCKER-ISOLATION (1 references)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0


# systemctl  stop iptables.service

# iptables -nvL --line

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

Chain FORWARD (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 24 packets, 3141 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain DOCKER (0 references)
num   pkts bytes target     prot opt in     out     source               destination

Chain DOCKER-ISOLATION (0 references)
num   pkts bytes target     prot opt in     out     source               destination

注意: 對運(yùn)行docker的主機(jī)執(zhí)行 iptables -F 凶伙,會直接清空所有的docker的iptables策略郭毕,需要重啟docker

五、參考

Docker and iptables
https://docs.docker.com/network/iptables

iptables匹配端口范圍函荣,映射显押,網(wǎng)絡(luò)狀態(tài)
http://t.zoukankan.com/Carr-p-7396031.html

iptables阻止了應(yīng)用連到 容器化的MySQL
https://www.cnblogs.com/shaoyang0123/p/15065439.html

iptables限制docker端口禁止對某臺主機(jī)進(jìn)行提供服務(wù)
https://blog.csdn.net/qq_50573146/article/details/125833273

iptables限制Docker IP和端口訪問
https://blog.csdn.net/yeqinghanwu/article/details/125979997

使用iptables為docker容器配置防火墻策略
https://blog.csdn.net/m0_37814112/article/details/121229022

Linux運(yùn)維實(shí)戰(zhàn)總結(jié)
https://blog.csdn.net/m0_37814112/category_10867749.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市傻挂,隨后出現(xiàn)的幾起案子乘碑,更是在濱河造成了極大的恐慌,老刑警劉巖金拒,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兽肤,死亡現(xiàn)場離奇詭異,居然都是意外死亡绪抛,警方通過查閱死者的電腦和手機(jī)资铡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幢码,“玉大人笤休,你說我怎么就攤上這事≈⒏保” “怎么了店雅?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瓦糕。 經(jīng)常有香客問我底洗,道長,這世上最難降的妖魔是什么咕娄? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任亥揖,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘费变。我一直安慰自己摧扇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布挚歧。 她就那樣靜靜地躺著扛稽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪滑负。 梳的紋絲不亂的頭發(fā)上在张,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音矮慕,去河邊找鬼帮匾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛痴鳄,可吹牛的內(nèi)容都是我干的瘟斜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼痪寻,長吁一口氣:“原來是場噩夢啊……” “哼螺句!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起橡类,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤蛇尚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后顾画,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體佣蓉,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年亲雪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疚膊。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡义辕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寓盗,到底是詐尸還是另有隱情灌砖,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布傀蚌,位于F島的核電站基显,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏善炫。R本人自食惡果不足惜撩幽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窜醉,春花似錦宪萄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至琅催,卻和暖如春居凶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背藤抡。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工侠碧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人杰捂。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓舆床,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嫁佳。 傳聞我的和親對象是個(gè)殘疾皇子挨队,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容