<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:wfw="http://wellformedweb.org/CommentAPI/">
<channel>
<title>ikn0w1T&#039;s blog - iptables</title>
<link>https://blog.lihan.cyou/index.php/tag/iptables/</link>
<atom:link href="https://blog.lihan.cyou/index.php/feed/tag/iptables/" rel="self" type="application/rss+xml" />
<language>zh-CN</language>
<description></description>
<lastBuildDate>Thu, 04 Sep 2025 19:26:00 +0800</lastBuildDate>
<pubDate>Thu, 04 Sep 2025 19:26:00 +0800</pubDate>
<item>
<title>iptables</title>
<link>https://blog.lihan.cyou/index.php/archives/191/</link>
<guid>https://blog.lihan.cyou/index.php/archives/191/</guid>
<pubDate>Thu, 04 Sep 2025 19:26:00 +0800</pubDate>
<dc:creator>ikn0w1T</dc:creator>
<description><![CDATA[iptables核心概念由内核态的Netfilter和用户态的iptables两部分组成Netfilter：工作在Linux内核空间，是防火墙的“核心引擎”。能对TCP/IP数据包进行过滤、地址...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h2>iptables</h2><h3>核心概念</h3><p>由<strong>内核态的Netfilter</strong>和<strong>用户态的iptables</strong>两部分组成<br><strong>Netfilter</strong>：工作在Linux内核空间，是防火墙的“核心引擎”。能对TCP/IP数据包进行过滤、地址转换等操作。<br><strong>iptables</strong>：工作在用户空间，是我们直接操作的“管理工具”。位于/sbin/iptables目录下，能帮我们轻松添加、修改、删除防火墙规则。</p><blockquote>iptables是包过滤防火墙，主要工作在<strong>网络层</strong>，针对IP数据包的地址、端口等信息做处理。</blockquote><h3>四表五链</h3><p>iptables使用“表”和“链”的结构来组织规则，就像“文件夹”和“文件”的关系——<strong>表里有链，链里有规则。</strong></p><h4>四表：按规则用途分类</h4><table><thead><tr><th align="left">表名</th><th>核心作用</th><th>包含的链</th><th>适用场景</th></tr></thead><tbody><tr><td align="left">raw</td><td>决定是否对数据包做状态跟踪</td><td>OUTPUT、PREROUTING</td><td>很少用，主要用于特殊场景（如避免跟踪某些数据包）</td></tr><tr><td align="left">mangle</td><td>修改数据包内容（如打标记）、流量整形</td><td>INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING</td><td>较少用，一般用于复杂的流量管理</td></tr><tr><td align="left">nat</td><td>网络地址转换（修改源/目标IP/端口）</td><td>OUTPUT、PREROUTING、POSTROUTING</td><td>常用！比如内网主机通过公网IP上网（SNAT）、外网访问内网服务器（DNAT）</td></tr><tr><td align="left">filter</td><td>过滤数据包（决定是否放行）</td><td>INPUT、FORWARD、OUTPUT</td><td>最常用！日常的“允许/拒绝某个端口访问”都在这里配置</td></tr></tbody></table><blockquote>重点掌握filter表（过滤）和nat表（地址转换）</blockquote><h4>五链：按数据包处理时机分类</h4><table><thead><tr><th>链名</th><th>处理时机</th><th align="left">适用场景</th></tr></thead><tbody><tr><td>INPUT</td><td>处理入站数据包（目标IP是本机）</td><td align="left">控制外部主机访问本机服务（如禁止ping本机）</td></tr><tr><td>OUTPUT</td><td>处理出站数据包（从本机发往外部）</td><td align="left">一般不建议在这里配置规则，避免影响本机对外访问</td></tr><tr><td>FORWARD</td><td>处理转发数据包（流经本机但目标不是本机）</td><td align="left">当Linux作为网关时，控制是否转发内网数据包</td></tr><tr><td>PREROUTING</td><td>路由选择前处理数据包</td><td align="left">修改目标地址（DNAT），比如把外网访问的80端口映射到内网服务器</td></tr><tr><td>POSTROUTING</td><td>路由选择后处理数据包</td><td align="left">修改源地址（SNAT），比如内网主机通过公网IP上网</td></tr></tbody></table><h4>数据包的匹配流程：规则生效的顺序</h4><h5>表的应用顺序</h5><p>数据包会按这个顺序经过不同的表：<strong>raw → mangle → nat → filter</strong>（filter表最后生效，因为过滤是最终决策）。</p><h5>链的匹配顺序</h5><p>不同类型的数据包（入站、出站、转发）会走不同的链路径：</p><ul><li><p>主机型防火墙（数据包直接到本机）</p><ul><li>入站：PREROUTING → INPUT → 本机应用（如浏览器、Apache）</li><li>出站：本机应用 → OUTPUT → POSTROUTING</li></ul></li><li><p>网络型防火墙（数据包需要转发）</p><ul><li>转发：PREROUTING → FORWARD → POSTROUTING</li></ul></li></ul><h5>链内规则的匹配顺序</h5><p>链内的规则是从上到下依次检查，遵循“匹配即停止”原则（除了LOG规则，它只记录日志，不中断匹配）。如果找不到匹配的规则，就按链的“默认策略”处理（默认是允许，即policy ACCEPT）。</p><h3>安装启动配置iptables 防火墙</h3><p>通过 yum 包管理器安装 iptables 核心组件及服务管理工具</p><pre><code class="lang-bash">yum -y install iptables iptables-services #安装 iptables
systemctl start iptables.service #启动 iptables 服务
systemctl enable iptables.service #配置 iptables 开机自启</code></pre><h3>语法与数据包控制类型</h3><h4>基本语法</h4><pre><code class="lang-bash">iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]</code></pre><p><strong>例</strong></p><pre><code class="lang-bash">iptables -t filter -A INPUT -p icmp -j REJECT #通过拒绝 ICMP 协议实现禁止 ping</code></pre><p>各参数含义说明：</p><ul><li><p>表名：iptables 内置 3 张核心表（未指定时<strong>默认使用 filter</strong> 表）：</p><ul><li>filter：用于过滤数据包（默认表，主要控制数据包的“允许/拒绝”）。</li><li>nat：用于网络地址转换（如 SNAT、DNAT，实现内网访问外网、端口映射等）。</li><li>mangle：用于修改数据包标记（如 TOS、TTL，较少用于常规场景）。</li></ul></li><li>管理选项：表示对规则的操作（如添加、删除、查看等，下文详细说明）。</li><li>链名：表内预设的规则链（如 INPUT、OUTPUT、FORWARD，对应数据包的不同流向）。</li><li>匹配条件：指定需处理的数据包特征（如协议、端口、IP 地址等，不指定则匹配所有数据包）。</li><li>控制类型：数据包匹配后的处理动作（如允许、丢弃、拒绝等，需大写）。</li></ul><h4>语法注意事项</h4><ol><li>未指定表名时，默认操作 filter 表；未指定链名时，默认操作表内所有链。</li><li>除非设置链的“默认策略”，否则必须指定“匹配条件”（否则规则无意义）。</li><li>管理选项、链名、控制类型需使用大写字母（如 -A、INPUT、ACCEPT），其余参数为小写。</li></ol><h4>数据包常见控制类型</h4><p>控制类型决定了数据包匹配后的处理方式，常用类型如下（需全部大写）</p><table><thead><tr><th>控制类型</th><th>英文含义</th><th>功能说明</th></tr></thead><tbody><tr><td>ACCEPT</td><td>允许</td><td>允许数据包通过，继续向下传递。</td></tr><tr><td>DROP</td><td>丢弃</td><td>直接丢弃数据包，不向发送端返回任何响应（如 ping 时显示“请求超时”）。</td></tr><tr><td>REJECT</td><td>拒绝</td><td>拒绝数据包通过，并向发送端返回“拒绝响应”（如 ping 时显示“目标不可达”）。</td></tr><tr><td>LOG</td><td>日志</td><td>在 /var/log/messages 文件中记录数据包日志，不影响数据包后续处理（需配合其他控制类型使用）。</td></tr><tr><td>SNAT</td><td>源地址转换</td><td>修改数据包的源 IP（如内网主机通过网关的公网 IP 访问外网）。</td></tr><tr><td>DNAT</td><td>目的地址转换</td><td>修改数据包的目的 IP（如将公网 IP 的某个端口映射到内网主机）。</td></tr><tr><td>MASQUERADE</td><td>地址伪装</td><td>类似 SNAT，但适用于公网 IP 不固定的场景（如 ADSL 拨号网络）。</td></tr></tbody></table><blockquote>注：LOG 是“辅助动作”，不会终止数据包的匹配流程（即“匹配即停止”规则对 LOG 不生效），数据包会继续匹配下一条规则。</blockquote><h3>iptables 规则管理：添加、查看、删除与默认策略</h3><h4>常用管理选项速查表</h4><table><thead><tr><th>管理选项</th><th>功能描述</th><th>用法示例</th></tr></thead><tbody><tr><td>-A</td><td>在指定链的末尾追加一条规则</td><td>iptables -A INPUT -p tcp --dport 80 -j ACCEPT（允许 80 端口 TCP 访问）</td></tr><tr><td>-I</td><td>在指定链的指定位置插入一条规则（默认插在第 1 位）</td><td>iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT（在 INPUT 链第 2 位插入 22 端口规则）</td></tr><tr><td>-P</td><td>设置链的默认策略（仅支持 ACCEPT/DROP）</td><td>iptables -P INPUT DROP（INPUT 链默认丢弃所有数据包）</td></tr><tr><td>-D</td><td>删除指定链中的一条规则（支持“按序号”或“按内容”删除）</td><td>iptables -D INPUT 5（删除 INPUT 链第 5 条规则）</td></tr><tr><td>-R</td><td>修改指定链中的一条规则（按序号替换）</td><td>iptables -R INPUT 3 -p udp --dport 53 -j ACCEPT（替换 INPUT 链第 3 条规则为允许 53 端口 UDP）</td></tr><tr><td>-L</td><td>查看指定链或表的规则列表</td><td>iptables -L INPUT（查看 INPUT 链规则）</td></tr><tr><td>-n</td><td>以数字形式显示地址和端口（避免 DNS 解析，加快查询速度）</td><td>iptables -nL INPUT（数字形式查看 INPUT 链规则）</td></tr><tr><td>-v</td><td>查看规则时显示详细信息（如匹配的数据包数量、字节数）</td><td>iptables -vnL INPUT（详细查看 INPUT 链规则）</td></tr><tr><td>--line-number</td><td>查看规则时显示规则序号（便于按序号删除/修改规则）</td><td>iptables -L INPUT --line-numbers（显示 INPUT 链规则序号）</td></tr><tr><td>-F</td><td>清空指定链或表的所有规则（不影响默认策略）</td><td>iptables -F INPUT（清空 INPUT 链所有规则）</td></tr><tr><td>-X</td><td>清空自定义链的规则（不影响系统预设链）</td><td>iptables -X（清空所有自定义链）</td></tr><tr><td>-Z</td><td>重置链的计数器（清零匹配的数据包数量、字节数）</td><td>iptables -Z INPUT（重置 INPUT 链计数器）</td></tr><tr><td>-S</td><td>查看链的规则（以“命令行格式”显示，便于复制复用）</td><td>iptables -t nat -S POSTROUTING（查看 nat 表 POSTROUTING 链规则）</td></tr></tbody></table><h4>规则列表字段解读</h4><p>使用 iptables -L 或 iptables -vnL 查看规则时，输出结果包含多个字段</p><table><thead><tr><th>字段名</th><th>含义说明</th></tr></thead><tbody><tr><td>pkts</td><td>该规则匹配到的数据包总数量</td></tr><tr><td>bytes</td><td>该规则匹配到的数据包总字节数</td></tr><tr><td>target</td><td>规则匹配后的处理动作（即“控制类型”，如 ACCEPT、DROP）</td></tr><tr><td>prot</td><td>规则适用的网络协议（如 tcp、udp、icmp）</td></tr><tr><td>opt</td><td>规则的扩展选项（如 state 表示连接状态）</td></tr><tr><td>in</td><td>数据包流入的网卡（如 eth0，any 表示所有网卡）</td></tr><tr><td>out</td><td>数据包流出的网卡（如 eth0，any 表示所有网卡）</td></tr><tr><td>source</td><td>数据包的源 IP 或网段（如 192.168.1.0/24 表示内网网段）</td></tr><tr><td>destination</td><td>数据包的目的 IP 或网段（如 10.0.0.1 表示目标主机）</td></tr></tbody></table><p><img src="https://image.lihan.cyou/20250904191413490.png" alt="image-20250904162235920" title="image-20250904162235920"></p><h4>添加新规则</h4><p>添加规则使用 <strong>-A</strong>（追加到末尾）或 <strong>-I</strong>（插入到指定位置），需结合“匹配条件”（如协议、端口、IP）和“控制类型”</p><ul><li>示例 1：禁止所有主机 ping 本主机</li></ul><pre><code class="lang-bash"># 在 filter 表 INPUT 链末尾添加规则，拒绝 ICMP 协议数据包
iptables -t filter -A INPUT -p icmp -j REJECT</code></pre><blockquote>如果使用-A且规则已经允许了icmp通行则不生效，因为匹配到accept就不会匹配后面的reject，使用-I则可以，因为会插入到第一条。</blockquote><ul><li>示例 2：允许 22 端口（SSH）访问</li></ul><pre><code class="lang-bash"># 在 INPUT 链第 2 位插入规则，允许 TCP 协议 22 端口访问
iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT</code></pre><ul><li>示例 3：允许所有 TCP/UDP 协议访问（不推荐生产环境）</li></ul><pre><code class="lang-bash"># 允许所有 TCP 协议数据包进入
iptables -t filter -A INPUT -p tcp -j ACCEPT
# 允许所有 UDP 协议数据包进入
iptables -I INPUT -p udp -j ACCEPT</code></pre><h4>查看规则列表</h4><p>查看规则是验证配置是否正确的关键步骤，结合 <strong>-n</strong>（数字显示）、<strong>-v</strong>（详细信息（pkts/bytes））、<strong>--line-number</strong>（规则序号）可提升查看效率</p><ul><li>用法一：查看指定链规则并显示序号</li></ul><pre><code class="lang-bash"># 查看 filter 表 INPUT 链规则，显示规则序号
iptables -L INPUT --line-numbers</code></pre><p><img src="https://image.lihan.cyou/20250904191423421.png" alt="image-20250904164441854" title="image-20250904164441854"></p><ul><li>用法 2：数字形式查看详细规则</li></ul><pre><code class="lang-bash"># 数字形式（IP/端口不解析）、详细信息（pkts/bytes）查看 INPUT 链规则
iptables -vnL INPUT</code></pre><p><img src="https://image.lihan.cyou/20250904191430648.png" alt="image-20250904164724083" title="image-20250904164724083"></p><h4>删除与清空规则</h4><p>当规则配置错误或需更新时，需删除或清空规则，操作需谨慎（尤其是远程服务器，避免<strong>误删 SSH</strong> 端口规则导致无法连接）</p><h5>删除单条规则</h5><p>支持两种删除方式：按规则序号（推荐，更精准）和按规则内容</p><ul><li>按<strong>序号</strong>删除：先通过 iptables -L INPUT --line-numbers 查看序号，再删除</li></ul><pre><code class="lang-bash"># 删除 INPUT 链第 2 条规则
iptables -D INPUT 2</code></pre><ul><li>按<strong>内容</strong>删除：需完整匹配规则的“表名、链名、匹配条件、控制类型”</li></ul><pre><code class="lang-bash"># 删除 filter 表 INPUT 链中“拒绝 ICMP 协议”的规则
iptables -t filter -D INPUT -p icmp -j REJECT</code></pre><h5>清空所有规则</h5><p>使用 -F 清空指定表或链的规则，需注意：-F 仅清空规则，不影响默认策略（如 INPUT 链默认 DROP 仍会生效）。</p><ul><li>清空指定链规则</li></ul><pre><code class="lang-bash"># 清空 INPUT 链所有规则
iptables -F INPUT</code></pre><ul><li>清空指定表所有规则</li></ul><pre><code class="lang-bash"># 清空 filter 表所有链规则（默认表）
iptables -F
# 清空 nat 表所有链规则
iptables -t nat -F
# 清空 mangle 表所有链规则    
iptables -t mangle -F</code></pre><h5>清空规则注意事项</h5><ol><li>若规则存在多条相同内容，按内容删除仅删除序号最小的一条。</li><li>按序号删除时，需确保序号不超过当前链的规则总数，否则报错。</li><li>若 INPUT 链默认策略为 DROP，清空规则前需确保已保留 SSH 端口（22）规则，否则会导致远程连接断开（无物理机权限时无法恢复）。</li></ol><h3>设置默认策略</h3><p>默认策略是链的“最后一道防线”：当数据包未匹配任何规则时，将执行默认策略。生产环境中推荐将默认策略设为 DROP（白名单模式，仅允许指定规则的数据包通过）</p><h4>基本语法</h4><pre><code class="lang-bash">iptables [-t 表名] -P &lt;链名&gt; &lt;控制类型&gt;  # 控制类型仅支持 ACCEPT 或 DROP</code></pre><h4>常见示例</h4><pre><code class="lang-bash"># 设置 INPUT 链默认策略为 DROP（拒绝所有未匹配规则的入站数据包）
iptables -P INPUT DROP

# 设置 FORWARD 链默认策略为 DROP（防火墙默认不转发数据包）
iptables -t filter -P FORWARD DROP

# 设置 OUTPUT 链默认策略为 ACCEPT（允许所有出站数据包，便于服务器主动访问外部）
iptables -P OUTPUT ACCEPT</code></pre><h4>默认策略注意事项</h4><ol><li>默认策略一旦设置立即生效，无需重启 iptables 服务。</li><li>filter 表的 INPUT、OUTPUT、FORWARD 链默认策略初始为 ACCEPT，nat 表和 mangle 表默认策略为 ACCEPT。</li><li>修改默认策略后，需及时添加“允许必要服务”的规则（如 SSH、HTTP、DNS 等），避免影响业务正常运行。</li></ol>
]]></content:encoded>
<slash:comments>3</slash:comments>
<comments>https://blog.lihan.cyou/index.php/archives/191/#comments</comments>
<wfw:commentRss>https://blog.lihan.cyou/index.php/feed/tag/iptables/</wfw:commentRss>
</item>
</channel>
</rss>