UFW 阻止了 Docker 本地主机连接

Her*_*mes 2 networking docker ufw ubuntu-18.04

情况

我正在尝试学习如何在本地机器上使用 docker。本地计算机设置为仅通过 VPN 路由流量。默认的 UFW 策略是DENY所有传入和传出流量(通过 VPN 的除外)。

问题

当我尝试启动 Docker 容器时docker container run -p 80:80 nginx,无法在浏览器中使用 localhost 连接到 nginx 容器

但是,我可以通过telnet连接到本地nginx容器

$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Run Code Online (Sandbox Code Playgroud)

我知道 UFW 可能导致这种情况的原因是因为一旦我禁用了 UFW,我就可以毫无问题地在浏览器中连接到 localhost。

当 UFW 设置为拒绝所有连接时,如何从浏览器连接到本地 nginx 容器?

Her*_*mes 8

我找到了解决我的问题的方法。

解决方案

ufw allow out on docker0 from 172.17.0.0/16
Run Code Online (Sandbox Code Playgroud)

由于我知道 nginx 使用的特定端口,我也可以通过执行此规则使此规则更加严格

ufw allow out on docker0 from 172.17.0.0/16 port 80 proto tcp
Run Code Online (Sandbox Code Playgroud)

解释

Docker 为容器创建了一个新接口,您可以通过运行来查看它ifconfig

docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:a4:5e:e9:9c  txqueuelen 0  (Ethernet)
        RX packets 87  bytes 17172 (17.1 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 117  bytes 14956 (14.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
Run Code Online (Sandbox Code Playgroud)

此接口通过 172.17.xxx.xxx 路由流量。您可以在此处阅读有关我如何找到该网络掩码的更多信息。

这为我们提供了编写规则所需的所有信息。如果您在不同的端口上发布容器,您可以通过执行以下操作来检查端口号和协议:

  1. 查找容器的 ID docker container ls
  2. 查找您的容器的端口 docker container port {id}