绑定地址决定谁能访问
「本机访问正常、外部访问不通」最常见的根因是服务绑定的地址不对:绑在回环地址上只收本机流量,绑在通配地址上才接受所有网卡地址的访问,绑在具体网卡地址上则只收该地址的流量。bind 决定的是内核把哪些目的地址的报文交给这个套接字,因此它排在防火墙之前——绑定错了,放行再多的端口也没用。先用连接状态工具看监听地址,再谈其他原因。
基本信息
| 现象 | 外部访问不通,但本机访问同一个端口正常 |
|---|---|
| 核心命令 | ss -tlnp 查看监听地址与端口 |
| 平台差异 | Linux 与 Windows 语义一致,Windows 侧可用 netstat -ano 查看 |
| 原理 | bind 决定内核把哪些目的地址的报文交给该套接字 |
| 容器场景 | 宿主机与容器各有一张回环表,绑回环的容器服务无法被外部直接访问 |
典型使用场景
- 新部署的服务本机能访问、同网段访问不通,先看监听地址
- 反向代理连不上后端,检查后端是否只绑在回环地址上
- 容器里服务不可达:区分钟监听地址与容器内监听地址
- 安全加固:确认本应只对内网开放的端口没有绑在通配地址上
- 变更后回归:调整绑定地址后两端都验证一遍,避免放开了却没放对
绑定写法与含义
| 监听地址 | 含义 |
|---|---|
| 0.0.0.0:80 或 *:80 | 所有 IPv4 地址均可访问 |
| 127.0.0.1:80 | 仅本机回环,外部一律不可达 |
| 192.168.1.5:80 | 仅绑定该网卡地址,其他地址不接收 |
| [::]:80 | IPv6 所有地址,多数系统同时接受映射的 IPv4 连接 |
排查与验证
排查与验证
ss -tlnp | grep -E ':80\b' # 看监听地址与进程
ss -tlnp | awk '{print $4}' | sort -u # 汇总所有监听地址
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:80/ # 本机回环验证
curl -sS -o /dev/null -w '%{http_code}\n' http://<本机网卡IP>:80/ # 本机走网卡地址
ss -tlnp | grep -c '127.0.0.1' # 有多少服务只绑了回环
tcpdump -nn -i any 'tcp port 80' # 外部访问时包是否到达本机本机通、外部不通时不要先怀疑防火墙:先用 ss 看绑定地址,再抓包确认请求报文是否真的到达本机网卡。绑定在回环地址上的服务,防火墙放行再多端口也不会有响应。
把服务从回环改为通配地址等于扩大了暴露面:改完后要同步检查主机防火墙、安全组与访问控制,只在确有必要对外提供服务的端口上这样做。