Linux防火墙设置与安全防护技巧
时间:2025-07-28 18:20:29 223浏览 收藏
还在为Linux服务器安全担忧?本教程为你详解Linux防火墙设置,助你打造坚固的安全防线!本文重点介绍如何利用firewalld和iptables管理网络流量,推荐使用更易用、灵活的firewalld,通过检查状态、配置区域、添加服务/端口等步骤,轻松实现端口开放、IP阻止等常见场景。若需底层控制或在老旧系统上操作,iptables依然是利器。除了防火墙配置,本文还分享SSH加固、SELinux/AppArmor、系统更新、日志监控等安全技巧,助你构建完整的Linux安全体系,有效防御网络攻击,保障服务器稳定运行。掌握这些Linux防火墙设置与安全技巧,让你的服务器安全无忧!
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
或系统后规则会失效。 - 开放特定端口:
如果你想开放一个非标准端口,比如一个应用运行在TCP 8080端口:
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
的规则默认不会在重启后保留。- CentOS/RHEL:
sudo yum install iptables-services sudo systemctl enable iptables sudo iptables-save > /etc/sysconfig/iptables
- Debian/Ubuntu:
sudo apt install iptables-persistent sudo netfilter-persistent save
- CentOS/RHEL:
firewalld和iptables,我该选哪个?
这确实是很多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表,稍微复杂一些,但功能非常强大。
除了防火墙,Linux安全防护还有哪些坑和技巧?
光靠防火墙可不够,那只是第一道防线。很多时候,真正的麻烦来自内部,或者那些看似不经意的配置漏洞。我见过不少服务器,防火墙配置得滴水不漏,结果SSH弱口令直接被爆破了,那真是防不胜防啊。所以,除了防火墙,还有一些“坑”和“技巧”是你在Linux安全防护中必须考虑的:
SSH服务强化: 这是远程管理服务器的命脉,也是最容易被攻击的入口。
- 禁用密码登录,只允许密钥登录: 这是最强的防护,杜绝了暴力破解。
修改
/etc/ssh/sshd_config
:PasswordAuthentication no
- 禁用root用户直接登录:
PermitRootLogin no
- 修改默认SSH端口:
虽然不能阻止有心人的端口扫描,但能过滤掉大量的脚本小子。
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(自主访问控制,如文件权限)更细粒度的安全策略。它们能限制进程能访问的文件、端口等资源,即使程序被攻破,也能大大限制其破坏范围。
- SELinux: 复杂但强大,尤其在CentOS/RHEL上是默认开启的。
sestatus # 查看SELinux状态 setenforce 1 # 开启Enforcing模式
- AppArmor: 相对简单易用,在Ubuntu等系统上常见。
sudo aa-status # 查看AppArmor状态
学习并适当配置它们,能为你的系统提供额外的安全层。
- SELinux: 复杂但强大,尤其在CentOS/RHEL上是默认开启的。
定期更新系统和应用: 老生常谈,但非常重要。很多漏洞都是通过旧版本软件的已知缺陷被利用的。
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防火墙设置与安全防护技巧》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多文章知识!
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
443 收藏
-
312 收藏
-
180 收藏
-
488 收藏
-
501 收藏
-
146 收藏
-
385 收藏
-
109 收藏
-
370 收藏
-
392 收藏
-
119 收藏
-
354 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习