百科

linux防火墙开放端口

时间:2010-12-5 17:23:32  作者:娱乐   来源:焦点  查看:  评论:0
内容摘要: linux防火墙开放端口 上周帮朋友调试一台CentOS服务器,他一脸郁闷地跟我说:“端口明明开着,外网就是连不上。”我登录一看,firewalld正在运行,规则里却压根没放行那个端口。这场景太常见

linux防火墙开放端口

上周帮朋友调试一台CentOS服务器,火墙他一脸郁闷地跟我说:“端口明明开着,开放外网就是端口连不上。”我登录一看,火墙firewalld正在运行,开放规则里却压根没放行那个端口。端口这场景太常见了——Linux默认防火墙策略是火墙“拒绝一切未明确允许的流量”,你程序监听端口只是开放第一步,防火墙不点头,端口外面的火墙请求照样进不来。

现在主流发行版基本都带两种防火墙工具:firewalld(Red Hat系)和ufw(Debian/Ubuntu)。开放操作逻辑差不多,端口都是火墙“先加规则,再重载生效”。开放拿firewalld举例,端口开放8080端口就一条命令:

firewall-cmd --permanent --add-port=8080/tcp firewall-cmd --reload

注意那个--permanent参数,不加的话规则只对当前会话有效,一重启就没了。我见过不少新手栽在这上面——当时测试通了,第二天服务又连不上,查了半天才发现规则没持久化。

如果你需要临时开放端口做测试,比如调试一个WebSocket服务,那就直接跑firewall-cmd --add-port=9000/tcp,不用加permanent,重启后自动消失,干净利落。

ufw那边更直白。先启用它:ufw enable,然后开放端口:

ufw allow 3306/tcp

这会把MySQL的3306端口对所有IP开放。但说实话,生产环境这么干很危险。我习惯指定来源IP——比如只允许公司办公网段访问数据库:

ufw allow from 192.168.1.0/24 to any port 3306

这样即使端口暴露在公网,非授权IP也摸不进来。

有个细节容易被忽略:端口范围。比如你要开放1000到2000之间的TCP端口,firewalld写法是--add-port=1000-2000/tcp,ufw是ufw allow 1000:2000/tcp。别把范围写反了,我之前见过有人写成2000-1000,系统直接报错。

验证规则是否生效,别光看防火墙状态。最靠谱的办法是拿另一台机器实际连一下。在服务器本机用telnet 127.0.0.1 端口测试没意义——那绕过了防火墙的网络栈。正确姿势是用nc -zv 服务器公网IP 端口从外部测。如果超时,先查防火墙,再查云服务商的安全组——阿里云、腾讯云那套独立于系统防火墙,经常有人只配了系统防火墙忘了安全组,白折腾半天。

还有个坑:SELinux。Red Hat系默认开着,它比防火墙更底层。有时候端口在iptables里放行了,SELinux照样拦你。排查方法很简单,临时关掉SELinux试试:setenforce 0。如果服务立刻通了,那就是SELinux策略问题。别图省事永久关闭它,正确做法是用audit2why查看具体拦截原因,再针对性放行。比如Nginx要绑定8080端口,可能得执行:

semanage port -a -t http_port_t -p tcp 8080

最后说点实在的。防火墙规则别贪多,每加一条都是攻击面。我习惯定期用firewall-cmd --list-all或ufw status numbered审视现有规则,把不用的删掉。有些运维图省事直接firewall-cmd --add-port=1-65535/tcp,这跟裸奔没区别,真不如不装防火墙。

端口开放这活儿,本质上就是“在可用性和安全性之间找平衡”。规则写得越精准,系统越不容易被钻空子。多花两分钟指定IP和协议,比事后被黑再补救强得多。

最近更新
热门排行
copyright © 2026 powered by 烟消火灭网   sitemap