Docker 绕过了 firewalld 的问题

Docker 绕过了 firewalld 的问题

前言

我们的 firewalld 上没有开放该端口,但是在使用 Docker 的端口映射后我们就能够通过外网访问到该端口。

原因

默认情况下当Docker启动容器映射端口时,会直接在iptables添加规则开启添加端口。而 firewalld 实际上也是在iptables写入规则。因此 firewallddocker属于是同级的应用,但是firewalld不会去检测 docker 写入的规则,就会导致 docker 可以开启firewalld没有允许的端口:

# 首先关闭 docker 和防火墙
systemctl stop docker
systemctl stop firewalld

# 查看 iptables
iptables --list

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

# 打开 docker
systemctl start docker
iptables --list
# 我们会发现在 iptables 里增加了许多 docker 的规则

# 我们启动一个容器并开启端口映射
docker run -dit -p 80:80 nginx
iptables --list

# 我们发现在 iptables 里增加了一条规则
# 它将 80(http) 端口的流量转发到了 172.17.0.2(我们开启的容器的地址)
...
Chain DOCKER (1 references)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             172.17.0.2           tcp dpt:http
...

通过上面的分析我们就知道了 docker 是通过在 iptables 中添加规则实现的端口映射。

那这个时候我们再开启防火墙,看看防火墙是如何修改的 iptables:

# 开启防火墙观察 iptables 的变化
systemctl start firewalld
iptables --list

...
Chain IN_public_allow (1 references)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh ctstate NEW,UNTRACKED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh ctstate NEW,UNTRACKED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:postgres ctstate NEW,UNTRACKED
...

开启防火墙后我们果然发现了我们通过 firewalld开启的端口规则。这下子我们终于弄懂了 docker 和 firewalld 之间的关系。

等等!!!

我们之前看到的 docker 的规则呢?

开启防火墙后我们发现在上面添加的 docker 的 iptables 的规则已经不见了,这个时候从外网访问 80 端口也被拒绝了!这又是怎么一回事呢?

原来 firewalld在开启时会自动刷新覆盖掉原来的 iptables 规则,这就导致了 docker 的规则被丢失。

因此 firewalld重启后需要再重启 docker的服务才能使 docker 正常启动。

使 docker 在防火墙规则下工作

由于 docker 这种脱离防火墙控制的行为具有一定危险性,并且为运维带来一定难度,因此我们需要让 docker 接受防火墙的管理。

既然 docker 是修改的 iptables 脱离的防火墙控制,那我们让他不修改 iptables 就可以解决问题了:

# 添加规则
vim /etc/docker/daemon.json

{
...
"experimental" : true,
"iptables": false
}

# 重启 docker
systemctl daemon-reload
systemctl restart docker

# 启动一个容器检验
docker run -d -p 80:80 nginx
iptables --list
# 发现 docker 没有添加规则
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值