解决docker和ufw 网络冲突问题

1.在使用docker时,主机开启ufw时,经常出现docker无法访问主机网络的情况,
或者
Docker不遵守ufw规则
如果你在服务端使用 Docker 映射了某个宿主机端口,然后公网访问这个端口的话,你会发现仍然可以访问,即使 ufw 禁用了这个端口,却不起效果。

因为默认状态下的 Docker 并不遵守 ufw 的防火墙规则
1.1 ufw首选设置

# 默认阻止入站(不会立即切断你的 SSH 连接,因为防火墙尚未启用)
ufw default deny incoming

# 默认允许出站
ufw default allow outgoing

# 拒绝所有访问(如果配置了入站/出战,这个可以不配置)
ufw default deny

# 根据需求开启端口
ufw allow 22
  1. 解决办法
# 下载脚本
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-docker install

如果希望允许外部网络访问 Docker 容器提供的服务,比如有一个容器的服务端口是 80。那就可以用以下命令来允许外部网络访问这个服务:

代码语言:javascript

ufw route allow proto tcp from any to any port 80

这个命令会允许外部网络访问所有用 Docker 发布出来的并且内部服务端口为 80 的所有服务。

请注意,这个端口 80 是容器的端口,而非使用 -p 0.0.0.0:8080:80 选项发布在服务器上的 8080 端口。

如果有多个容器的服务端口为 80 ,但只希望外部网络访问某个特定的容器。比如该容器的私有地址为 172.17.0.2 ,就用类似下面的命令:

代码语言:javascript

ufw route allow proto tcp from any to 172.17.0.2 port 80

如果一个容器的服务是 UDP 协议,假如是 DNS 服务,可以用下面的命令来允许外部网络访问所有发布出来的 DNS 服务:

代码语言:javascript

ufw route allow proto udp from any to any port 53

同样的,如果只针对一个特定的容器,比如 IP 地址为 172.17.0.2 :

代码语言:javascript

ufw route allow proto udp from any to 172.17.0.2 port 53

ufw-docker 也是支持 Docker Swarm的,

补充:
image

posted @ 2024-08-22 14:37  学不会xuebuhui  阅读(1271)  评论(0)    收藏  举报
Language: javascript //图片预览