Docker下端口通过Iptable防火墙管理
问题描述
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 |
停止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 -p tcp --dport 80 -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 |