刚装完一台CentOS,启防SSH能连上,火墙但想开个80端口跑Nginx,命令结果外部死活访问不了。启防十有八九是火墙防火墙没放行。Linux的命令防火墙这几年变化不小,CentOS 7以前默认用iptables,启防之后换成了firewalld,火墙Ubuntu那边则一直用ufw。命令不同发行版命令完全不一样,启防搞混了就容易白忙活。火墙
别急着敲命令。先跑一句:
systemctl status firewalld 如果显示active,启防那就是火墙firewalld在管。如果提示Unit firewalld could 命令not be found,换查ufw:
systemctl status ufw 两个都没有?那可能还在用裸iptables,或者防火墙压根没装。这种情况直接看iptables -L -n有没有规则输出就知道了。
启动并设为开机自启:
systemctl start firewalld systemctl enable firewalld 查看当前状态和已开放的端口:
firewall-cmd --state firewall-cmd --list-all 放行一个端口,比如8080:
firewall-cmd --zone=public --add-port=8080/tcp --permanent firewall-cmd --reload 注意--permanent这个参数。不加它,规则只存在于内存里,重启就没了。加了之后必须--reload才生效。我见过有人加了permanent但忘了reload,对着防火墙骂了半天。
移除端口就是把add换成remove:
firewall-cmd --zone=public --remove-port=8080/tcp --permanent firewall-cmd --reload 服务级别的放行更省事,比如直接放行http:
firewall-cmd --zone=public --add-service=http --permanent firewall-cmd --reload firewalld的zone概念值得花五分钟了解一下。默认网卡在public zone,如果你有多块网卡或者Docker环境,zone搞错了规则就不生效。Docker会自己往iptables里插规则,有时候跟firewalld打架,这个坑以后单独说。
ufw全称Uncomplicated Firewall,命令确实简单。先看状态:
ufw status 如果显示inactive,启用它:
ufw enable 放行SSH再启用,这个顺序很重要。先enable再放行22端口,你的SSH连接当场断开,只能去机房插显示器了:
ufw allow 22/tcp ufw allow 80/tcp ufw allow 443/tcp ufw enable 删除规则用delete:
ufw delete allow 80/tcp 查看带编号的规则列表:
ufw status numbered 按编号删也行:ufw delete 3。ufw底层还是iptables,只是包了一层人类可读的语法。规则默认持久化,不用额外操作。
有些精简系统或者容器环境里只有iptables。放行80端口:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT 但这只是临时生效。重启后规则全丢。保存规则在不同发行版上命令还不一样,CentOS是service iptables save,Ubuntu得装iptables-persistent。这也是为什么firewalld和ufw会被推出来——iptables的持久化确实反人类。
查看现有规则:
iptables -L -n --line-numbers 删除某条规则就按行号来:iptables -D INPUT 3。
云服务器除了系统防火墙,还有一层安全组。你在机器里把端口放行了,安全组没开照样不通。这个排查顺序应该是先看安全组,再看系统防火墙。
另外firewalld和Docker同时跑的时候,Docker会绕过firewalld直接改iptables,导致你firewalld里没放行的端口,容器一跑反而通了。反过来,你firewalld里放行了,Docker的规则可能把它覆盖掉。生产环境上Docker建议配合--iptables=false或者直接用nftables统一管理,不过这属于另一个话题了。
最后提醒一句:操作防火墙之前,确保你还有另一个活跃的SSH会话连着,或者有VNC/控制台兜底。规则写错把自己关在门外的故事,运维圈每年都能听到好几个。