CentOS 7上开放端口,开放最直接的端口工具是firewall-cmd。别去折腾iptables了,命令虽然它也能用,开放但CentOS 7默认的端口防火墙是firewalld,你改了iptables规则,命令重启后大概率被覆盖。开放这事我踩过坑,端口有一回给客户配数据库端口,命令用iptables开了3306,开放当时测试正常,端口结果机房一断电重启,命令端口全关,开放远程连不上,端口差点被投诉。命令
先看端口是不是真的被防火墙挡了。用ss -lntp | grep 8080查一下端口在不在监听,如果监听正常但外部连不上,再动防火墙。别一上来就开端口,先确认服务本身没挂。
开放端口的基本命令长这样:
firewall-cmd --zone=public --add-port=8080/tcp --permanent
然后重载:
firewall-cmd --reload
--permanent这个参数别漏,漏了的话规则只对当前会话生效,机器一重启就没了。我见过不少新手在这上面栽跟头,查半天发现规则没写进配置文件。
验证端口是否开放,用firewall-cmd --list-ports,输出里能看到8080/tcp就说明成功了。如果你想开一个端口范围,比如游戏服务器用的UDP端口段,写法是:
firewall-cmd --zone=public --add-port=1000-2000/udp --permanent
这招对跑P2P或者语音服务的场景特别实用。
偶尔会遇到开放了端口还是连不上的情况。先别急着砸键盘,检查两件事。第一,SELinux是不是在捣乱,用getenforce查状态,如果是Enforcing,试试setenforce 0临时关掉,能通的话就得去调SELinux策略了。第二,云服务商的安全组规则,阿里云、腾讯云这些厂商,除了系统防火墙还有一层网络防火墙,那玩意在网页控制台里配,跟系统命令无关。这俩坑我都趟过,最折腾的一次是客户在云控制台忘了放行端口,我在服务器上折腾了俩小时。
实际工作中还有个细节,有些服务会自己改防火墙规则,比如Docker。你要是装了Docker,它默认会往iptables里插规则,有时候跟firewalld打架。遇到端口不通的怪问题,先iptables -L -n看一眼,有Docker的链在里头,别慌,那是正常的。
最后给个建议,别把所有端口都裸奔。我见过有运维图省事,直接firewall-cmd --add-service=http或者干脆把防火墙关了,结果被扫描器盯上,数据库被人拖了库。开端口之前想清楚,这个服务真的需要对所有IP开放吗?如果只是内部用,可以限定来源IP:
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept'
麻烦是麻烦点,但安全这东西,省一步就多一分风险。
命令记不住没关系,man firewall-cmd随时能查。关键是理解firewalld的zone机制,搞懂了public、internal这些区域的区别,你就能灵活控制哪些网卡走什么规则。多试几次,踩几个坑,自然就熟了。
