docker 映射出来的端口如何写 iptables 规则

admin 2023年12月20日23:01:20评论18 views字数 2444阅读8分8秒阅读模式

先说一下我这边的软件运行环境,主机上既有本地运行的程序,也有基于 docker 运行的程序。最近发现基于 docker 的应用端口有外部攻击痕迹,于是准备在 iptables 中写策略封端口,结果发现不生效。

原生的 iptables 策略如下:

bash# iptables -nLChain INPUT (policy ACCEPT)target     prot opt source               destination
Chain FORWARD (policy DROP)target prot opt source destinationDOCKER-USER all -- 0.0.0.0/0 0.0.0.0/0DOCKER-ISOLATION-STAGE-1 all -- 0.0.0.0/0 0.0.0.0/0ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHEDDOCKER all -- 0.0.0.0/0 0.0.0.0/0ACCEPT all -- 0.0.0.0/0 0.0.0.0/0ACCEPT all -- 0.0.0.0/0 0.0.0.0/0ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHEDDOCKER all -- 0.0.0.0/0 0.0.0.0/0ACCEPT all -- 0.0.0.0/0 0.0.0.0/0ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)target prot opt source destination
Chain DOCKER (2 references)target prot opt source destinationACCEPT tcp -- 0.0.0.0/0 192.168.250.4 tcp dpt:63790ACCEPT tcp -- 0.0.0.0/0 192.168.250.4 tcp dpt:33062ACCEPT tcp -- 0.0.0.0/0 192.168.250.4 tcp dpt:33061ACCEPT tcp -- 0.0.0.0/0 192.168.250.5 tcp dpt:2222ACCEPT tcp -- 0.0.0.0/0 192.168.250.8 tcp dpt:80
Chain DOCKER-ISOLATION-STAGE-1 (1 references)target prot opt source destinationDOCKER-ISOLATION-STAGE-2 all -- 0.0.0.0/0 0.0.0.0/0DOCKER-ISOLATION-STAGE-2 all -- 0.0.0.0/0 0.0.0.0/0RETURN all -- 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-ISOLATION-STAGE-2 (2 references)target prot opt source destinationDROP all -- 0.0.0.0/0 0.0.0.0/0DROP all -- 0.0.0.0/0 0.0.0.0/0RETURN all -- 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-USER (1 references)target prot opt source destinationRETURN all -- 0.0.0.0/0 0.0.0.0/0

本打算在 INPUT 链中直接封掉 80 端口,结果发现封不掉:

bash# iptables -I INPUT -p tcp -m tcp --dport 80 -j DROP
bash# iptables -nL INPUTChain INPUT (policy ACCEPT)target prot opt source destinationDROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80

在网页上测试 80 端口,服务仍然可以访问。此时发现在 INPUT 链中写拒绝策略对 docker 应用不起作用。

同时通过 netstat 查看会话信息也查不到任何关于 80 端口的外部连接信息:

bash# netstat -an| grep :80tcp   0   0 0.0.0.0:80   0.0.0.0:*    LISTENtcp   0   0 :::80   :::*              LISTEN

认真思考一下可以理解为 docker 容器是一个隔离的“虚拟机”,宿主机的会话信息与容器的会话信息是隔离的。所以在宿主机上无法直接查看容器的会话信息。

同样 INPUT 链只对宿主机的应用起作用,如果要写容器的 iptables 策略,可以 DOCKER 链中去写。

在 DOCKER 链中测试了 DROP 策略后,测试结果显示 DROP 策略是生效的。

bash# iptables -I DOCKER -s 10.20.94.10 -j DROPbash# iptables -nL DOCKERChain DOCKER (2 references)target     prot opt source               destinationDROP       all  --  10.20.94.10          0.0.0.0/0ACCEPT     tcp  --  0.0.0.0/0            192.168.250.4        tcp dpt:63790ACCEPT     tcp  --  0.0.0.0/0            192.168.250.4        tcp dpt:33062ACCEPT     tcp  --  0.0.0.0/0            192.168.250.4        tcp dpt:33061ACCEPT     tcp  --  0.0.0.0/0            192.168.250.5        tcp dpt:2222ACCEPT     tcp  --  0.0.0.0/0            192.168.250.8        tcp dpt:80

总结:

宿主机的 iptables 策略与 docker 容器的 iptables 策略是不通用的。我们无法在 INPUT 链上防护 docker 容器的端口。

如果要阻止外部 IP 访问 docker 应用,需要要 DOCKER 链上写防护策略,而 INPUT 链只对宿主机应用生效。

全文完。

如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。

原文始发于微信公众号(生有可恋):docker 映射出来的端口如何写 iptables 规则

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月20日23:01:20
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   docker 映射出来的端口如何写 iptables 规则http://cn-sec.com/archives/2321934.html

发表评论

匿名网友 填写信息