端口与防火墙是一对组合问题
「服务在跑但连不上」绝大多数发生在端口与过滤这两处:要么服务只监听了本机回环地址,外部自然连不上;要么路径上有过滤规则把包丢掉了。云环境里还要多算一层——安全策略、主机防火墙、以及服务自身的绑定地址,三处任意一处不匹配都表现成同一种超时。成熟的排查方式是先确认监听,再确认逐层放行,最后确认服务本身是否健康。
基本信息
| 适用对象 | Linux 主机上的 TCP/UDP 服务与网络过滤 |
|---|---|
| 监听查看 | 套接字统计工具可列出监听地址、端口与进程 |
| 主机侧过滤 | firewalld、nftables、iptables、ufw 等不同代际工具 |
| 云侧过滤 | 安全组或网络访问控制列表,独立于主机 |
| 权限要求 | 查看进程与规则通常需要 root |
逐层确认顺序
- 看监听:确认服务监听的是全网地址而不是回环地址,这是最常见的自伤
- 看主机过滤:确认主机防火墙放行的端口、协议与来源都匹配
- 看云侧策略:安全组按方向与来源分别配置,入方向与出方向都要成立
- 看来源地址:经地址转换后源地址会变化,规则若按源地址限制需要匹配转换后的地址
- 看无状态规则:无状态过滤下回程端口需单独放行,否则握手无法完成
- 看端口用途冲突:新服务与已有服务争抢同一端口时,绑定会失败或被第一个进程占住
分类型查证据
分类型查证据
ss -lntp # 监听地址、端口与所属进程
ss -lntp | grep -v '127.0.0.1\|\[::1\]' # 只看对外可达的监听
firewall-cmd --list-all # firewalld 的放行概览
nft list ruleset # nftables 规则全集
iptables -S # 传统 iptables 规则
ufw status verbose # Debian 系常用前端
nft list ruleset | grep -c drop # 快速看是否存在丢弃类规则服务端侧排错
服务端侧排错
ss -lntp | grep ':8080' # 确认端口确实有人在监听
journalctl -u myapp -n 30 --no-pager # 服务自身日志里常有绑定失败记录
ss -s # 查看套接字总量,连接数异常时参考
cat /proc/net/sockstat # 观察端口与连接资源是否接近上限现象与对应层
| 现象 | 检查位置 | 常见根因 |
|---|---|---|
| 本机可连、外部超时 | 监听地址与主机过滤 | 只监听回环或未放行来源 |
| 客户端超时、无任何日志 | 云侧策略与主机过滤 | 静默丢弃而非拒绝 |
| 监听不存在 | 服务配置与端口占用 | 绑定失败或端口被占用 |
| 突然出现绑定失败 | 端口与进程 | 服务未正常退出或权限不足 |
| 仅部分客户端失败 | 来源与地址转换 | 源地址匹配规则不成立 |
主机上装有强制访问控制模块时,服务绑定非常用端口可能被拒绝启动。遇到配置文件正确但进程起不来、日志里提示权限问题的情况,可以查对应端口的策略许可,具体命令随发行版与版本不同,以官方文档为准。
用一次性全放行来验证连通性是有效的排错手段,但验证完必须立刻收回并改成精确放行;把临时规则留在生产环境上,等于把攻击面从一台主机扩到整个网络。