VPS 防火墙放行端口后 telnet 测试依然不通怎么检查 iptables

文章导读
防火墙端口放行后 telnet 测试失败,通常是因为底层 iptables 规则未刷新、云服务安全组限制或服务监听地址配置错误。
📋 目录
  1. 操作前安全准备
  2. 命令速用版
  3. 根据 telnet 报错区分问题
  4. 分步处理
  5. 怎么验证是否生效
  6. 规则持久化与恢复
  7. 常见坑
A A

防火墙端口放行后 telnet 测试失败,通常是因为底层 iptables 规则未刷新、云服务安全组限制或服务监听地址配置错误。

先说结论:问题往往不在端口是否“开放”,而在于流量是否被底层规则拦截或服务是否真正监听。

  • 先确认:服务是否监听在 0.0.0.0 而非 127.0.0.1
  • 先处理:检查 iptables 默认策略及 firewalld 冲突
  • 再验证:排除云厂商安全组外层限制
  • 安全警告:远程操作防火墙前务必确保拥有控制台访问权限

操作前安全准备

在执行任何防火墙清空或策略修改命令前,请务必注意以下风险:

  • 防止锁死:切勿在唯一的 SSH 会话中直接执行 iptables -F 或修改默认策略为 DROP,除非你已确认 SSH 端口(默认 22)已被豁免或你有云控制台(VNC)访问权限。
  • 规则备份:修改前建议备份当前规则,以便出错时恢复。
  • 测试窗口:建议保留一个未关闭的 SSH 窗口作为备用,新开一个窗口测试连接。

命令速用版

以下命令用于快速定位状态,生产环境执行前请先备份:

# 备份当前 iptables 规则(重要)
iptables-save > /tmp/iptables.backup

# 查看端口监听状态
ss -tuln | grep 端口号

# 查看 iptables 当前规则
iptables -L -n -v

# 查看 firewalld 状态
systemctl status firewalld

# 临时清空 iptables 规则(测试用,重启失效,需确保 SSH 安全)
iptables -F
iptables -P INPUT ACCEPT

根据 telnet 报错区分问题

不同的 telnet 返回信息指向不同的故障点,请根据以下特征排查:

  • Connection refused:表示包到达了服务器,但目标端口没有服务监听。重点检查服务是否启动、是否监听在 0.0.0.0。
  • Connection timed out:表示请求发出后没有收到任何响应。重点检查防火墙拦截、云安全组丢弃、路由不可达。
  • Unable to connect to remote host:通常表示 DNS 解析失败或 IP 不可达,检查网络连通性。

分步处理

1. 检查服务监听地址
在服务器内部执行 ss -tuln,确认目标端口对应的 Local Address 是 0.0.0.0 或具体网卡 IP。如果显示 127.0.0.1,外网无法访问,需修改服务配置绑定到公网 IP。

2. 检查 iptables 规则
即使 firewalld 显示关闭,内核规则可能仍存在。执行 iptables -L -n 查看 INPUT 链。如果默认策略是 DROP 且没有针对该端口的 ACCEPT 规则,流量会被丢弃。测试时可临时执行 iptables -F 清空规则验证,但请确保已备份且不会导致 SSH 中断

VPS 防火墙放行端口后 telnet 测试依然不通怎么检查 iptables

3. 排查防火墙冲突
CentOS 7 及以上默认使用 firewalld,若手动安装 iptables 可能导致冲突。建议只保留一种防火墙机制。若使用 iptables,需彻底停用 firewalld:systemctl stop firewalldsystemctl disable firewalld

4. 检查云安全组
登录云控制台(如阿里云 ECS 安全组、腾讯云安全组、AWS Security Groups),确认入站规则已放行对应端口和协议(TCP)。部分云资源虚拟机上层管理可能有额外限制,需确保规则优先级正确,且来源 IP 设置为 0.0.0.0/0 或特定白名单。

怎么验证是否生效

在另一台外网机器执行 telnet IP 端口。若连接建立则成功。若仍失败,可在服务器端使用 tcpdump 抓包,看是否收到 SYN 包但未回复,这通常意味着包被防火墙丢弃而非服务拒绝。

# 在服务器端抓包验证(需 root 权限)
tcpdump -i any port 端口号 -n

若看到 SYN 包进入但没有 SYN-ACK 回复,说明服务未响应或被防火墙拦截;若根本看不到 SYN 包,说明流量在到达服务器前已被云安全组拦截。

规则持久化与恢复

iptables 规则默认重启后失效,若测试成功需保存规则:

# 保存当前规则
iptables-save > /etc/sysconfig/iptables

# 若操作失误,恢复备份
iptables-restore < /tmp/iptables.backup

常见坑

  • 协议不匹配:telnet 基于 TCP 协议,若防火墙只放行了 UDP 端口,telnet 依然不通。
  • 容器网络:若服务在 Docker 容器内,需检查 FORWARD 链及 NAT 规则,容器默认桥接网络可能隔离了外部访问。
  • 规则优先级:安全组或 iptables 规则从上到下匹配,若前方有“拒绝全部”规则,后续放行规则不会生效。
  • 本地防火墙:部分服务器内部还运行着安全软件(如云盾、安全狗),可能独立于 iptables 进行拦截。