结论:开放开发测试端口必须先确保INPUT链默认策略非DROP,否则ACCEPT规则无效;90%“端口开了却不通”源于此。需检查策略、补ESTABLISHED/lo规则、用-I插入避免被后续REJECT拦截,正确指定-p tcp和--dport,UDP需单独添加,并及时保存规则。

直接说结论:开放开发测试端口,必须先确保 INPUT 链默认策略不是 DROP,否则加了 ACCEPT 规则也连不上——这是 90% 的“端口开了却访问不通”问题的根源。
检查当前 INPUT 链策略和规则顺序
开发环境常误用 iptables -P INPUT DROP 后没补基础放行规则,导致 SSH 断连或新端口无效。先确认现状:
- 运行
iptables -L INPUT -n -v,看第一列 policy 是ACCEPT还是DROP - 若 policy 是
DROP,且没看到类似state ESTABLISHED,RELATED或-i lo的规则,立刻补上(否则新加的端口规则根本没机会匹配) - 规则按顺序匹配,
-I INPUT插入开头,-A INPUT追加末尾;测试端口建议用-I,避免被后续REJECT规则拦截
开放 TCP 端口(如 8080、3000、5000)的正确写法
开发常用端口基本都是 TCP,但很多人漏写 -p tcp 或拼错 --dport(少个短横或大小写错误),导致规则不生效:
- 正确命令:
iptables -I INPUT -p tcp --dport 3000 -j ACCEPT - 如果只允许本地访问(比如前端 dev server 不想暴露给外网):
iptables -I INPUT -p tcp -s 127.0.0.1 --dport 3000 -j ACCEPT - 若服务监听在
0.0.0.0:3000但只想让局域网访问:iptables -I INPUT -p tcp -s 192.168.1.0/24 --dport 3000 -j ACCEPT - UDP 端口(如某些调试工具用的)必须单独加:
iptables -I INPUT -p udp --dport 5001 -j ACCEPT
保存规则并验证是否真生效
iptables 规则重启即丢,开发机临时测试可不保存,但一旦 reboot 就得重配——这点极易被忽略:
- Debian/Ubuntu:
iptables-save > /etc/iptables/rules.v4 - RHEL/CentOS 7+(未启用 firewalld):
service iptables save或iptables-save > /etc/sysconfig/iptables - 验证是否生效:用
iptables -L INPUT -n --line-numbers查看规则序号;再用curl -v http://localhost:3000或从另一台机器telnet your-ip 3000测试连通性 - 注意:规则生效 ≠ 服务在监听。用
ss -tlnp | grep :3000确认进程确实在 bind 对应端口
真正容易出问题的不是“怎么加规则”,而是规则加在哪条链、匹配顺序是否合理、以及是否忘了保存。尤其当系统原本跑着 firewalld,又手动敲 iptables 命令时,两者会冲突——先停掉 systemctl stop firewalld 再操作更稳妥。











