By accessing the website and accepting the Cookie Policy, you agree to use the cookies provided by the Site in accordance with to analyze traffic, remember your preferences, and optimize your experience.
OK
emengweb 's Blog
Figma YES!
Toggle navigation
emengweb 's Blog
主页
Debian
CAT玉米
VI设计
NAS
OctoberCMS
UIKit3
宝塔面板
Python
SVG相关
PVE
Figma
VPS独服务记录
K8S
About Me
归档
标签
解决 Docker 导致 UFW 防火墙设定不生效的问题
ufw
docker
2024-04-28 18:42:40
136
0
0
emengweb
ufw
docker
# **起因** 自从意识到在互联网上有成千上万的扫描器 24 小时不停的扫扫扫,以及在 Censys.io 网络空间搜索引擎里几乎能搜索到关于本人服务器上运行的业务的近乎一切详情后,我开始怕了。服务器上暴露端口可能导致各种被入侵,被当肉鸡,或者暴露源站 ip,不同机子之间的关联信息。所以一年前开始我就特别注重服务器防火墙的配置。 妈的,直到上个月我才发现一个怪事,就是 Docker 容器暴露出来的端口不会受 UFW 的规则影响,手动 deny 掉也照样可以访问,无大语了。 # **原因** 当你在使用 Docker 时,它会创建一个虚拟网络接口(通常是名为 docker0 的网桥),并使用 Linux 的网络命名空间来隔离容器的网络环境,这些操作是通过 iptables 修改系统网络功能实现的 UFW(Uncomplicated Firewall)是一个简化了防火墙配置的前端工具,它使用 iptables 来管理 Linux 系统的防火墙规则。当你在使用 UFW 时,其实是它根据你的配置再设置 iptables 规则来限制网络流量。 然而,Docker 会修改系统的 iptables 规则,以便容器之间可以相互通信,并且容器可以与主机和外部网络进行通信。而且这些修改的优先级高于 UFW 这样的 iptables 规则管理程序,导致 UFW 的规则失效。 Docker 直接操作了 iptables 规则,而不是通过 UFW。 **具体现象是:** 在一个对外提供服务的服务器上启用了 UFW,并且默认阻止所有未被允许的传入连接。 运行了一个 Docker 容器,并且使用 -p 选项来把该容器的某个端口发布到服务器的所有 IP 地址上。比如:`docker run -d --name httpd -p 0.0.0.0:8080:80 httpd:alpine` 将会运行一个 httpd 服务,并且将容器的 80 端口发布到服务器的 8080 端口上。 UFW 将不会阻止所有对 8080 端口访问的请求,用命令 `ufw deny 8080` 也无法阻止外部访问这个端口。 这个问题其实挺严重的,这意味着本来只是为了在内部提供服务的一个端口被暴露在公共网络上。 ## **解决办法** ### **通过换防火墙管理软件实现** 别用`ufw`了,用`firewall`就没这个问题 ### **额外安装一个 ufw-docker 修复工具** 下载 `ufw-docker` 脚本 ```bash sudo wget -O /usr/local/bin/ufw-docker \ https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker chmod +x /usr/local/bin/ufw-docker # 使用下列命令来修改 ufw 的 after.rules 文件 ufw-docker install # 重启ufw服务 systemctl restart ufw ``` 这个命令做了以下事情: - 备份文件 `/etc/ufw/after.rules` - 把 UFW 和 Docker 的相关规则添加到文件 `after.rules` 的末尾 问题解决,现在 ufw 的默认配置或者端口的放行 /deny 也对 docker 一视同仁的生效了。 关于`ufw-docker`更多功能请访问项目主页:https://github.com/chaifeng/ufw-docker # 疑难解答 ufw重启失败,提示`couldn't load target ufw-logging-deny no such file` 修改`/etc/ufw/after.rules` 文件,注释掉`# -A ufw-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK]` ,最后新添加的规则修改为: ```bash # BEGIN UFW AND DOCKER *filter :ufw-user-forward - [0:0] :ufw-docker-logging-deny - [0:0] :DOCKER-USER - [0:0] -A DOCKER-USER -j ufw-user-forward -A DOCKER-USER -j RETURN -s 10.0.0.0/8 -A DOCKER-USER -j RETURN -s 172.16.0.0/12 -A DOCKER-USER -j RETURN -s 192.168.0.0/16 -A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN -A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16 -A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8 -A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12 -A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 192.168.0.0/16 -A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 10.0.0.0/8 -A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 172.16.0.0/12 -A DOCKER-USER -j RETURN #-A ufw-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK] " -A ufw-docker-logging-deny -j DROP COMMIT # END UFW AND DOCKER ```
上一篇: 无
下一篇:
k3s集群对只有IPv6的节点,单独指定获取镜像image pull代理
0
赞
136 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
文档导航