Linux防火墙是保障服务器安全的核心工具,掌握iptables和nftables的配置方法,能有效抵御多数网络攻击。
Linux防火墙怎么设置?
防火墙的配置并不复杂,关键在于理解规则的方向和顺序,下面从检查状态到添加规则,一步步带你上手。
检查当前防火墙状态
- 对于firewalld:
systemctl status firewalld,如果显示active (running),说明防火墙正在运行。 - 对于iptables:
iptables -L -n -v,列出所有规则,看是否有明确拒绝或允许。 - 对于nftables:
nft list ruleset,输出当前所有规则集。 - 对于ufw(Ubuntu):
ufw status。
如果系统没有安装防火墙,建议先安装一个,CentOS 7默认安装firewalld,Ubuntu 20.04默认安装ufw,但底层仍是iptables/nftables。
使用iptables配置基础规则
iptables操作直观,但需要记住命令格式,以下是一个典型的入站规则链:
- 允许SSH(22端口):
iptables -A INPUT -p tcp --dport 22 -j ACCEPT - 允许已建立连接和关联连接:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT - 允许回环接口:
iptables -A INPUT -i lo -j ACCEPT - 设置默认策略为拒绝:
iptables -P INPUT DROP - 保存规则:
iptables-save > /etc/sysconfig/iptables(CentOS)或iptables-save > /etc/iptables/rules.v4(Debian/Ubuntu)
注意:设置默认DROP前,务必确保已经放行了SSH,否则你会失去连接。
使用firewalld简化配置
firewalld提供了区域和服务的概念,让配置更语义化。
- 启动firewalld:
systemctl start firewalld - 设置开机自启:
systemctl enable firewalld - 查看当前区域:
firewall-cmd --get-default-zone - 允许HTTP服务:
firewall-cmd --permanent --add-service=http - 允许自定义端口:
firewall-cmd --permanent --add-port=3000/tcp - 重新加载使生效:
firewall-cmd --reload - 查看所有规则:
firewall-cmd --list-all
firewalld的优势在于动态更新,不用重启服务,而且它支持rich rule,可以匹配更复杂的条件。
使用nftables配置规则
nftables是新一代防火墙,在RHEL 8/9、Ubuntu 22.04+等系统中成为默认。
- 安装nftables:
yum install nftables或apt install nftables - 启动:
systemctl start nftables - 编写配置文件,
/etc/nftables.conf:table inet filter { chain input {
type filter hook input priority 0; policy drop; iif lo accept ct state established,related accept tcp dport {22,80,443} accept } chain forward { type filter hook forward priority 0; policy drop; } chain output { type filter hook output priority 0; policy accept; } } - 加载配置:
nft -f /etc/nftables.conf - 查看规则:
nft list ruleset
nftables的语法更简洁,支持集合和映射,在大规模规则集下性能更好。
使用ufw(Ubuntu专有工具)
对于Ubuntu Desktop或Server,ufw是入门最快的方式。
- 启用ufw:
ufw enable - 允许SSH:
ufw allow ssh - 允许HTTP/HTTPS:
ufw allow 80/tcp和ufw allow 443/tcp - 允许特定IP:
ufw allow from 192.168.1.0/24 to any port 22 - 查看状态:
ufw status numbered
ufw实际上生成的是iptables规则,但隐藏了复杂性,适合简单场景。
iptables和nftables哪个好?
对于刚接触Linux防火墙的用户,常会问这个问题,下面从四个维度对比,并给出选型建议。
| 对比项 | iptables | nftables |
|---|---|---|
| 语法风格 | 命令行参数,链式处理 | 类C语言规则集,支持变量和集合 |
| 性能表现 | 线性检查,规则多时效率下降 | 使用哈希表,多数场景性能更优 |
| 学习曲线 | 命令多,但资料丰富,社区经验多 | 概念新,但语法一致,上手后更清晰 |
| 生态系统 | 老版本系统默认,兼容性好 | 新系统默认,红帽和Ubuntu均已转向 |
| 更新频率 | 维护模式,功能基本冻结 | 活跃开发,支持IPset、状态跟踪等新特性 |
具体案例对比:允许来自192.168.1.0/24的SSH访问。
- iptables:
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT - nftables:在规则文件中添加
ip saddr 192.168.1.0/24 tcp dport 22 accept
nftables的语法更紧凑,并且可以将多个IP地址放入一个集合,简化规则。
选型建议:
- 如果你使用CentOS 7或更早版本,系统内嵌iptables,直接学习iptables即可,无需额外安装。
- 如果你使用CentOS 8、RHEL 8、Ubuntu 22.04等新系统,默认使用nftables,但系统也提供了iptables兼容层。行业共识认为,新项目推荐直接使用nftables,因为它更快、更现代。
- 如果你不想深入底层,firewalld可以同时管理iptables和nftables规则,你只需要通过firewalld接口操作,由它选择底层工具。
不同场景下的防火墙配置方案
防火墙的配置不能一概而论,需要根据服务器所处的环境调整策略。
云服务器防火墙配置场景(简米云/酷番云)
云服务器通常会提供安全组,这是第一层防护,操作系统防火墙是第二层,两者配合时,需要注意以下要点:
- 操作系统防火墙的规则不能与安全组矛盾,安全组放行了80端口,但操作系统防火墙默认拒绝,则流量仍会被阻断。
- 建议操作系统防火墙只放行必要端口,并且针对来源IP做限制,SSH只允许公司IP段访问。
- 配置示例(firewalld):
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" port protocol="tcp" port="22" accept' firewall-cmd --reload - 对于云服务器,经常需要配置端口转发(如负载均衡器后端),此时防火墙规则要配合DNAT规则。
家庭服务器或NAS
家庭网络环境较为复杂,路由器通常已有NAT,但操作系统防火墙仍可提供额外保护。
- 开启防火墙,信任内网段:
firewall-cmd --permanent --zone=trusted --add-source=192.168.1.0/24 - 对外网只开放有限端口,如Plex、BT下载端口。
- 限制ping包:
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP - 对于NAS,通常需要开放SMB(445)和AFP(548)端口,建议只允许内网访问。
企业内网隔离
企业环境中,Linux服务器常作为网关或内部服务节点,防火墙配置需要更精细。
- 使用iptables的FORWARD链控制不同子网间的互访。
- 配置NAT转发实现上网:
iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE - 使用防火墙限制敏感服务(如数据库)只能从特定应用服务器访问。
- 对于公司内部DNS、DHCP等服务,需要确保防火墙允许相关协议。
开发与测试环境
开发人员经常需要频繁修改端口和规则,建议使用firewalld的运行时配置(不添加–permanent),方便测试。
- 临时放行端口:
firewall-cmd --add-port=3000/tcp - 测试完成后可用
--remove-port移除,无需重启服务。 - 也可以在开发机上使用ufw,简化配置流程。
国内Linux服务器防火墙推荐
国内网络环境有自身特点,比如部分运营商屏蔽了常见端口,云服务器厂商会提供安全组服务,下面针对国内Linux服务器给出推荐和配置要点。
防火墙工具推荐:firewalld依然是首选,因为它在各类国产Linux发行版(如麒麟、统信)上都能良好运行,如果你需要更细粒度的控制,配合nftables使用。
国内云服务器注意事项:
- 简米云、酷番云等云厂商,安全组规则已经实现了类似防火墙的功能,但操作系统防火墙仍然需要配置,用于防止内部横向攻击。
- 由于国内带宽成本较高,防火墙规则中应尽量避免不必要的日志记录,以免产生额外费用。
- 对于国内Linux系统防火墙的推荐,多数运维人员会选择firewalld + iptables的组合,因为文档和社区支持最好。
- 如果使用国产操作系统,如麒麟V10,其内置的防火墙工具兼容firewalld,可以直接使用同一套配置,降低了迁移成本。
地域性配置技巧:
- 如果你的服务器位于国内,且需要对外提供服务,建议使用非标准端口绕过运营商限制(如80端口被封锁时改用8080)。
- 使用防火墙做端口转发:
firewall-cmd --permanent --add-forward-port=port=8080:proto=tcp:toport=80 - 对于海外服务器,运营商限制较少,但仍需注意防火墙规则要配合安全组。
据工信部相关数据,国内超过半数的企业级Linux服务器已启用防火墙,但在个人用户中比例仍较低。业内专家指出,即使有安全组,操作系统防火墙也不应省略,它提供了最后一道防线。
在价格方面,所有Linux防火墙工具均为开源免费,无需额外授权费用,这是相比商业防火墙的一大优势,对于预算有限的中小企业,Linux防火墙免费方案足够满足日常需求。
防火墙配置不是一次性的工作,需要定期审查规则,删除过期条目,将防火墙配置纳入自动化部署流程,可以避免人为漏配。安全无小事,从配置好第一道防火墙开始。
Linux防火墙常见问题与解答
Q:Linux防火墙会影响服务器性能吗?
A:在规则数量不多时,影响可以忽略,若规则数量达到数千条,建议使用nftables或启用IPset,可以显著提升匹配效率。
Q:如何临时关闭防火墙?
A:使用systemctl stop firewalld可立即关闭,但重启后恢复,需永久关闭用systemctl disable firewalld,注意,关闭防火墙会使服务器面临风险,仅建议在排错时临时使用。
Q:iptables和nftables配置可以共存吗?
A:理论上可以,但可能产生冲突,因为内核中的netfilter只能有一套规则生效,现代系统建议只使用一套工具,通过firewalld统一管理是最稳妥的方式。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/511913.html



