TOC

UFW 导致端口无法访问

我在 Ubuntu 机器上部署了 ntfy,用于接收推送通知。这台机器位于中国移动家庭宽带环境下,拥有公网 IPv6 地址。

为了测试连通性,我关闭了手机 Wi-Fi,仅使用 5G 网络(同样具备 IPv6 能力),尝试通过浏览器访问服务器地址 http://[2409:8a4d:c36:cc90::2]:11080,结果无法连接。

明确服务运行正常,本地可以访问

-> % grep -Ev "^#|^\s*$" /etc/ntfy/server.yml
listen-http: ":11080"

-> % ss -lntp | grep -E "Local Address:Port|11080"
State  Recv-Q Send-Q                           Local Address:Port  Peer Address:PortProcess
LISTEN 0      4096                                         *:11080            *:*

想到了 UFW 防火墙

一开始还没有想到 UFW 上面去,只是怕自己的配置只绑定了 IPv4,但是改成 [::]:11080 试试也没有用,更重要的是切回绑定 :11080 之后本地用 IPv6 访问没有问题。
PS:我尝试了通过云服务器访问本地 IPv6,意外发现云服务器没有给我分配 IPv6 地址。

只列出 IPv6 地址的 LISTEN sockets 也可以看到端口绑定:

-> % ss -6 -lntp | grep -E "Local Address:Port|11080"
State  Recv-Q Send-Q                           Local Address:Port  Peer Address:PortProcess
LISTEN 0      4096                                         *:11080            *:*

我第一时间怀疑的还是运营商,是不是运营商把 IPv6 的访问给拦截了。
还没来得及验证,想起来了上个月我做了一次防火墙操作,默认拦截入站流量,赶紧加上端口 allow,再测试,没有问题了。

-> % sudo ufw allow 11080/tcp comment 'ntfy server'
-> % sudo ufw reload
-> % sudo ufw status verbose
状态:激活
日志: on (low)
默认:deny (incoming), allow (outgoing), disabled (routed)
新建配置文件: skip

至                          动作          来自
-                          --          --
22/tcp (OpenSSH)           ALLOW IN    Anywhere
Anywhere                   ALLOW IN    172.16.0.0/12
11080/tcp                  ALLOW IN    Anywhere                   # ntfy server
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)
11080/tcp (v6)             ALLOW IN    Anywhere (v6)              # ntfy server
如果你有魔法,你可以看到一个评论框~