Vultr 实例端口不通通常由 Vultr 云端防火墙或系统内部 iptables 规则拦截导致。优先检查 Vultr 控制面板的 Cloud Firewall 规则,确认放行后再修改系统内部 iptables 配置。
先说结论:Vultr 平台存在外部云端防火墙和内部系统防火墙两层防护,端口不通需按顺序排查。
- 先确认:登录 Vultr 控制面板检查 Cloud Firewall 是否阻止了目标端口。
- 先处理:在云端防火墙放行端口后,再登录系统修改 iptables 规则。
- 再验证:使用 telnet 或 nc 命令从外部测试端口连通性。
命令速用版
# 查看当前 iptables 规则
iptables -L -n -v
# 临时清空所有规则(生产环境慎用,可能断开 SSH)
iptables -F
# 放行特定端口示例(以 TCP 80 为例)
iptables -I INPUT -p tcp `--dport` 80 -j ACCEPT
# 保存规则(CentOS/RHEL)
service iptables save
# 保存规则(Ubuntu/Debian 需安装 iptables-persistent)
netfilter-persistent save
为什么会这样
Vultr 实例网络流量先经过 Vultr 云端防火墙,再进入操作系统内部。
如果 Vultr 云端防火墙规则默认拒绝所有入站流量,即使系统内部 iptables 放行了端口,外部请求也会在到达 VPS 之前被丢弃。反之,如果云端放行但系统内部 iptables 默认策略为 DROP 且无放行规则,端口同样无法访问。两层防火墙独立工作,需同时配置。
分步处理
步骤 1:检查 Vultr 云端防火墙
登录 Vultr 控制面板,进入 Instances 列表,点击目标实例。查找 Firewall 或 Cloud Firewall 选项卡。确认是否存在允许目标端口(如 80、443 或自定义端口)的入站规则。如果没有,添加一条允许 TCP/UDP 对应端口的规则。
步骤 2:检查系统内部防火墙状态
通过 SSH 登录实例,执行iptables -L -n -v。观察 INPUT 链的默认策略(policy)。如果显示 DROP 或 REJECT,需要添加 ACCEPT 规则。注意确认是否安装了 ufw 或 firewalld,这些工具底层也调用 iptables/nftables,建议统一使用一种管理工具。
步骤 3:修改 iptables 配置
使用iptables -I INPUT -p tcp `--dport` 端口号 -j ACCEPT添加放行规则。规则添加后,务必执行保存命令,防止重启失效。CentOS 使用service iptables save,Ubuntu 需确保iptables-persistent包已安装并使用netfilter-persistent save。
怎么验证是否生效
在本地电脑或另一台服务器上执行测试命令。使用telnet 实例 IP 端口或nc -zv 实例 IP 端口。如果显示 Connected 或 succeeded,说明端口已通。如果显示 Connection refused 或 timed out,说明仍有拦截。
同时检查系统日志/var/log/messages或/var/log/syslog,查看是否有防火墙丢弃数据包的记录。
常见坑
- SSH 端口被锁:修改 iptables 默认策略前,务必先放行 SSH 端口(默认 22),否则会导致无法远程连接。
- 规则顺序错误:iptables 规则按顺序匹配,放行规则应放在拒绝规则之前。
- 重启失效:iptables 规则默认存储在内存中,重启服务器会丢失,必须执行保存命令。
- 工具冲突:同时使用 ufw、firewalld 和原生 iptables 命令可能导致规则混乱,建议只保留一种管理方式。
常见问题
Vultr 云端防火墙和系统 iptables 有什么区别?
Vultr 云端防火墙位于 hypervisor 层,在流量到达 VPS 之前拦截;系统 iptables 位于操作系统内核层,处理进入系统后的流量。
修改 iptables 后需要重启服务器吗?
不需要重启服务器,iptables 规则即时生效。但需要执行保存命令确保重启后规则不丢失。
为什么 iptables 放行了端口还是不通?
大概率是 Vultr 云端防火墙未放行,或者服务器内部有其他安全软件(如 fail2ban、云安全 agent)进行了拦截。
如何临时关闭 iptables 排查问题?
执行iptables -F清空规则并将默认策略设为 ACCEPT,但生产环境慎用,排查后应立即恢复。