从零掌握iptables:Linux防火墙的核心原理与实战规则

发布时间:2026/10/21 8:09:59
从零掌握iptables:Linux防火墙的核心原理与实战规则 1. 从零开始理解iptables它到底解决了什么问题搞 Linux 运维或者开发的人迟早都会碰到 iptables。我第一次真正正视它是因为一台测试服务器莫名其妙连不上外网排查到最后发现是别人在机器上顺手敲了一条默认拒绝 INPUT 链的命令把自己关在了门外。那会儿才意识到防火墙不是装个图形界面点点点真正的底层控制是靠 iptables 这套规则框架来完成的。iptables 是什么一句话说清楚它是 Linux 内核 netfilter 模块的命令行管理工具。netfilter 是内核里真正干活的那套数据包处理框架iptables 只是用户态下用来往这个框架里添加、删除、修改规则的接口。你通过 iptables 写的每一条规则最终都会被翻译成内核里数据包流向的匹配与动作指令。它能解决什么问题往大了说有三类包过滤决定哪些数据包可以进来、哪些可以出去基于 IP、端口、协议、网卡等条件。网络地址转换NAT做内网共享上网源地址转换、端口映射目的地址转换这是家用路由器和云主机安全组底层的经典原理。流量标记和修改给特定包打标记配合路由策略实现策略路由修改 TTL、TOS 等报文头字段做特殊场景的流量控制。适合谁来学如果你是 Linux 运维、后端开发、网络工程或者做云原生相关工作的iptables 绝对绕不开。即使你平时用的是云厂商的安全组那只是更方便的白名单控制底层在 Linux 主机上依然需要理解规则的表达逻辑。入门学的不是背诵命令而是搞懂它怎么思考数据包从哪来、到哪去、路过哪条链、该怎么处置。需要先说明一点iptables 虽然正在被新一代的 nftables 取代但在存量服务器、各类教程、老系统维护中仍然是绝对主流。理解 iptables不光是为了操作老机器更是为了理解整个 Linux 网络数据包处理的基础心智模型。这套模型一旦建立再学 nftables、firewalld、甚至云安全组都会觉得是一通百通。2. 一张图看懂iptables的骨架表、链、规则怎么配合iptables 入门最大的门槛不是命令复杂而是它的名词体系容易让人头晕。表、链、规则、匹配、目标乍一看像绕口令。我用一个生活类比来拆解数据包就像一辆货车防火墙规则就是货运公司的分拣流程表是按照业务类型划分的不同分拣车间链是车间里的传送带规则是传送带上的每一个分拣指令。2.1 四张表filter、nat、mangle、raw各管哪一摊iptables 默认有四张表精度从高到低依次是 raw、mangle、nat、filter。绝大部分场景你只会用到 filter 和 nat但另外两张也得知道是干嘛的。filter 表做的是纯粹的允许/拒绝裁决也就是包过滤。字段是 ACCEPT、DROP、REJECT 这些动作。日常写的防火墙规则里八成都是 filter 表的。nat 表负责修改数据包的源地址或目的地址实现 NAT。它里面的动作主要是 SNAT、DNAT、MASQUERADE、REDIRECT。只要你做了端口映射、内网上网共享走的必然是这张表。mangle 表负责修改数据包的 QoS 字段比如 TTL、TOS以及给包打 mark 标记。它不太常用但在策略路由场景里几乎是必需的。raw 表优先级最高负责决定数据包是否要进入连接跟踪机制。日常运维基本碰不到除非你遇到性能优化或特殊绕过场景。2.2 五条链数据包必经的“检查站”链是规则的容器。iptables 内置了五条链分别对应数据包流经的检查点INPUT数据包进入本机的检查点。OUTPUT本机发出数据包的检查点。FORWARD数据包经过本机转发不进入本机应用的检查点。PREROUTING数据包刚进入网卡路由决策之前做处理。主要用于 DNAT 和 mangle。POSTROUTING数据包即将离开本机网卡前做处理。主要用于 SNAT 和 MASQUERADE。理解数据包走哪条链是写出靠谱规则的起点。数据包发往本机走的是 PREROUTING - INPUT - 应用数据包从本机发出去走的是 OUTPUT - POSTROUTING数据包作为中转被转发走的是 PREROUTING - FORWARD - POSTROUTING。2.3 规则的匹配顺序先看链再看规则号同一张表同一条链里的规则从上到下逐条匹配。数据包命中了某条规则就立刻执行该规则指定的动作不再继续往下看。这就是所谓的“匹配即停止”。这个特性极其重要因为它意味着规则顺序本身就是一种逻辑。如果你不小心把“全部放行”写在了“封禁某个 IP”的前面那条封禁规则就永远不会生效。这也是新手最容易踩的坑。很多人以为防火墙规则像云安全组那样无序求和实际上 iptables 规则是线性扫描。你可以用-I把规则插到最前面用-A把规则追加到最后面。想让某条规则优先生效就得用-I。我在实际布控中习惯把规则分成三类按顺序组织先放行已建立的连接状态匹配规则再放行明确要开放的端口和服务最后兜底拒绝所有其他流量。这个顺序既符合常规业务逻辑又不会把自己锁在门外。2.4 匹配与目标规则的两段式结构每一条 iptables 规则可以拆成两段看匹配条件 目标动作。匹配条件包括协议-p如 tcp/udp/icmp、源地址-s、目的地址-d、源端口--sport、目的端口--dport、进入网卡-i、流出网卡-o、连接状态-m state --state等。这些条件可以组合使用多个条件之间的关系是“并且”必须同时满足才算命中。目标动作主要有ACCEPT放行。DROP丢弃不回任何消息。表现是连接超时。REJECT拒绝并通过 ICMP 或 TCP RST 告知对端。表现是立即被拒。LOG记录日志继续匹配下一条规则。SNAT修改源地址常用于内网上网。DNAT修改目的地址常用于端口映射。MASQUERADE动态 SNAT适用于出口 IP 不固定的情况如拨号上网。REDIRECT在本机内做端口重定向。提示DROP 和 REJECT 的选择是有讲究的。对外服务端口建议用 REJECT客户端能立刻感知失败对疑似恶意扫描的来源直接用 DROP让对方慢慢超时增加对方的探测成本。3. 动手实操从零开始写第一条iptables规则前面框架理解了后面就顺了。这一节我带你把常用的 iptables 场景从头到尾操作一遍。环境假设是一台 CentOS 7/8 或兼容系统的 Linux 主机你有一个 root 权限的终端。建议先开一台虚拟机来练习别直接在线上业务机器上试。3.1 查看当前规则动手之前先摸清家底不管你要干什么第一步永远是看现状。查看规则的命令有两个常用姿势# 查看所有表的全部规则带详细信息 iptables -L -n -v # 只用最精简的方式看看当前 filter 表 iptables -L -n参数含义说明-L是列出规则-n表示不做域名反解直接用 IP 和端口显示不加-n会尝试反解域名又慢又容易卡住-v显示更详细的信息包括每个规则匹配了多少包、多少字节还有进入和流出的网卡。执行完你可能看到像下面这样的输出Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0这里有个关键信息Chain INPUT 后面的(policy ACCEPT代表这条链的默认策略是 ACCEPT。如果某条链没有任何规则命中最终就按默认策略处理。很多入门教程不讲策略但实际上它才是防火墙的“最后一道防线”。建议在配置防火墙初期策略先保持 ACCEPT等规则全部写好了最后再把策略改成 DROP。顺序搞反了很容易把自己锁在门外。3.2 最基础的三条规则放行、拒绝、丢弃现在来写真正的规则。三条入门必会# 允许来自 192.168.1.0/24 网段的所有流量访问本机 iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT # 拒绝 10.0.0.5 这个来源 IP 访问本机的 22 端口SSH iptables -A INPUT -s 10.0.0.5 -p tcp --dport 22 -j REJECT # 丢弃所有来自 172.16.0.0/16 网段的流量且不回复任何消息 iptables -A INPUT -s 172.16.0.0/16 -j DROP这条-A INPUT规则要拆开看-A是追加到链尾INPUT是链名-s指定源地址-p tcp限定协议--dport 22限定目的端口-j REJECT指定动作。注意--dport必须配着-p tcp或-p udp一起用单独写目的端口是不生效的因为端口概念只存在于 TCP/UDP 协议里ICMP 没有端口这个概念。这正是新手常见的报错点。3.3 状态防火墙让规则“聪明”起来单纯写死 IP 和端口的规则是静态防火墙实际场景里还不够用。比如你开放了本机的 8080 端口如果只写一条“允许所有访问 8080”那么所有外部请求都能直接打进来一旦有扫描器盯上你压力会很大。更稳妥的做法是配合连接状态跟踪conntrack来写。核心思想是只放行新建立的合法连接以及已经建立的连接和它们的回包。# 放行所有与已建立连接或相关连接相关的流量 iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 放行 SSH 端口的新连接 iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT # 最后拒绝所有其他新连接 iptables -A INPUT -m conntrack --ctstate NEW -j DROP这组规则的逻辑是我不是无条件开放 22 端口而是严格限制只有“新建的到 22 端口的连接”才放行。一旦连接建立后续所有回包都走第一条规则。这就形成了非常经典的有状态防火墙比单纯裸开放端口安全得多同时日志也干净得多。你可能会问为啥回包能自动匹配 ESTABLISHED因为 conntrack 机制维护了一张连接状态表记录每个 TCP/UDP/ICMP 会话的双向元组。内核看到回包会自动关联到已有的连接记录从而命中 ESTABLISHED 规则。这也是为什么 iptables 的 NAT 能工作——没有 conntrack 的映射记录NAT 根本不对称。3.4 内网共享上网与端口映射NAT 的两个高频场景在 Linux 上做 NAT是 iptables 最体现价值的地方之一。两个场景最常碰到内网机器通过这台 Linux 共享上网外部通过公网 IP 访问内网某台机器的服务。先看共享上网源地址转换。# 开启内核 IP 转发 sysctl -w net.ipv4.ip_forward1 echo net.ipv4.ip_forward 1 /etc/sysctl.conf # 让从内网网卡eth1进来的数据出去时统一换成外网网卡eth0的 IP iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE这里要特别说明-t nat和MASQUERADE选择的逻辑。-t参数指定操作哪张表默认是 filter这里必须切到 nat。MASQUERADE会自动获取 eth0 当前的 IP哪怕你动态拨号导致 IP 变了它也能自适应如果你出口 IP 是固定的公网 IP用SNAT更高效因为 MASQUERADE 每次都要额外查一次出口 IP。固定 IP 的写成这样iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j SNAT --to-source 203.0.113.5再看端口映射目的地址转换。# 把公网网卡进来的、访问 80 端口的数据转给内网的 192.168.10.10 这台机器 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.10:80这条规则写在 PREROUTING 链因为必须在路由决策之前就把目的地址改掉否则内核不知道要把包转给谁。配合上面的 SNAT 规则内网机器访问外网和外部访问内网服务就能同时工作了。3.5 规则的查看、删除与持久化临时规则的增删改查很简单# 按规则序号删除。先查出序号 iptables -L INPUT --line-numbers # 假设要删 INPUT 链第 3 条规则 iptables -D INPUT 3 # 清空某条链的所有规则 iptables -F INPUT # 清空所有链的所有规则 iptables -F这里强烈建议删除规则之前一定先--line-numbers看清楚序号。我因为偷懒直接-D INPUT 3删错过规则结果把放行 SSH 的规则删了然后预设的兜底策略又是 DROP当场断连。这种惨痛教训多说无益操作时多看一眼绝对值得。重启机器后手写的 iptables 规则会全部丢失。要持久化需要按发行版方式保存# CentOS / RHEL 系 iptables-save /etc/sysconfig/iptables systemctl enable iptables # Debian / Ubuntu 系 iptables-save /etc/iptables/rules.v4iptables-save的输出是内核里当前全部规则的“导出文件”也可以用它来备份和审计。注意不要直接手改这个文件格式解析繁琐且容易出错规范流程是命令行修改规则 - 验证生效 - 再用 save 覆盖导出。4. 常见问题与排查技巧实录iptables 使用中的坑不少我把实操中反复出现的问题整理成速查表并附上我的排查思路。现象常见原因排查思路规则加进去了不生效规则顺序不对前面有 ACCEPT 兜底把它跳过了iptables -L -n --line-numbers看顺序SSH 突然连不上默认策略被改成 DROP或防火墙里拒绝规则的顺序问题有带外管理/物理控制台先恢复否则重启前先测试SNAT 不生效内网机器上不了网没开启 ip_forward或 FORWARD 链默认策略 DROP确认sysctl net.ipv4.ip_forward检查 FORWARD 链端口映射外部访问不到DNAT 写在 filter 表或 FORWARD 链拦了转发流量确认是-t nat -A PREROUTING再查 FORWARD 链重启后规则没了没做持久化保存iptables-save 文件并设置开机加载加了 DROP 规则应用卡超时DROP 不回包TCP 只能等超时对可识别异常来源可用 REJECT 代替 DROP4.1 规则顺序的“拦路虎”先给你看一个真实的反面案例。有人想把 80 端口开放写了iptables -A INPUT -j DROP iptables -A INPUT -p tcp --dport 80 -j ACCEPT结果外部访问 80 端口依然超时。原因很直白-A是追加到链尾先追加的 DROP 在最上面所有流量都已经被 DROP 了后面那条 ACCEPT 永远轮不到。这类问题用--line-numbers一眼就能看出来。正确逻辑是把放行规则插到 DROP 之前iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT-I后面必须带插入的位置编号不写编号默认插第 1 条。这也解释了为什么强烈建议规则按“放行已建立连接 - 放行必要端口 - 拒绝其他”的顺序编排。4.2 做了端口映射却访问不到多半是FORWARD链漏了每次有朋友跟我反馈“外面访问不了我映射的服务”我第一反应都是让他查 FORWARD 链。原因很简单到达公网网卡的包经过 PREROUTING DNAT 后要由本机内核转发给内网服务器这一步属于 FORWARD不是 INPUT。如果 FORWARD 链默认策略是 DROP或者没有放行相关流量那么 DNAT 之后的包就直接被丢了。典型的完整配置是三段式# 1. DNAT 改写目的地址 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 192.168.10.10:80 # 2. 放行 FORWARD 链的已建立连接流量 iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 3. 放行 FORWARD 链的新连接 iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 80 -j ACCEPT这三条缺一不可。很多时候你只写了第 1 条然后怪 DNAT 不生效实际上是第 2、3 条没写。4.3 别把DROP写进OUTPUT链把自己锁死新手另一个高频误区是为了限制服务器对外访问在 OUTPUT 链上加了大量 DROP然后发现 yum 装不了包、curl 全都超时、DNS 解析失败。常见配置是iptables -A OUTPUT -j DROP iptables -A OUTPUT -p udp --dport 53 -j ACCEPT问题又出在顺序上。而且就算你把 53 端口放行了DNS 返回的包走的是 INPUT 链如果 INPUT 链也是全 DROPDNS 响应依然进不来。写 OUTPUT 链的规则一定要同步考虑 INPUT 链和 conntrack 状态。我的建议是没有特殊需求不要动 OUTPUT 链。服务器主动访问外网是正常行为限制出站是安全加固的手段但属于微调而非入门玩法。先把 INPUT 链管明白比什么都强。4.4 规则量大了怎么看日志调试 iptables 时加LOG规则是定位问题的利器。比如不确定某个来源 IP 的流量有没有到 INPUT可以在链的开头暂时加一条iptables -I INPUT 1 -s 203.0.113.0/24 -j LOG --log-prefix input-check: --log-level 4然后在/var/log/messages或journalctl -f里观察。看到日志后input-check这个前缀可以帮你按 grep 过滤定位到具体包。用完记得删除这条 LOG 规则否则数据量大了磁盘会被日志灌爆。LOG 规则最大的价值是确认数据包是否真的到达某条链。如果包根本没到防火墙规则写得再完美也没用问题多半出在网络链路或者对端。5. 学完iptables之后下一步该怎么走掌握 iptables 之后我建议你再往前走两步让这套知识真正串成体系。第一步是学会 firewalld 和 ufw 这两层“壳”。它们本质上是 iptables或 nftables封装出来的易用层。CentOS 上你敲一条firewall-cmd --zonepublic --add-port80/tcp背后就是自动生成了一条 filter 表 INPUT 链的规则。理解了 iptables 再看这些壳会非常通透所谓 zone 就是一套预设的链和规则集合所谓 rich rule 就是更细的复杂匹配组合。第二步是接触 nftables。内核从 3.13 起就引入了 nftables新一代系统默认都基于它了。nftables 的命令体系更统一配置更简洁优雅但概念模型与 iptables 共用 netfilter 框架表、链、规则这些抽象都能对得上。有了 iptables 的基础学 nftables 只需要懂语法差异不需要重新理解网络原理。我个人在实际操作中的体会是iptables 最珍贵的不是命令本身而是它逼迫你搞清楚“一个数据包在 Linux 内核里到底走了一条什么路”。过去我只知道服务器能上网不知道上网的背后还有 PREROUTING、FORWARD、POSTROUTING 这么多道处理环节。正是因为亲手敲过了 DNAT、SNAT 和 FORWARD 的组合规则我才真正理解了“路由”“转发”“NAT”这三个概念之间的边界与联系。最后再分享一个小技巧在实验环境里练习 iptables 时建议装一个轻量虚拟机快照。每次改规则卡到连不上了直接回滚快照比在物理机上想要怎么接串口恢复要踏实得多。把这个习惯带到生产环境就是先写好规则验证完再持久化永远给 SSH 留一条“救急通道”而不是等到断连了才想为什么。防火墙配置本质上是在写“允许策略”不是写“拒绝清单”想清楚了这一点你离熟练使用 iptables 就不远了。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询