监听 0.0.0.0 和 :: 不是一回事
ss -lntp 里有的服务显示 0.0.0.0:80,有的显示 *:80 或 [::]:80。差别在于是否接受 IPv6。
Linux 默认 net.ipv6.bindv6only=0,绑 :: 的套接字同时接受 IPv4(映射成 ::ffff:1.2.3.4)。但绑 0.0.0.0 的只接受 IPv4。
所以:
- 只写
listen 80;的 nginx 在某些版本里只绑 IPv4,IPv6 用户连不上。 - 显式写
listen [::]:80;才覆盖 IPv6。 - 如果
bindv6only=1,::也不再接受 IPv4,两边都要显式监听。
排查“部分用户连不上”时,先确认 ss 里有没有 [::],再用 curl -6 和 curl -4 分别试。