本文最后更新于2023年5月23日,已超过 1 年没更新!内容可能已失效,请自行测试。

问题

Linux防火墙firewalld未开放80端口,但发现该端口仍能访问,后续发现机器上安装有docker服务,nginx80端口映射到了本地的80端口。有一种”绕过“Linux防火墙的假象。

测试

虚拟机Centos安装docker服务拉取nginx镜像并将80映射到本地的80端口

docker run -idt -p 80:80 nginx
#查看一下当前防火墙状态和规则
systemctl status firewalld && firewall-cmd --list-all

可见未开放80端口

但是此时访问虚拟机IP可见nginx页面

# 端口tcp服务测试
curl 127.0.0.1:80
发现80端口没有被拒绝,可访问

通过命令检查docker

# 查找端口80服务的进程,进程好为$pid
netstat -antlp |grep 80
ps -ef |grep $pid

检查iptables规则


iptables -L -n --line-number

不难发现在Chain DOCKER下多出了一条新增的规则

其中172.17.0.2为容器在docker网桥中的IP,该规则允许任意来源的地址访问80端口,所以出现了防火墙没有开启端口,但是却能访问到该端口服务的现象。

在docker中运行第三方服务时,通常需要绑定服务端口到本地主机。使用 -p 参数进行端口映射时,会自动在iptables中建立规则,绕过firewalld。

解决办法1

绑定服务端口到本地主机时采用以下方式

docker run -idt -p 127.0.0.1:80:80 nginx

解决办法2

vim /etc/default/docker
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --iptables=false"

vim /etc/docker/daemon.json
{
"iptables": false
}
=

一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。