防火墙控制Docker端口开放与关闭

问题描述

IP.25 服务器安装Docker的Mysql服务,防火墙启用的是Firewalld,防火墙未暴露3306端口且未开放任意IP对3306端口访问。
在IP.29 服务器,通过命令telnet x.x.1.25 3306 发现接口通的!

经过排查得知:Docker通过Iptables强制开发暴露端口!!!

解决方式,参考博客方法二

引发问题:容器内部之间也无法通过防火墙 (解决方式详细查看上述博客!)


Firewalld防火墙规则迁移到Iptables

原Firewalld防火墙规则

原Firewalld端口开放

80/tcp 443/tcp

原Firewalld指定IP访问开放端口

rule family="ipv4" source address="x.x.x.194" port port="22" protocol="tcp" accept
rule family="ipv4" source address="x.x.x.194" port port="7869" protocol="tcp" accept

停止Firewalld并启用Iptables防火墙

停止Firewalld防火墙

service firewalld stop

禁止Firewalld自启动

systemctl disable firewalld

安装防火墙Iptables

yum -y install iptables iptables-services

启动并设置开机自启

systemctl start iptables && systemctl enable iptables

原Firewalld规则迁移Firewalld中

放行指定IP访问端口

/sbin/iptables -I INPUT -s x.x.x.194 -p tcp --dport 22 -j ACCEPT
/sbin/iptables -I INPUT -s x.x.x.194 -p tcp --dport 7869 -j ACCEPT

放行端口

/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 443 -j ACCEPT

保存配置

service iptables save

重启防火墙

service iptables restart;

查看防火墙规则

cat /etc/sysconfig/iptables;

添加Docker的防火墙规则

添加规则

iptables -I DOCKER-USER  !  -s  127.0.0.1  -p tcp --dport 3306 -j DROP

B服务器访问A服务器(修改前):

Trying xx.xxx.x.29…
Connected to xx.xxx.x.29.
Escape character is ‘^]’.
J
8.0.33\a’uY[ÿsvt9DLX#mysql_native_password^]

B服务器访问A服务器(修改后):

[ordinary@ngx25 ~]$ telnet xx.xxx.x.29 3306
Trying xx.xxx.x.29…

报错处理

在配置安装并启动Iptables后,重启安装Mysql的Docker容器,报错日志如下:

Error response from daemon: Cannot restart container 984fbd11c965: driver failed programming external connectivity on endpoint mysql_8_0 (13949dfba465381240c62d43fe2bf64d3453ad5f51be4a440edf1418a398071b): (iptables failed: iptables –wait -t nat -A DOCKER -p tcp -d 0/0 –dport 3306 -j DNAT –to-destination 172.17.0.2:3306 ! -i docker0: iptables: No chain/target/match by that name

解决参考博客

systemctl restart docker