<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Network on HiDa</title><link>https://www.0niu.cn/tags/network/</link><description>Recent content in Network on HiDa</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Mon, 18 May 2026 19:22:32 +0800</lastBuildDate><atom:link href="https://www.0niu.cn/tags/network/index.xml" rel="self" type="application/rss+xml"/><item><title>firewalld 配置 internal 到 public 区域的流量转发</title><link>https://www.0niu.cn/posts/firewalld-forward-internal-to-public/</link><pubDate>Mon, 18 May 2026 19:22:32 +0800</pubDate><guid>https://www.0niu.cn/posts/firewalld-forward-internal-to-public/</guid><description>&lt;p>firewalld 支持通过 Policy 对象实现跨区域流量转发。本文介绍如何配置策略，允许 internal 区域的流量转发到 public 区域，使内网主机可以通过防火墙访问外部网络。&lt;/p>
&lt;h2 id="前提条件">前提条件&lt;/h2>
&lt;ul>
&lt;li>firewalld 已安装并运行（&lt;code>systemctl status firewalld&lt;/code>）&lt;/li>
&lt;li>有 root 或 sudo 权限&lt;/li>
&lt;li>了解 firewalld 的 Zone 和 Policy 概念&lt;/li>
&lt;/ul></description><content>&lt;p>firewalld 支持通过 Policy 对象实现跨区域流量转发。本文介绍如何配置策略，允许 internal 区域的流量转发到 public 区域，使内网主机可以通过防火墙访问外部网络。&lt;/p>
&lt;h2 id="前提条件">前提条件&lt;/h2>
&lt;ul>
&lt;li>firewalld 已安装并运行（&lt;code>systemctl status firewalld&lt;/code>）&lt;/li>
&lt;li>有 root 或 sudo 权限&lt;/li>
&lt;li>了解 firewalld 的 Zone 和 Policy 概念&lt;/li>
&lt;/ul>
&lt;h2 id="创建转发策略">创建转发策略&lt;/h2>
&lt;p>firewalld 的 Zone 控制接口上的流量方向，而 Policy 用于定义跨区域的流量转发规则。我们需要创建一个 Policy，将 internal 作为入口区域，public 作为出口区域。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 创建新策略&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo firewall-cmd --permanent --new-policy allow-internal-to-public
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 设置入口区域（源）为 internal，出口区域（目标）为 public&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo firewall-cmd --permanent --policy allow-internal-to-public --add-ingress-zone internal
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo firewall-cmd --permanent --policy allow-internal-to-public --add-egress-zone public
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 设置动作为 ACCEPT，并给予高优先级（确保不被其他策略覆盖）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo firewall-cmd --permanent --policy allow-internal-to-public --set-target ACCEPT
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo firewall-cmd --permanent --policy allow-internal-to-public --set-priority -100
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>关键参数说明：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>参数&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>--add-ingress-zone&lt;/code>&lt;/td>
&lt;td>流量进入的区域（源区域）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--add-egress-zone&lt;/code>&lt;/td>
&lt;td>流量出去的区域（目标区域）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--set-target ACCEPT&lt;/code>&lt;/td>
&lt;td>匹配该策略的流量默认放行&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--set-priority -100&lt;/code>&lt;/td>
&lt;td>优先级数值越小越优先，负数确保优先于默认策略&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="开启伪装masquerade">开启伪装（MASQUERADE）&lt;/h2>
&lt;p>为了让内网 IP 的流量通过 public 区域的出口 IP 访问外部网络，需要为 public 区域开启源地址伪装（SNAT）：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo firewall-cmd --permanent --zone&lt;span style="color:#f92672">=&lt;/span>public --add-masquerade
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="启用-ip-转发">启用 IP 转发&lt;/h2>
&lt;p>Linux 内核默认关闭 IP 转发功能，需要手动开启：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 临时启用（重启后失效）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo sysctl -w net.ipv4.ip_forward&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 永久启用&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo net.ipv4.ip_forward&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span> | sudo tee -a /etc/sysctl.d/99-ipforward.conf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="重载防火墙">重载防火墙&lt;/h2>
&lt;p>以上所有 &lt;code>--permanent&lt;/code> 操作需要重载后才会生效：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo firewall-cmd --reload
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="验证配置">验证配置&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看策略列表&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo firewall-cmd --get-policies
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看策略详情&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo firewall-cmd --info-policy allow-internal-to-public
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看 public 区域是否开启伪装&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo firewall-cmd --zone&lt;span style="color:#f92672">=&lt;/span>public --query-masquerade
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看 IP 转发状态&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sysctl net.ipv4.ip_forward
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="常见问题">常见问题&lt;/h2>
&lt;p>&lt;strong>内网主机无法访问外部？&lt;/strong> 检查以下几点：&lt;/p>
&lt;ol>
&lt;li>确认 &lt;code>net.ipv4.ip_forward&lt;/code> 已设为 &lt;code>1&lt;/code>&lt;/li>
&lt;li>确认 public 区域的伪装已开启&lt;/li>
&lt;li>确认 internal 区域的接口绑定正确：&lt;code>sudo firewall-cmd --zone=internal --list-all&lt;/code>&lt;/li>
&lt;li>确认内网主机的默认网关指向防火墙的 internal 接口 IP&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>策略优先级被覆盖？&lt;/strong> 使用更小的优先级数值（如 &lt;code>-200&lt;/code>），firewalld 优先级范围是 &lt;code>-32768&lt;/code> 到 &lt;code>32767&lt;/code>，数值越小越优先。&lt;/p>
&lt;h2 id="参考">参考&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://firewalld.org/documentation/concepts/policies.html">firewalld 官方文档 - Policies&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://firewalld.org/documentation/man-pages/firewalld.zone.html">firewalld.zone(5) man page&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://firewalld.org/documentation/man-pages/firewalld.policy.html">firewalld.policy(5) man page&lt;/a>&lt;/li>
&lt;/ul></content></item></channel></rss>