Linux防火墙配置及iptables管理技巧
时间:2025-07-17 13:30:24 134浏览 收藏
本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《Linux防火墙配置与iptables规则管理》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~
配置Linux网络防火墙策略的核心在于使用iptables工具,围绕表、链、规则进行设置。1. 理解四类表的作用:filter表用于过滤流量,nat表处理地址转换,mangle表修改数据包头部,raw表禁用连接跟踪;2. 设置默认策略为INPUT和FORWARD链DROP、OUTPUT链ACCEPT,实现最小权限原则;3. 添加允许规则,包括回环接口、已建立连接、特定服务端口(如SSH、HTTP、HTTPS)、ICMP等,注意规则顺序影响匹配结果;4. 持久化保存规则,在Debian/Ubuntu中使用netfilter-persistent工具自动保存加载,在CentOS/RHEL中手动保存至/etc/sysconfig/iptables并启用服务加载,也可通过自定义脚本实现;5. 利用高级模块如--limit限制流量防攻击、--mac-source基于MAC过滤、--time按时间段控制访问等;6. 配置NAT实现共享上网与端口转发,使用MASQUERADE做SNAT、DNAT映射外部请求、REDIRECT重定向流量。合理运用这些步骤可构建安全高效的网络防护体系。
配置Linux网络防火墙策略,核心在于利用iptables
这个强大的工具来定义和管理流量规则。它就像你家门口的保安,决定哪些人能进来,哪些人能出去,以及谁能把包裹送给谁。理解它的工作原理,就是掌握了网络安全的一把钥匙。

解决方案
iptables
的工作机制围绕着“表”(tables)、“链”(chains)和“规则”(rules)展开。简单来说,数据包进入系统时,会根据预设的路径(链)依次匹配规则,一旦匹配成功,就会执行相应的动作(如接受、丢弃、拒绝)。
基本操作思路:

理解表与链:
- filter表: 这是最常用的表,负责过滤数据包,决定是否允许数据包通过。它包含
INPUT
(流入本机的)、OUTPUT
(本机发出的)和FORWARD
(经过本机转发的)三条默认链。 - nat表: 用于网络地址转换,比如端口转发或共享上网。它有
PREROUTING
(数据包到达前)、POSTROUTING
(数据包离开后)等链。 - mangle表: 用于修改数据包头部,比如TTL值。
- raw表: 用于禁用连接跟踪。
- security表: 用于SELinux集成。
- filter表: 这是最常用的表,负责过滤数据包,决定是否允许数据包通过。它包含
设定默认策略: 出于安全考虑,我个人习惯将
INPUT
和FORWARD
链的默认策略设置为DROP
(直接丢弃数据包,不返回任何信息),而OUTPUT
链通常设置为ACCEPT
。这意味着,除非你明确允许,否则任何进入或试图通过你机器的流量都会被阻止。# 设置默认策略为DROP,确保安全 sudo iptables -P INPUT DROP sudo iptables -P FORWARD DROP sudo iptables -P OUTPUT ACCEPT # 通常允许本机对外连接
添加允许规则: 在默认
DROP
的前提下,你需要逐条添加允许特定流量通过的规则。记住,规则的顺序很重要,iptables
是从上到下依次匹配的,一旦匹配成功就执行动作。- 允许本地回环接口: 允许本机与本机之间的通信。
sudo iptables -A INPUT -i lo -j ACCEPT
- 允许已建立和相关连接: 这是非常关键的一步,允许你发起的连接(比如你访问一个网站)的响应数据包能够回来。
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- 允许特定服务(例如SSH):
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许SSH sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允许HTTP sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 允许HTTPS
- 允许ICMP(ping):
sudo iptables -A INPUT -p icmp -j ACCEPT
- 允许本地回环接口: 允许本机与本机之间的通信。
查看、删除和清空规则:
- 查看所有规则:
sudo iptables -L -n -v
- 清空所有规则(慎用!):
sudo iptables -F # 清空所有链的规则 sudo iptables -X # 删除所有用户自定义链 sudo iptables -Z # 清空所有链的计数器
- 删除特定规则: 可以通过规则编号或精确匹配规则来删除。
sudo iptables -D INPUT 1 # 删除INPUT链的第一条规则 # 或者 sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT # 精确匹配删除
- 查看所有规则:
持久化规则:
iptables
规则默认是临时的,系统重启后会丢失。所以,你需要将它们保存下来。- Debian/Ubuntu系:
sudo apt-get install netfilter-persistent # 安装持久化工具 sudo netfilter-persistent save # 保存当前规则 # 重启后会自动加载
- CentOS/RHEL系:
sudo yum install iptables-services # 安装服务 sudo systemctl enable iptables # 启用服务 sudo iptables-save > /etc/sysconfig/iptables # 保存规则到文件 sudo systemctl restart iptables # 重启服务加载
- Debian/Ubuntu系:
为什么我的iptables规则总是重启就失效?——防火墙规则的持久化之道
这绝对是初学者最常遇到的一个“坑”,我当年也为此挠头不已。你辛辛苦苦敲了一堆规则,测试没问题,一重启机器,防火墙就“裸奔”了。原因很简单:iptables
的规则是存储在内核内存中的,一旦系统关机或重启,这部分内存就会被清空。所以,我们需要一个机制来在系统启动时自动加载这些规则。
持久化规则的方法,其实就是将内存中的规则“固化”到硬盘上的一个文件里,然后在系统启动的某个阶段,再从这个文件里把规则“读”回内存。
主流的Linux发行版都有各自推荐的持久化方案:
Debian/Ubuntu家族: 它们倾向于使用
netfilter-persistent
这个包。安装之后,它会提供一个服务,这个服务会在系统关机时自动调用iptables-save
命令把当前规则保存到/etc/iptables/rules.v4
(IPv4) 和/etc/iptables/rules.v6
(IPv6) 文件中。而在系统启动时,又会自动调用iptables-restore
从这些文件加载规则。你只需要在设置好规则后运行sudo netfilter-persistent save
就行了。这种方式很“傻瓜化”,用起来很省心。CentOS/RHEL家族: 它们过去习惯使用
iptables-services
包。你需要手动执行sudo iptables-save > /etc/sysconfig/iptables
将规则保存到这个特定文件。然后确保iptables
服务是启用并启动的 (sudo systemctl enable iptables && sudo systemctl start iptables
),这样系统启动时,服务会从/etc/sysconfig/iptables
读取并加载规则。现在,新版本更多转向firewalld
,但如果你坚持用iptables
,这个方法依然有效。手动脚本方式: 还有一种更通用的方法,就是自己写一个简单的启动脚本。比如,你可以把所有
iptables
命令写到一个.sh
文件里,然后把这个脚本的执行命令添加到/etc/rc.local
(如果存在且可用) 或者创建一个systemd
服务单元文件,让它在网络服务启动后执行。这种方式更灵活,但对使用者要求更高。
无论哪种方法,核心都是“保存”和“加载”。我建议你在每次对防火墙规则做出重大修改后,都立即进行保存操作。这就像写代码要及时提交一样,避免辛劳白费。
设计一个安全的iptables策略,从何入手?——默认策略与常见链的应用技巧
设计一个真正安全的iptables
策略,绝不是简单地打开几个端口那么简单。在我看来,最核心的理念是“最小权限原则”——只允许你明确需要的,拒绝所有不明确的。
1. 默认策略的“铁律”:
这是构建安全防火墙的第一步,也是最重要的一步。我总是建议将INPUT
和FORWARD
链的默认策略设置为DROP
。
iptables -P INPUT DROP
: 这意味着,所有尝试进入你Linux主机的网络连接,除非有明确的规则允许,否则都会被无声无息地丢弃。攻击者甚至不会知道你的主机是否存在。这是最强的防御姿态。iptables -P FORWARD DROP
: 如果你的Linux主机不作为路由器或网关,那么这条规则是必须的。它阻止了任何数据包通过你的主机转发到其他网络,避免了成为不必要的中间人。iptables -P OUTPUT ACCEPT
: 通常情况下,我们希望本机能够自由地发起对外连接,比如访问网站、更新软件。所以OUTPUT
链通常设置为ACCEPT
。当然,在一些极端安全要求的场景下(比如服务器只允许连接特定的数据库或API),你也可以将OUTPUT
设置为DROP
,然后逐一放行。
2. 规则顺序的重要性:iptables
规则的匹配是线性的,从上到下。一旦一个数据包匹配了某条规则,并且这条规则指定了一个终止动作(如ACCEPT
、DROP
、REJECT
),那么这个数据包就不会再继续匹配后续的规则了。这给我们一个启示:
- 更具体的规则应该放在前面。 例如,如果你想拒绝某个特定IP地址访问SSH,但又想允许所有其他IP访问SSH,那么拒绝特定IP的规则必须放在允许所有IP访问SSH的规则之前。
- 允许规则通常放在拒绝规则之前,但默认策略是拒绝时,允许规则才生效。
3. INPUT
链的精细化管理:
这是你服务器对外服务的“门面”。除了之前提到的允许回环接口和已建立连接之外,你需要根据服务器提供的服务来添加规则:
- SSH (22/tcp): 这是管理服务器的生命线。务必允许。
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
考虑加上源IP限制:sudo iptables -A INPUT -s 你的管理IP/24 -p tcp --dport 22 -j ACCEPT
- HTTP/HTTPS (80/tcp, 443/tcp): 如果是Web服务器,这是必须的。
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
- 其他服务: 数据库(MySQL 3306/tcp, PostgreSQL 5432/tcp)、FTP(21/tcp)、邮件服务(SMTP 25/tcp, POP3 110/tcp, IMAP 143/tcp)等,根据实际需求开放。
- ICMP (ping): 允许ping有助于网络诊断,但也可以为了隐蔽性而拒绝。
sudo iptables -A INPUT -p icmp -j ACCEPT
4. FORWARD
链用于路由和NAT:
如果你的Linux主机是作为路由器、网关或者需要进行端口转发,那么FORWARD
链就会派上用场。
- 允许转发: 你需要允许特定的流量从一个接口转发到另一个接口。
sudo iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
- NAT(下一节会详细讲):
nat
表中的PREROUTING
和POSTROUTING
链是进行地址转换的关键。
5. 状态模块 (-m state
) 的妙用:
这是iptables
最强大的功能之一,也是构建现代防火墙的基础。--state ESTABLISHED,RELATED
规则允许所有已经建立连接的响应流量通过。这意味着你不需要为每个对外发起的连接(比如你用wget
下载文件)都单独开一个入站端口,只要是你主动建立的连接,其回传的数据包就能被允许。这大大简化了规则集,同时也提高了安全性。
面对复杂的网络环境,iptables还能做什么?——高级匹配与NAT配置探秘
iptables
的强大之处远不止于简单的端口和IP过滤。当面对更复杂的网络需求,比如内网共享上网、端口映射、甚至简单的DDoS防护时,它都能派上用场。
1. 高级匹配条件:
除了基于源/目的IP和端口,iptables
还支持很多高级匹配模块,让规则更加精细化。
--mac-source
: 基于MAC地址匹配。sudo iptables -A INPUT -m mac --mac-source 00:11:22:33:44:55 -j ACCEPT
(注意:MAC地址容易伪造,不应作为主要安全手段,但在局域网内有一定作用。)--limit
和--burst
: 流量限制,常用于防止暴力破解或DDoS攻击。比如,限制SSH连接尝试的频率。sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 5/minute --limit-burst 10 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j DROP
这条规则的意思是:每分钟最多允许5个新的SSH连接尝试,突发峰值可达10个。超过这个限制的连接尝试会被丢弃。这能有效缓解针对SSH的暴力破解攻击。--string
: 匹配数据包中的字符串。这个功能比较耗费CPU,通常用于非常特定的场景,比如阻止包含特定关键词的HTTP请求(但更推荐使用专业的Web应用防火墙)。sudo iptables -A FORWARD -m string --algo bm --string "bad_word" -j DROP
--time
: 基于时间段匹配。sudo iptables -A INPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 17:00:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT
(只在工作日工作时间允许HTTP访问)--conntrack
: 结合连接跟踪,可以匹配连接的更多状态信息,比如连接的字节数、包数等。
2. NAT (Network Address Translation) 配置:
NAT是iptables
在nat
表中提供的核心功能,它允许我们修改数据包的源IP或目的IP(有时也包括端口)。这在构建内网共享上网、端口转发等场景中至关重要。
SNAT (Source NAT) / Masquerading: 最常见的应用是让内网的机器通过一台Linux网关访问互联网。内网机器发出的数据包,其源IP会被网关的公网IP所取代。当响应数据包返回时,网关再将其目的IP改回内网机器的IP。 通常在
POSTROUTING
链上操作,使用MASQUERADE
目标。 假设你的公网接口是eth0
,内网是eth1
:sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
同时,你还需要确保Linux内核开启了IP转发:
sudo sysctl -w net.ipv4.ip_forward=1
并将此设置写入/etc/sysctl.conf
以持久化。DNAT (Destination NAT): 也叫端口转发或端口映射。当外部网络访问你公网IP的某个端口时,
iptables
可以将这个连接的目的IP和端口修改为内网中另一台机器的IP和端口。 通常在PREROUTING
链上操作。 例如,将公网IP的80端口请求转发到内网服务器192.168.1.100
的80端口:sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80
如果你希望网关本身也能访问到这个转发后的服务,可能还需要在
OUTPUT
链上加一条规则(这取决于你的iptables
版本和内核)。REDIRECT: 这是
DNAT
的一种特殊形式,它将数据包重定向到本机的一个端口。常用于强制HTTP流量到代理服务器,或者将所有HTTP请求重定向到HTTPS。sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
(将所有到80端口的请求重定向到本机的8080端口)
iptables
的配置确实需要一些耐心和细致,尤其是当你面对复杂的网络拓扑时。但一旦你掌握了它的基本原理和常用模块,你会发现它在网络安全和管理方面,能给你带来极大的自由度和控制力。记住,在生产环境中修改防火墙规则前,务必做好备份,并在测试环境中充分验证。
文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Linux防火墙配置及iptables管理技巧》文章吧,也可关注golang学习网公众号了解相关技术文章。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
254 收藏
-
325 收藏
-
249 收藏
-
236 收藏
-
256 收藏
-
211 收藏
-
205 收藏
-
415 收藏
-
243 收藏
-
186 收藏
-
253 收藏
-
203 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习