12 网络与端口
学习目标
按“地址与路由 → 监听 socket → 名称解析 → TCP/TLS → HTTP”分层取证,避免把“ping 不通”“端口监听”或“HTTP 200”误当成完整健康结论。
先画清请求路径
应用 URL
└─ DNS/hosts:名称解析成地址
└─ 路由:系统选择接口与下一跳
└─ TCP/UDP:目标端口是否可达、是否有进程监听
└─ TLS:证书、主机名、时间与协议协商
└─ HTTP:状态码、头、响应体与应用语义每一层都有独立失败模式。curl 连接拒绝与 HTTP 503 不是同一问题;监听 127.0.0.1 的服务也不会自动对外可达。
地址、接口与路由
iproute2 是现代 Linux 常用工具:
ip -brief address show
ip link show
ip route show
ip route get 1.1.1.1ip address显示接口地址;UP不等于链路和外部网络都健康。ip route显示路由表;route get只展示内核会选择的路径,不发送数据包。- 容器和 WSL 看到的是其网络 namespace/虚拟网络视图,不一定等于宿主机。
- macOS/BSD 不使用相同的
ip命令,常见替代是ifconfig、route、netstat,选项不能直接照搬。
监听端口与连接
ss -lnt
ss -lntp
ss -tan state established选项直觉:-l listening,-n 不做名称解析,-t TCP,-u UDP,-p 进程信息,-a all。
注意:
- 普通用户可能看不到其他用户的进程信息;不要为了完整输出默认 sudo。
0.0.0.0:8000表示所有 IPv4 接口,127.0.0.1:8000仅 loopback;IPv6 的::行为还受系统配置影响。- “有 socket 监听”只证明内核有端点,不证明路由、代理、防火墙、TLS 或业务健康。
- 在共享主机公开
ss -p输出可能暴露命令行、用户或内部端口布局,报告应脱敏。
查一个确定的 loopback 端口:
ss -lnt 'sport = :8765'过滤表达式支持情况依 iproute2 版本而异;不支持时先运行 ss -lnt 再人工核对。
名称解析
getent ahosts example.com
getent hosts localhostgetent 通过系统的 Name Service Switch 查询,更接近应用使用的解析路径。dig、host 或 resolvectl query 可能未安装,且可能绕开或展示不同层;排障时记录用了哪个工具。
常见边界:
/etc/hosts、DNS、mDNS 和目录服务都可能参与解析。- DNS 成功只证明得到记录,不证明目标端口可达。
- DNS 失败不等于公网断开,可能是搜索域、resolver、VPN 或容器配置问题。
- 不要在报告中泄露内部域名和完整 resolver 配置。
用 curl 检查 HTTP 层
对本地实验服务:
curl --disable --noproxy '*' \
--fail \
--show-error \
--location \
--connect-timeout 3 \
--max-time 10 \
--output /dev/null \
--write-out 'http=%{http_code} remote=%{remote_ip} time=%{time_total}\n' \
http://127.0.0.1:8765/--disable必须是 curl 的第一个选项,用于忽略用户级.curlrc;--noproxy '*'覆盖代理环境变量,确保这个实验请求直接访问 loopback。--fail让 HTTP 400 及以上通常成为失败,但它不证明响应真实、安全或业务正确。--location跟随重定向;跨主机重定向需要重新审查信任边界。- connect timeout 与总 timeout 不同,自动化要同时限制。
- URL、header 和 verbose 输出可能含 token、cookie、查询参数与内部地址;秘密不要直接放命令行。
curl -k/--insecure会跳过 TLS 证书验证,不应作为生产修复。
只想查看响应头时可用 --head,但有些应用对 HEAD 与 GET 行为不同,不能互相替代。
Ping 能证明什么
ping -c 3 127.0.0.1ICMP echo 成功能证明特定网络层路径响应;失败可能是权限、策略或过滤,不足以证明 HTTP 服务不可用。反之 ping 成功也不证明目标 TCP 端口、TLS 或应用健康。
防火墙、代理和容器边界
防火墙规则、云安全组、Kubernetes NetworkPolicy、反向代理和端口映射都可能位于不同管理层。iptables、nft、云控制台和容器编排配置通常需要更高权限或外部授权,本入门课不提供变更命令。
代理变量也会改变 curl 行为:
for name in http_proxy https_proxy all_proxy no_proxy HTTPS_PROXY ALL_PROXY NO_PROXY HTTP_PROXY; do
if [ -n "${!name:-}" ]; then
printf '%s is set\n' "$name"
else
printf '%s is unset\n' "$name"
fi
done只报告“是否设置”,不要打印代理 URL,因为其中可能含凭据。curl 在类 Unix 系统只采用小写 http_proxy,其他协议代理通常可用大小写形式;ALL_PROXY/all_proxy 提供兜底,NO_PROXY/no_proxy 提供排除列表,小写形式通常优先。大写 HTTP_PROXY 即使存在也不表示 curl 会采用它。
分层排障练习
完成 综合项目 中的 loopback 服务后,依次保存:
ip -brief address:loopback 是否存在。ss -lnt 'sport = :8765':是否监听、绑定哪个地址。curl:连接、HTTP 状态与总耗时。- 日志:对应请求是否到达应用。
- PID:监听端点是否属于实验进程。
任何一层失败都停止向下猜测,先记录退出码和当前证据。
掌握检查
- 能区分 DNS、路由、监听、TCP、TLS 与 HTTP 层。
- 能解释 loopback、所有接口绑定和端口映射的差别。
- 知道
ss -p、curl verbose/header 与代理变量可能泄密。 - 不用 ping 结果替代应用健康检查。
下一步:压缩与解压。
参考资料
获取日期:2026-07-14。