Linux端口控制需协同防火墙规则、服务监听及外部拦截排查:先用systemctl或iptables确认firewalld/ufw/iptables类型,再按对应命令永久开放端口并reload,最后验证服务监听、云安全组和SELinux。

Linux 开放或关闭端口,本质不是“操作端口本身”,而是控制防火墙规则 + 确保服务监听 + 排除外部拦截。直接改 /etc/services 或只跑 nc -lp 不起作用,也留不下持久配置。
怎么确认当前用的是 firewalld 还是 ufw?
不同发行版默认防火墙不同,命令混用会失败或无响应:
-
sudo systemctl status firewalld—— CentOS/RHEL/Fedora 常见,返回active (running)表示启用 -
sudo systemctl status ufw—— Ubuntu/Debian 默认,ufw status输出Status: active才算生效 -
sudo iptables -L -n—— 若前两者都未运行,可能直连iptables,但无服务管理,规则重启即丢
注意:firewalld 和 ufw 同时启用会导致规则冲突,建议停掉一个:sudo systemctl stop ufw 或 sudo systemctl stop firewalld。
firewalld 开放/关闭端口必须加 --permanent 且 reload
不加 --permanent 的操作仅临时生效(重启或 reload 后消失);不执行 firewall-cmd --reload,规则根本不进内核。
- 开放 TCP 8080:
sudo firewall-cmd --permanent --add-port=8080/tcp - 开放 UDP 53:
sudo firewall-cmd --permanent --add-port=53/udp - 关闭已添加的端口:
sudo firewall-cmd --permanent --remove-port=8080/tcp - 立即生效:
sudo firewall-cmd --reload - 验证是否在规则中:
sudo firewall-cmd --list-ports(只列端口),或sudo firewall-cmd --list-all(含 zone、service、rich rules)
常见坑:误写成 --add-port=8080(缺 /tcp 或 /udp),firewalld 会静默忽略,--list-ports 里看不到,也不报错。
ufw 允许/删除规则要匹配协议才可靠
sudo ufw allow 8080 默认允许 TCP+UDP,但很多服务(如 HTTP)只走 TCP,显式指定更安全,也避免后续排查困惑。
- 明确只开 TCP:
sudo ufw allow 8080/tcp - 删规则不能只写端口:
sudo ufw delete allow 8080/tcp(必须和添加时协议一致) - 查编号再删(适合批量或模糊规则):
sudo ufw status numbered→ 记下编号 →sudo ufw delete N - 查看完整规则:
sudo ufw status verbose(含日志、跟踪状态)
注意:ufw 没有 “永久/临时” 概念,所有规则写入配置即持久,但必须 sudo ufw enable 才真正启动防火墙服务——首次启用会提示是否继续,别直接回车跳过。
开了防火墙端口,telnet 还连不上?检查这三处
防火墙只是其中一环,漏掉任一环节都会表现为“端口打不开”:
- 服务没监听:
sudo ss -tlnp | grep :8080或sudo lsof -i :8080,无输出说明进程根本没 bind 该端口(比如 Redis 默认 bind127.0.0.1,需改redis.conf中的bind行) - 云平台拦截:阿里云、腾讯云、AWS 控制台里的“安全组”必须单独放行对应端口,和本地防火墙无关
- SELinux 阻断(RHEL/CentOS):
sudo setenforce 0临时设为 permissive 模式测试;若恢复连通,说明需调整 SELinux 策略,而非关防火墙
真正验证通断,别只在本机 telnet 127.0.0.1 8080,从另一台机器跑:nc -zv your-server-ip 8080,才能反映真实网络路径。


















