linux设置防火墙的核心在于使用firewalld或iptables管理流量。推荐优先使用firewalld,其支持动态修改规则、区域概念直观易用;若需底层控制或老旧系统,则使用iptables。配置firewalld包括检查状态、设置区域、添加服务/端口、重载规则及查看列表;iptables则涉及链规则操作、默认策略设置与规则保存。常见场景包括开放端口、阻止ip、端口转发等,同时需结合ssh加固、selinux/apparmor、系统更新、日志监控等措施构建完整安全体系。

在Linux上设置网络防火墙,核心在于精细化管理进出服务器的网络流量。这通常依赖于内核的netfilter框架,而我们日常操作则通过iptables命令行工具,或是更现代、更抽象的firewalld服务来实现。简单来说,就是告诉你的Linux系统,哪些数据包可以进来,哪些可以出去,哪些应该被无情地丢弃。这是Linux安全防护最基础也是最关键的一环,就像你家大门上的锁,得拧紧了。

对于现代Linux发行版,我个人更倾向于推荐使用firewalld。它比直接操作iptables要友好得多,也更灵活,支持运行时动态修改规则而无需重启服务。当然,如果你在一些较旧的系统上,或者需要极致的底层控制,iptables依然是你的利器。
使用firewalld配置防火墙:

检查firewalld状态:
在大多数新系统上,firewalld通常是默认安装并运行的。
sudo systemctl status firewalld
如果未运行或未安装,你需要:

sudo yum install firewalld # CentOS/RHEL sudo apt install firewalld # Debian/Ubuntu sudo systemctl enable --now firewalld
理解区域(Zones):firewalld的核心概念是“区域”。每个区域定义了一套信任级别和允许的服务/端口。比如,public区域通常用于不信任的外部网络,而internal或trusted区域则用于更受信任的内部网络。
sudo firewall-cmd --get-active-zones sudo firewall-cmd --get-default-zone
你可以为不同的网卡接口绑定不同的区域。
添加服务或端口: 这是最常见的操作。比如,开放SSH(默认端口22)和HTTP(默认端口80)服务。
sudo firewall-cmd --zone=public --add-service=ssh --permanent sudo firewall-cmd --zone=public --add-service=http --permanent sudo firewall-cmd --zone=public --add-service=https --permanent
--permanent参数表示永久生效,否则重启firewalld或系统后规则会失效。
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
重新加载firewalld使永久规则生效:
sudo firewall-cmd --reload
查看当前规则:
sudo firewall-cmd --zone=public --list-all
使用iptables配置防火墙(作为参考,或在firewalld不适用时):
iptables直接操作内核的netfilter规则链。主要有INPUT(入站)、OUTPUT(出站)和FORWARD(转发)链。
查看当前规则:
sudo iptables -L -n -v
允许特定入站连接(例如SSH):
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
这条规则的意思是:在INPUT链的末尾(-A),如果协议是TCP(-p tcp),目标端口是22(--dport 22),就接受(-j ACCEPT)这个数据包。
允许已建立的连接: 这是非常重要的一步,允许已经建立的会话继续通信。
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
设置默认策略(通常是拒绝):
sudo iptables -P INPUT DROP sudo iptables -P FORWARD DROP # 注意:OUTPUT链通常设置为ACCEPT,除非你有特殊需求。 sudo iptables -P OUTPUT ACCEPT
极度小心:在设置默认策略为DROP之前,务必确保你已经允许了SSH等必要的入站连接,否则你可能会把自己锁在外面。
保存iptables规则(不同系统方法不同):iptables的规则默认不会在重启后保留。
sudo yum install iptables-services sudo systemctl enable iptables sudo iptables-save > /etc/sysconfig/iptables
sudo apt install iptables-persistent sudo netfilter-persistent save
这确实是很多Linux用户纠结的问题。我个人觉得,对于大多数日常的服务器管理和应用部署,firewalld无疑是更现代、更省心的选择。它的区域概念让网络安全配置变得直观,你可以很方便地为不同的网络接口或场景定义不同的安全策略。比如,你的服务器可能同时连接着内部信任网络和外部公共网络,firewalld能让你轻松地对这两个接口应用截然不同的规则集。而且,它支持运行时动态修改规则,无需重启服务,这对于生产环境来说简直是福音,能大大减少服务中断的风险。
但如果你需要对网络包进行非常底层、非常精细的控制,或者在一些老旧的Linux系统上工作,iptables依然是你的不二之选。它直接与内核的netfilter模块交互,提供了极致的灵活性和控制力。比如,你想做复杂的NAT(网络地址转换)、流量整形、或者基于特定数据包内容的过滤,iptables能让你写出非常复杂的规则链。它就像一把瑞士军刀,功能强大但需要更深入的理解才能驾驭。我见过不少高级网络工程师,在处理一些特殊网络问题时,最终还是会回到iptables的怀抱。所以,我的建议是:如果你追求易用性和管理效率,选firewalld;如果你需要极致的控制和底层操作,或者系统环境所限,那就深入学习iptables。
说实话,刚开始接触防火墙的时候,那些规则链和动作把我搞得一头雾水。但用多了,你会发现其实也就那么回事,无非就是告诉内核,哪个包该放行,哪个该扔掉。下面我们来看看几个非常实用的配置场景。
开放特定服务端口: 这是最最常见的需求,比如你要部署一个Web服务,需要开放80和443端口;或者你的应用跑在某个自定义端口上。
firewalld示例(开放HTTP和自定义端口):sudo firewall-cmd --zone=public --add-service=http --permanent sudo firewall-cmd --zone=public --add-service=https --permanent sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent sudo firewall-cmd --reload
这里--permanent很重要,别忘了它,否则重启就没了。
iptables示例(开放HTTP和自定义端口):sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT # 别忘了保存规则,否则重启后会丢失 # sudo netfilter-persistent save 或 sudo service iptables save
阻止某个IP地址的访问: 当你的日志里出现某个IP地址频繁恶意扫描或攻击时,直接把它拉黑是最直接的办法。
firewalld示例(阻止IP 192.168.1.100):sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" drop' --permanent sudo firewall-cmd --reload
rich-rule提供了更强大的规则表达能力。
iptables示例(阻止IP 192.168.1.100):sudo iptables -A INPUT -s 192.168.1.100 -j DROP # 这条规则应该放在允许规则的前面,否则可能不生效 # sudo iptables -I INPUT 1 -s 192.168.1.100 -j DROP # 插入到第一条
端口转发(NAT): 如果你想将外部访问某个端口的请求转发到内部的另一个端口或另一台机器上,这在Docker容器或内网服务对外暴露时很常用。
firewalld示例(将外部80端口转发到内部192.168.1.200的8080端口):sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.200 --permanent # 还需要开启IP转发功能 sudo sysctl -w net.ipv4.ip_forward=1 echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf sudo firewall-cmd --zone=public --add-masquerade --permanent # 开启伪装,用于NAT sudo firewall-cmd --reload
iptables示例(将外部80端口转发到内部192.168.1.200的8080端口):sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.200:8080 sudo iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -j ACCEPT # 同样需要开启IP转发 sudo sysctl -w net.ipv4.ip_forward=1 echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf # 如果是本机转发到本机端口,则不需要DNAT,直接REDIRECT # sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
端口转发涉及到NAT表,稍微复杂一些,但功能非常强大。
光靠防火墙可不够,那只是第一道防线。很多时候,真正的麻烦来自内部,或者那些看似不经意的配置漏洞。我见过不少服务器,防火墙配置得滴水不漏,结果SSH弱口令直接被爆破了,那真是防不胜防啊。所以,除了防火墙,还有一些“坑”和“技巧”是你在Linux安全防护中必须考虑的:
SSH服务强化: 这是远程管理服务器的命脉,也是最容易被攻击的入口。
/etc/ssh/sshd_config:PasswordAuthentication no
PermitRootLogin no
Port 2222 (改成你喜欢的非标准端口)fail2ban:
这是一个非常有用的工具,它能监控日志文件,发现多次登录失败的IP,然后自动将其添加到防火墙黑名单中,阻止进一步的尝试。sudo apt install fail2ban # Debian/Ubuntu sudo yum install fail2ban # CentOS/RHEL sudo systemctl enable --now fail2ban
SELinux或AppArmor: 这些是Linux内核级别的强制访问控制(MAC)系统,提供了比传统DAC(自主访问控制,如文件权限)更细粒度的安全策略。它们能限制进程能访问的文件、端口等资源,即使程序被攻破,也能大大限制其破坏范围。
sestatus # 查看SELinux状态 setenforce 1 # 开启Enforcing模式
sudo aa-status # 查看AppArmor状态
学习并适当配置它们,能为你的系统提供额外的安全层。
定期更新系统和应用: 老生常谈,但非常重要。很多漏洞都是通过旧版本软件的已知缺陷被利用的。
sudo apt update && sudo apt upgrade # Debian/Ubuntu sudo yum update # CentOS/RHEL
打补丁是防御已知攻击最有效的方式之一。
日志监控与审计:
防火墙日志、系统日志(/var/log/auth.log或/var/log/secure)、应用日志,都是发现异常行为的关键线索。建立一个完善的日志管理和监控机制,比如使用ELK Stack或Splunk,能让你在第一时间发现潜在的攻击。
最小化安装原则: 只安装你需要的服务和软件包。安装的软件越多,潜在的攻击面就越大。能不装的,就别装。
安全是一个持续的过程,没有一劳永逸的方案。防火墙是基础,但绝不是全部。结合其他安全实践,才能真正构建起一个健壮的Linux防护体系。
以上就是Linux如何设置网络防火墙?_Linux安全防护实战技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号