我在 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