CentOS7以上利用firewalld控制Docker的container容器只能白名单访问

2022-05-24 2090点热度 0人点赞 0条评论

Docker里面的容器暴露出来的端口默认是可以让外部随意访问的,Linux下(CentOS7以上)如果是firewalld防火墙,就算开着,并设置了黑白名单也是无效

那是因为Docker启动容器会默认使用iptables防火墙设置容器暴露出来,并全部允许访问,本省firewalld也是底层调用的iptables。

干货实操

如果想要控制特定的端口给特定的IP访问,可以这样做(我亲测有效,每次添加新的自定义规则,都要1-3步骤都跑一次,需要添加的规则放在第二步的中间加注释的地方):

  1. 第一步

准备工作(包括清理规则、建立DOCKER-USER链)如果报错也不要紧,因为有些规则一开始是不存在的(但是跑第二次就存在了,所以确保干净,需要跑一次清理)

# 移除docker zone
firewall-cmd --permanent --delete-zone=docker

# 让firewalld移除DOCKER-USER并新建一个
# Removing DOCKER-USER CHAIN (it won't exist at first)
firewall-cmd --permanent --direct --remove-chain ipv4 filter DOCKER-USER
 
# Flush rules from DOCKER-USER chain (again, these won't exist at first; firewalld seems to remember these even if the chain is gone)
firewall-cmd --permanent --direct --remove-rules ipv4 filter DOCKER-USER
 
# Add the DOCKER-USER chain to firewalld
firewall-cmd --permanent --direct --add-chain ipv4 filter DOCKER-USER
  • 第二步

加上你想要的规则,注意reject放在最后

firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 0 -i docker0 -j ACCEPT -m comment --comment "allows incoming from docker"
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 0 -i docker0 -o eth0 -j ACCEPT -m comment --comment "allows docker to eth0"
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -m comment --comment "allows docker containers to connect to the outside world"
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 0 -j RETURN -s 172.17.0.0/16 -m comment --comment "allow internal docker communication"
 
## 你可以直接允许来自指定 IP 的所有流量
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 0 -s 61.222.3.133/32 -j ACCEPT 
## 或者特定ip特定端口:
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 0 -s 121.248.63.134/32 -p tcp --dport 1521 -j ACCEPT

# 最后其他的一律禁止
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 0 -j REJECT --reject-with icmp-host-unreachable -m comment --comment "reject all other traffic"
  • 第三步

最后reload,使firewalld规则生效,并通过iptables -L确认是否正确生效

firewall-cmd --reload
iptables -nL

之前还写文章介绍了其他的方式,详见:https://blog.terrynow.com/2022/01/06/docker-container-port-firewalld-settings/

防失联小技巧

最后一个小提示,为了防止调试防火墙导致服务器失联,可以做一个定时任务,定时关闭防火墙,等都调试好了,再把定时任务取消,我这里设置了1小时内2次关闭:

crontab -e

* */59 * * * /usr/sbin/ntpdate times.seu.edu.cn
0,30 * * * * systemctl stop firewalld

 

admin

这个人很懒,什么都没留下

文章评论

您需要 登录 之后才可以评论