摘要
本文主要介绍了在机器上同时配置了iptables和firewalld之后,因为防火墙冲突,导致docker内部网络无法连接外网,针对这个场景下,通过卸载firewalld,全面启用iptables,重新安装docker来解决该问题的过程。
发现过程
- docker日志查看发现内部无网络 使用vocechat这个聊天软件,一直没有手机通知,通过docker的日志查看:
docker logs <containerid> -f --tail 10
发现该docker每隔5分钟会向一个网站请求检查md5值,来检测更新版本,但是一直提示没网络。
- 检查docker容器网络状态
#这个可以检查容器状态,里面能看到网络情况
docker inspect <containerid>
#### 一些尝试
- docker中增加DNS,发现无效
- 在
/etc/docker/daemon.json
中添加dns,无效 最终的方案
- 禁用firewalld
- 卸载docker并重新安装docker
- 启用iptables并配置
解决过程
禁用firewalld
#先用这个看一下开放了哪些端口并记录下来
firewall-cmd --list-all
#停止并禁用firewalld
systemctl stop firewalld
systemctl disable firewalld
卸载并重新安装docker
停止并卸载docker
systemctl stop docker
apt purge docker-ce docker-ce-cli containerd.io
清理残留文件
rm -rf /var/lib/docker
rm -rf /etc/docker
重装安装docker
apt update
apt install -y docker-ce docker-ce-cli containerd.io
启动并验证docker
systemctl start docker
systemctl enable docker
#查看docker状态
systemctl status docker
这里执行完成后,可以去自己对应的服务下启动docker-compose服务了。
docker-compose up -d
iptables配置
允许22端口
#要保留22端口,不然关闭所有端口后,连SSH中断,无法操作了
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
#允许已建立的连接
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
#设置完成后,确认一下,另外开一个链接,看一下SSH是否能连接,如果能连接则继续向下
添加其他规则
#添加80和443的TCP端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
查看iptables规则
iptables -L -n -v
问题:web服务前端无法访问
#一开始配置:
iptables -A INPUT -p tcp -s 127.0.0.1 -j ACCEPT
#后来配置:这个可以允许本地回环接口的流量
iptables -A INPUT -i lo -j ACCEPT
添加上述规则之后,web服务可以正确访问了。
iptables保存
因为iptables重启后,会消失,需要进行持久化。
#安装iptables-persistent
apt install iptables-persistent
#保存当前规则:
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
这一步做完后,就正常了。
结语
本文介绍了因为firewalld与iptabales冲突引起docker内部网络与外部不通,通过重新安装docker并禁用firewalld,并解决了因为iptables没有转发本地localhost(127.0.0.1)的流量导致web服务nginx无法正常反代的问题。
备注:本文的系统为debian12.