centos7防火墙开放端口
CentOS 7用的防火放端是firewalld,不是墙开老掉牙的iptables。很多人刚上手时习惯性去改/etc/sysconfig/iptables,防火放端结果重启后规则全没了,墙开一脸懵。防火放端这事我踩过坑,墙开所以直接说重点:firewalld的防火放端规则是即时生效的,不用重启服务,墙开改完立刻能用。防火放端
先看最常用的墙开命令。开放端口,防火放端比如8080:
firewall-cmd --zone=public --add-port=8080/tcp --permanent 那个--permanent参数是墙开关键,不加的防火放端话重启防火墙就失效。加了它,墙开还得重新加载一下配置:
firewall-cmd --reload 这时候端口就通了。防火放端想确认下?firewall-cmd --list-ports,输出里应该有8080/tcp。
但有个坑,很多人不知道——如果你服务器上跑了Docker,或者用了Nginx代理,光在firewalld里开端口没用。Docker会自己操作iptables规则,绕过firewalld。我之前部署一个应用,8080端口在防火墙里开了,外部还是访问不了,查了半天才发现是容器端口映射的问题。所以遇到端口不通,先别急着怀疑防火墙,用ss -tlnp看看端口有没有在监听,再用curl 127.0.0.1:8080本地测一下,能通就说明应用没问题,问题在网络层。
还有种情况是端口范围,比如游戏服务器或FTP服务,需要开放一段端口。写法类似:
firewall-cmd --zone=public --add-port=1000-2000/udp --permanent UDP和TCP要分开写,别指望一条命令搞定两种协议。我见过有人写--add-port=53,没带协议,firewalld直接报错。这玩意儿语法挺死板的,少个斜杠都不行。
再说说zone。默认是public,但如果你有多个网卡,比如一个连内网一个连外网,就得指定zone。查看当前zone用firewall-cmd --get-active-zones。内网那个网卡可以设成trusted,直接放行所有流量,省得一条条加端口。外网网卡保持public,只开必要的服务。这样配置好处是逻辑清晰,坏处是容易忘——上次我加了个新网卡,忘了设zone,结果所有端口都连不上,排查了半小时。
删除端口更简单,把add换成remove就行:
firewall-cmd --zone=public --remove-port=8080/tcp --permanent firewall-cmd --reload 如果临时测试某个端口,不想写进永久规则,去掉--permanent,直接生效,重启后自动消失。适合调试用。
最后提一句,firewalld底层还是iptables,但管理方式完全不同。别试图混用两种命令,会出乱子。要是实在不习惯,可以systemctl stop firewalld然后装iptables-services,但我不推荐——firewalld的zone概念其实挺好用,只是需要点时间适应。我用了两个月才摸清它的脾气,现在觉得比iptables直观多了。