Linux 防火墙 iptables 的简介和配置详解
前言现代 Linux 发行版逐渐转向 nftables但 iptables 仍是底层基础。理解其原理对排查 Kubernetes 网络、云平台安全组问题至关重要。配置时务必牢记规则顺序 表链职责 持久化三大核心逻辑。本文将以 iptables 为主进行简单的介绍并详解下配置方法。回到顶部一、什么是 iptables1.1 iptables 简介iptables 是 Linux 内核 Netfilter 框架的用户空间管理工具通过四表五链结构实现数据包过滤、网络地址转换NAT和流量控制。其核心特点是规则按顺序匹配、匹配即执行、默认不持久化配置错误可能导致服务中断或安全风险。1.2 四张规则表按数据包处理优先级排序表名 优先级 核心作用 典型场景 内置链raw 最高 控制连接跟踪conntrack豁免 高性能服务DNS/NTP跳过状态跟踪 PREROUTING、OUTPUTmangle 第二 修改数据包头部字段TTL/TOS等 流量标记、QoS策略、P2P限速 五链全覆盖nat 第三 地址转换SNAT/DNAT不可过滤 端口转发、内网共享公网IP上网 PREROUTING、POSTROUTING、OUTPUTfilter 最低 访问控制过滤默认表 开放/拒绝端口、拦截非法访问 INPUT、OUTPUT、FORWARD注意nat 表处理地址转换不决定数据包放行与否filter 表决定放行/拒绝不修改地址。若在 nat 表中添加 DROP 规则规则不会生效。1.3 五条规则链数据包处理节点数据包在内核网络栈中的流动路径决定了其匹配的链链名称 触发时机 典型应用场景PREROUTINGpre routing 数据包刚进入网卡路由决策前 DNAT、打标记INPUTinput 目标为本机进程的流量 SSH、Web 服务FORWARDforward 需跨网卡转发的流量 NAT 网关OUTPUToutput 本机主动发出的流量 curl 请求POSTROUTINGpost routing 数据包离开网卡前 SNAT、地址伪装规则匹配逻辑数据包按顺序逐条匹配规则一旦命中即执行动作并终止后续检查。规则顺序决定逻辑成败若先配置 DROP 再配置 ACCEPTACCEPT 规则将永远不生效。回到顶部二、Linux 环境配置2.1 基础配置流程以 filter 表为例1清空现有规则生产环境避免直接清空应先备份iptables-save /root/iptables-bak.shiptables -F # 清空 filter 表所有链iptables -t nat -F # 清空 nat 表规则2设置默认策略调试阶段建议先宽松调试完成后再收紧策略iptables -P INPUT DROP效果除非明确放行否则一律拒绝iptables -P INPUT ACCEPT # 先允许所有入站调试用iptables -P FORWARD DROP # 转发链默认拒绝3按逻辑顺序添加规则顺序示例Web 服务器1. 允许本地回环必须最先配置iptables -A INPUT -i lo -j ACCEPT2. 放行已建立连接确保响应流量不被拦截iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT3. 按需开放服务端口如SSH、HTTPiptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT # 仅允许指定内网网段的机器通过 SSH 连接到服务器-A INPUT将规则追加Append到 INPUT 链的末尾。INPUT 链负责处理所有进入本机的数据包-p tcp指定匹配的协议为 TCP。SSH 服务基于 TCP 协议因此必须指定–dport 22指定目标端口Destination Port为 22。这是 SSH 服务的默认端口-s 192.168.1.0/24指定数据包的来源 IPSource192.168.1.0/24 代表 192.168.1.1 到 192.168.1.254 这个整个 C 类子网这意味着只有这个局域网网段内的机器才能匹配此规则-j ACCEPT指定匹配到该规则后的动作Jump为接受ACCEPT即允许数据包通过iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 开放 HTTP 服务端口允许任何来源的 IP 访问服务器的 Web 服务-A INPUT同样将规则追加到 INPUT 链的末尾-p tcp指定协议为 TCP因为 HTTP 服务基于 TCP 协议–dport 80指定目标端口为 80这是 Web 服务的标准端口-j ACCEPT允许匹配的数据包通过。由于这里没有使用 -s 参数限制来源 IP因此它默认对所有来源 IP 生效4. 最后添加兜底拒绝iptables -A INPUT -j DROP # 必须放在末尾注意-A 表示追加到链尾-I 表示插入链首如优先拦截恶意 IP-I INPUT -s 1.2.3.4 -j DROP。状态模块写法新系统用 -m conntrack --ctstate旧系统用 -m state --state2.2 NAT 配置示例1端口转发将外部访问 8080 端口转发到内网 192.168.1.50:80iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.50:80-t nat指定操作 nat 表网络地址转换表-A PREROUTING在 PREROUTING 链追加规则。该链在数据包刚进入网卡、还未进行路由判断前生效-p tcp --dport 8080匹配目标端口为 8080 的 TCP 协议流量-j DNAT --to-destination 192.168.1.50:80执行目标地址转换DNAT将数据包的目标 IP 和端口改写为内网主机 192.168.1.50 的 80 端口必须同步配置 filter 表的 FORWARD 链否则流量被拦截iptables -A FORWARD -d 192.168.1.50 -p tcp --dport 80 -j ACCEPT-A FORWARD在默认的 filter 表的 FORWARD 链追加规则。该链专门用于控制经过本机转发的数据包-d 192.168.1.50 -p tcp --dport 80 -j ACCEPT明确允许目标为 192.168.1.50:80 的 TCP 流量通过如果不加这条规则即使 NAT 转换了地址数据包也会因为默认防火墙策略被拦截iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT-m conntrack --ctstate ESTABLISHED,RELATED使用连接追踪模块匹配状态为“已建立”或“相关”的连接这确保了内网服务器返回给外部客户端的响应数据包能够顺利通过防火墙2共享上网SNAT内网 192.168.1.0/24 通过公网 IP eth0 上网echo 1 /proc/sys/net/ipv4/ip_forward # 开启内核转发临时开启 Linux 内核的 IP 转发功能此命令重启后会失效。若需永久生效需编辑 /etc/sysctl.conf 文件写入 net.ipv4.ip_forward1并执行 sysctl -p 使其生效iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE-A POSTROUTING在 POSTROUTING 链追加规则。该链在数据包即将离开网卡前生效-s 192.168.1.0/24 -o eth0匹配源网段为 192.168.1.0/24 且从 eth0 网卡通常是外网接口发出的数据-j MASQUERADE执行源地址伪装SNAT 的一种动态形式它会自动将内网数据包的源 IP 替换为 eth0 接口当前的公网 IP这样外部网络才能正确将响应数据返回给这台网关服务器再由服务器转发给内网主机这套组合拳是构建 Linux 软路由和网关的标准范式内核转发提供基础能力NAT 表DNAT/SNAT负责改写数据包的源/目标地址而 FORWARD 链则充当“交通警察”决定这些被改写地址的数据包是否被允许放行。2.3 在现有规则指定位置加一条、末尾加一条【在指定的匹配规则后边新增一条】1查看当前规则及序号使用 --line-numbers 参数查看现有规则的行号iptables -L INPUT -n -v --line-numbers2在指定位置插入新规则假设要在 INPUT 链的第 3 条规则之后添加新规则那么你需要将新规则插入到第 4 个位置在 INPUT 链的第 4 个位置插入一条允许 80 端口的规则iptables -I INPUT 4 -p tcp --dport 80 -j ACCEPT注如果不指定具体序号-I INPUT 默认会将规则插入到链的【最顶端】即第 1 位【在 INPUT 链的末尾追加一条规则】iptables -A INPUT -p tcp --dport 80 -j ACCEPT使用 -A 参数将新规则追加到整条链的末尾回到顶部三、特别注意事项3.1 规则顺序与逻辑陷阱默认策略风险直接设置iptables -P INPUT DROP可能导致 SSH 断连若未提前放行 SSH 规则。安全做法先添加 ACCEPT 规则最后再设置默认拒绝。状态跟踪依赖ESTABLISHED 规则需放在服务端口规则之前否则响应流量被拦截。3.2 持久化配置避免重启失效CentOS/RHELiptables-save /etc/sysconfig/iptablessystemctl enable iptables # 确保服务开机自启Debian/Ubuntuiptables-save /etc/iptables/rules.v4apt install iptables-persistent -y # 安装持久化工具验证方法重启后执行 iptables -L -n -v检查规则是否加载。3.3 常见错误排查1规则不生效可能的原因规则顺序错误如 DROP 在 ACCEPT 之前。表链混淆如在 filter 表配置 DNAT。未启用连接跟踪模块nf_conntrack。诊断命令iptables -L INPUT -n -v --line-numbers # 查看匹配计数lsmod | grep nf_conntrack # 检查状态跟踪模块2紧急恢复方案若配置错误导致断连通过控制台执行iptables -P INPUT ACCEPT # 临时放行所有入站iptables -F # 清空规则谨慎使用3尝试执行 iptables 脚本报错command not found// 【在执行 iptables 脚本前的准备工作】// 1. 备份当前规则以防万一需要回滚iptables-save /tmp/iptables_backup.rules// 2. 清空 filter 表默认表的所有规则和自定义链iptables -Fiptables -X// 3. 清空其他常用表如 NAT 表iptables -t nat -Fiptables -t nat -X// 4. 重置默认策略建议先设为 ACCEPT防止清空规则后自己断网iptables -P INPUT ACCEPTiptables -P FORWARD ACCEPTiptables -P OUTPUT ACCEPT// 【尝试执行 iptables 脚本报错】[rootlocalhost ~]# sudo /bin/iptables.shsudo: /bin/iptables.sh: command not found// 检查文件存在[rootlocalhost ~]# ls -l /bin/iptables.sh-rw-r–r-- 1 root root 1484 Jul 13 13:49 /bin/iptables.sh// 只有读r和写w权限缺少了执行x权限。// 在 Linux 中如果一个脚本没有执行权限直接运行它时系统就会提示 command not found。// 【解决】添加执行权限[rootlocalhost ~]# chmod x /bin/iptables.sh[rootlocalhost ~]# ls -l /bin/iptables.sh-rwxr-xr-x 1 root root 1484 Jul 13 13:49 /bin/iptables.sh// 执行脚本[rootlocalhost ~]# sudo /bin/iptables.sh// 查看当前配置[rootlocalhost ~]# sudo iptables -LChain INPUT (policy ACCEPT)target prot opt source destinationACCEPT all – localhost localhostACCEPT all – anywhere anywhere state RELATED,ESTABLISHEDACCEPT tcp – x.x.x.x anywhere tcp dpt:mysql。。。。3.4 配置关键点最小权限原则仅开放必要端口并严格限制来源 IP如–dport 22 -s 192.168.1.0/24。先查后改操作前用iptables -L -n -v --line-numbers查看当前规则。避免直接修改默认策略优先用 DROP 规则兜底而非iptables -P INPUT DROP。生产环境先测试在非关键时段配置并通过 ping、telnet 验证连通性。备份与注释为复杂规则添加注释-m comment --comment “允许DBA访问”并定期备份规则文件。回到顶部四、小小的总结iptables 作为 Linux 防火墙核心通过四表五链实现数据包控制。核心逻辑在于规则顺序决定生效结果匹配即停止四表raw、mangle、nat、filter按优先级处理五链如PREROUTING、INPUT、FORWARD对应数据包流向需严格区分表链职责如nat 表仅转换地址filter 表决定放行。配置实操需遵循“先清规则、设默认、添策略”流程测试环境可清空规则生产环境先备份默认策略建议调试期设为 ACCEPT完成后收紧为 DROP规则顺序务必先放行基础流量如回环、已建立连接再开放服务端口最后兜底拒绝。NAT 配置需同时操作 nat 表如DNAT、SNAT和 filter 表的 FORWARD 链确

相关新闻

Introduction设计:技术文档的认知对齐与场景化漏斗模型

Introduction设计:技术文档的认知对齐与场景化漏斗模型

1. 项目概述:当标题只剩一个单词时,我们到底在面对什么“Introduction”——这个词本身就像一块未经打磨的原石,表面光滑却棱角模糊,既不是技术方案,也不是成品交付物,更不是某个具体功能模块的命名。它出现…

2026/7/19 4:35:35阅读更多 →
基于OSGEARTH3与GDAL的C++ 3D地球引擎开发实战

基于OSGEARTH3与GDAL的C++ 3D地球引擎开发实战

1. 项目概述:从零构建一个3D地球引擎如果你是一名C开发者,同时对地理信息系统(GIS)或三维可视化感兴趣,那么“用代码画出一个能交互的地球”这个想法,可能不止一次在你脑海中闪过。过去,这通常意…

2026/7/19 4:35:35阅读更多 →
Markdown入门指南

Markdown入门指南

Markdown 入门完全指南 本文系统整理 Markdown 常用语法,从基础排版到高级扩展,助你快速掌握这门简洁高效的标记语言。 一、标题 Markdown 支持六级标题,在文字前加 # 即可,# 的数量对应标题级别: # 标题1 ## 标题2 …

2026/7/19 4:35:35阅读更多 →
Zygisk-Il2CppDumper实战:动态提取Unity游戏内存元数据逆向分析指南

Zygisk-Il2CppDumper实战:动态提取Unity游戏内存元数据逆向分析指南

1. 项目概述:为什么我们需要Zygisk-Il2CppDumper?如果你正在尝试分析一款安卓上的Unity游戏,并且已经尝试过传统的静态分析工具,大概率会遇到一堵墙:游戏的核心逻辑被编译成了libil2cpp.so和global-metadata.dat&#…

2026/7/19 20:08:20阅读更多 →
DSView信号分析实战:从调试困境到高效解决方案的进阶指南

DSView信号分析实战:从调试困境到高效解决方案的进阶指南

DSView信号分析实战:从调试困境到高效解决方案的进阶指南 【免费下载链接】DSView An open source multi-function instrument for everyone 项目地址: https://gitcode.com/gh_mirrors/ds/DSView 在嵌入式开发和硬件调试的世界里,信号分析工具的…

2026/7/19 20:08:20阅读更多 →
从零实现C++异步IO库:深入理解Reactor模式与高性能网络编程

从零实现C++异步IO库:深入理解Reactor模式与高性能网络编程

1. 项目概述:为什么我们需要亲手打造一个C异步IO库? 在C高性能服务端开发的深水区,IO操作永远是性能瓶颈最集中的地方。无论是处理海量的网络连接,还是读写大文件、访问数据库,同步阻塞式的IO模型都会让我们的CPU在等待…

2026/7/19 20:08:20阅读更多 →
嵌入式DSS显示子系统:YUV旋转、时序控制与CPR色彩校正实战

嵌入式DSS显示子系统:YUV旋转、时序控制与CPR色彩校正实战

1. 项目概述:DSS显示子系统的核心价值在嵌入式设备上实现流畅、稳定且色彩准确的图形显示,从来都不是一件简单的事。从早期的单片机点阵屏到如今智能手机上动辄2K、120Hz的高刷屏,背后都离不开一个核心硬件模块——显示子系统(Dis…

2026/7/19 20:08:20阅读更多 →
C++并发编程实战:高级线程管理与异步任务处理

C++并发编程实战:高级线程管理与异步任务处理

1. 项目概述:从“管理”到“驾驭”的思维跃迁当你在C并发编程的世界里摸爬滚打一阵子后,可能会发现一个现象:创建线程(std::thread)和等待线程(join)只是入门。真正的挑战,往往始于你…

2026/7/19 20:08:20阅读更多 →
C语言跨平台开发实战:从架构设计到CMake构建与调试

C语言跨平台开发实战:从架构设计到CMake构建与调试

1. 项目概述:为什么C语言跨平台开发在今天依然重要?干了十几年C语言开发,从单片机到服务器,从Windows桌面应用到Linux后台服务,我几乎踩遍了所有平台移植的坑。今天看到这个标题,我特别想聊聊“C语言跨平台…

2026/7/19 20:06:20阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/18 22:49:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/19 14:50:26阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/19 18:50:36阅读更多 →