技术解析

Linux 防火墙关闭了,为什么还是可以访问
0
2021-06-16 13:53:54
idczone

[背景]

centos8 主机一个,firewalld 正常运行,使用 firewall-cmd list 查看,端口 32768 并不在列表内,使用 docker 起的一个应用占用了 32768 端口.

[疑问]

按照一般情况,32768 端口不在 firewall-cmd list 的列表内,所以应该是端口关闭了,但是现象是通过浏览器访问这个端口的服务仍然正常

[解决过程]

重启了 firewalld 重启了 docker 无法解决

各位有没有遇到这种情况,怎么解决

附录:

[email protected] ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2020-07-06 01:35:35 UTC; 17min ago
     Docs: man:firewalld(1)
 Main PID: 34371 (firewalld)
    Tasks: 2 (limit: 5048)
   Memory: 26.5M
   CGroup: /system.slice/firewalld.service
           └─34371 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid

Jul 06 01:41:39 vultrguest firewalld[34371]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D OUTPUT' failed: iptables: Bad rule (does a matching rule exist in that chain?).
Jul 06 01:41:39 vultrguest firewalld[34371]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER' failed: iptables v1.8.4 (nf_tables):  CHAIN_USER_DEL failed (Device or r>
Jul 06 01:41:39 vultrguest firewalld[34371]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER-ISOLATION-STAGE-1' failed: iptables v1.8.4 (nf_tables):  CHAIN_USER_DEL f>
Jul 06 01:41:39 vultrguest firewalld[34371]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -F DOCKER-ISOLATION' failed: iptables: No chain/target/match by that name.
Jul 06 01:41:40 vultrguest firewalld[34371]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER-ISOLATION' failed: iptables: No chain/target/match by that name.
Jul 06 01:41:40 vultrguest firewalld[34371]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i docker_gwbridge -o docker_gwbridge -j ACCEPT' failed: iptables: Bad rule (does >
Jul 06 01:41:40 vultrguest firewalld[34371]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i br-3f83ec033cb1 -o br-3f83ec033cb1 -j DROP' failed: iptables: Bad rule (does a >
Jul 06 01:41:40 vultrguest firewalld[34371]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP' failed: iptables: Bad rule (does a matching rule ex>
Jul 06 01:41:41 vultrguest firewalld[34371]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP' failed: iptables: Bad rule (does a matching rule ex>
Jul 06 01:41:43 vultrguest firewalld[34371]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -nL DOCKER-INGRESS' failed: iptables: No chain/target/match by that name.
lines 1-20/20 (END)
[[email protected] ~]# firewall-cmd --list-ports

[[email protected] ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
	
[[email protected] ~]# 


好像是 docker 自动添加防火墙策略了

docker 是绕过防火墙的

看看 docker 的 mapping?

docker 直接更新了 iptables firewalld 的本质也是在 iptables 上面封装了一层,所以 firewall-cmd list 是看不到 docker 占用的端口的

我百度到也是这样说的,这个怎么处理,重启 docker 也不行吗?

不想给外部访问访问端口的权限就在开放端口的时候指定监听的 ip,比如
-p 127.0.0.1:37461:80
-p 192.168.0.100:8080:80

dockers 容器启动的时候会自己向 iptables 添加规则
但是之前经常会出现添加 iptables 失败的情况,导致容器起不来

简单来说,是因为 docker 隔离网络资源造成的;
处理方式:
1 、先确定 docker 启动的 container 的启动模式(有无指定 network 参数),默认 bridge 时是会进行网络隔离的,这时候要想防火墙规则生效,只能在 forward 链中操作(优雅的方式是自己建立一个 DOCKER-USER 链,如果你的 docker 版本够高默认是有的,将规则写在此链中,并应用在 FORWARD 链即可)
2 、如果是 host 模式(宿主机模式)即不进行网络隔离,直接使用宿主机网络的,添加规则和虚机无异

nat 的问题把 nat 也取消了

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服