<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>端口转发 on 极客Vinkey</title>
    <link>https://www.mawenqian.com/zh/tags/port-forwarding/</link>
    <description>Recent content in 端口转发 on 极客Vinkey</description>
    <image>
      <title>极客Vinkey</title>
      <url>https://www.mawenqian.com/images/papermod-cover.png</url>
      <link>https://www.mawenqian.com/images/papermod-cover.png</link>
    </image>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <copyright>MA Wenqian · mawenqian.com</copyright>
    <atom:link href="https://www.mawenqian.com/zh/tags/port-forwarding/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>端口转发实战：Windows netsh、Linux socat 与 macOS（含命令生成器）</title>
      <link>https://www.mawenqian.com/zh/port-forward/</link>
      <pubDate>Mon, 17 Aug 2026 10:30:00 +0800</pubDate>
      <guid>https://www.mawenqian.com/zh/port-forward/</guid>
      <description>&lt;p&gt;本文总结三大平台的 TCP/UDP 端口转发方法：Windows 用系统自带的 &lt;code&gt;netsh interface portproxy&lt;/code&gt;，Linux 和 macOS 用 &lt;code&gt;socat&lt;/code&gt;（并注册成开机自启的服务）。文末还有平台对比和排错清单。&lt;/p&gt;
&lt;p&gt;命令参数又多又容易记错，所以我在下面放了一个&lt;strong&gt;命令生成器&lt;/strong&gt;，填好地址端口就能直接复制。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;什么时候需要端口转发&#34;&gt;什么时候需要端口转发&lt;/h2&gt;
&lt;p&gt;我自己最常遇到的几种场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;服务只监听 &lt;code&gt;127.0.0.1&lt;/code&gt;&lt;/strong&gt;，想让局域网里的其他设备也能访问；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VPN 抢走了全部路由&lt;/strong&gt;（比如 Cisco AnyConnect 默认关闭 split tunnel），本机访问不到局域网设备，需要借道一个能通的机器；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WSL2 里跑的服务&lt;/strong&gt;，需要从 Windows 宿主机或局域网访问，而 WSL 的 IP 每次重启都会变；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;端口被占用或被规范限制&lt;/strong&gt;，想用另一个端口对外提供同一个服务。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;需要区分两个概念：这里说的都是&lt;strong&gt;本机层面的端口转发（用户态代理）&lt;/strong&gt;，也就是「进来的连接原样接到另一个地址端口」；如果要让整台机器充当网关替一个网段做转发，那是 NAT 的活，Linux 上应该用 &lt;code&gt;nftables&lt;/code&gt;/&lt;code&gt;iptables&lt;/code&gt; 的 DNAT 并打开 &lt;code&gt;net.ipv4.ip_forward&lt;/code&gt;，不在本文范围内。&lt;/p&gt;
&lt;h2 id=&#34;-命令生成器&#34;&gt;🧰 命令生成器&lt;/h2&gt;
&lt;p&gt;支持多条规则一起生成，切换标签页即可得到对应平台的命令，每个代码块右上角可以一键复制。&lt;/p&gt;
&lt;style&gt;
.pfgen{
  border:1px solid var(--border,#eee);
  border-radius:var(--radius,8px);
  background:var(--theme,#fff);
  padding:1rem 1.1rem 1.1rem;
  margin:1.5rem 0;
  font-size:.95rem;
  line-height:1.5;
}
.pfgen *{box-sizing:border-box}
.pfgen-head{display:flex;align-items:flex-start;justify-content:space-between;gap:.5rem;flex-wrap:wrap;margin-bottom:.9rem}
.pfgen-lang{display:flex;flex:0 0 auto;margin-left:auto}
.pfgen-lang button{
  padding:.2rem .55rem;font:inherit;font-size:.78rem;cursor:pointer;
  color:var(--secondary,#6c6c6c);background:transparent;
  border:1px solid var(--border,#ddd);
}
.pfgen-lang button:first-child{border-radius:5px 0 0 5px}
.pfgen-lang button:last-child{border-radius:0 5px 5px 0;border-left:0}
.pfgen-lang button:hover{color:var(--primary,#1e1e1e)}
.pfgen-lang button.on{color:var(--primary,#1e1e1e);background:var(--code-bg,#f5f5f5);font-weight:600}
.pfgen-tabs{display:flex;gap:.4rem;flex-wrap:wrap}
.pfgen-tabs button{
  flex:0 0 auto;padding:.35rem .9rem;font:inherit;font-size:.9rem;cursor:pointer;
  color:var(--secondary,#6c6c6c);background:transparent;
  border:1px solid var(--border,#eee);border-radius:999px;
}
.pfgen-tabs button:hover{color:var(--primary,#1e1e1e)}
.pfgen-tabs button.on{
  color:var(--theme,#fff);background:var(--primary,#1e1e1e);border-color:var(--primary,#1e1e1e);
}
.pfgen-bar{display:flex;align-items:center;gap:.6rem;flex-wrap:wrap;margin-bottom:.7rem}
.pfgen-bar select{
  font:inherit;font-size:.85rem;padding:.25rem .4rem;border-radius:5px;
  border:1px solid var(--border,#eee);background:var(--theme,#fff);color:var(--primary,#1e1e1e);
}
.pfgen-hint{font-size:.8rem;color:var(--secondary,#6c6c6c)}
.pfgen-row{
  display:grid;grid-template-columns:1.4fr .8fr auto 1.4fr .8fr auto;
  gap:.5rem;align-items:end;margin-bottom:.5rem;
}
.pfgen-row label{
  display:flex;flex-direction:column;gap:.2rem;min-width:0;
  font-size:.75rem;color:var(--secondary,#6c6c6c);margin:0;
}
.pfgen-row input{
  font:inherit;font-size:.85rem;padding:.32rem .45rem;width:100%;
  border:1px solid var(--border,#ddd);border-radius:5px;
  background:var(--theme,#fff);color:var(--primary,#1e1e1e);
}
.pfgen-row input:focus{outline:2px solid var(--primary,#1e1e1e);outline-offset:-1px}
.pfgen-row input.bad{border-color:#e5534b;background:rgba(229,83,75,.07)}
.pfgen-arrow{padding-bottom:.4rem;color:var(--secondary,#6c6c6c)}
.pfgen-del{
  font:inherit;line-height:1;padding:.3rem .5rem;margin-bottom:.05rem;cursor:pointer;
  color:var(--secondary,#6c6c6c);background:transparent;
  border:1px solid var(--border,#ddd);border-radius:5px;
}
.pfgen-del:hover{color:#e5534b;border-color:#e5534b}
.pfgen-acts{display:flex;gap:.5rem;flex-wrap:wrap;margin:.7rem 0 .2rem}
.pfgen-acts button{
  font:inherit;font-size:.85rem;padding:.3rem .75rem;cursor:pointer;
  color:var(--primary,#1e1e1e);background:transparent;
  border:1px dashed var(--border,#ddd);border-radius:5px;
}
.pfgen-acts button:hover{border-style:solid}
.pfgen-err{color:#e5534b;font-size:.82rem;margin:.5rem 0 0;min-height:1.2em}
.pfgen-out{margin-top:1rem}
.pfgen-out-h{display:flex;align-items:center;justify-content:space-between;gap:.5rem;margin-bottom:.3rem}
.pfgen-out-t{font-size:.82rem;font-weight:600;color:var(--primary,#1e1e1e)}
.pfgen-copy{
  font:inherit;font-size:.75rem;padding:.15rem .55rem;cursor:pointer;white-space:nowrap;
  color:var(--secondary,#6c6c6c);background:transparent;
  border:1px solid var(--border,#ddd);border-radius:5px;
}
.pfgen-copy:hover{color:var(--primary,#1e1e1e)}
.pfgen pre{
  margin:0;padding:.7rem .8rem;border-radius:6px;border:1px solid var(--border,#eee);
  background:var(--code-block-bg,#1c1d21);color:#e6edf3;
  font-size:.8rem;line-height:1.55;overflow-x:auto;white-space:pre;
}
.pfgen-note{font-size:.78rem;color:var(--secondary,#6c6c6c);margin:.35rem 0 0}
@media (max-width:640px){
  .pfgen-row{grid-template-columns:1fr 1fr;row-gap:.4rem}
  .pfgen-arrow{display:none}
  .pfgen-del{grid-column:2;justify-self:end}
}
&lt;/style&gt;
&lt;div class=&#34;pfgen&#34; id=&#34;pfgen-0&#34;&gt;
  &lt;div class=&#34;pfgen-head&#34;&gt;
    &lt;div class=&#34;pfgen-tabs&#34; data-f=&#34;tabs&#34;&gt;
      &lt;button type=&#34;button&#34; data-os=&#34;win&#34; class=&#34;on&#34;&gt;Windows · netsh&lt;/button&gt;
      &lt;button type=&#34;button&#34; data-os=&#34;linux&#34;&gt;Linux · socat&lt;/button&gt;
      &lt;button type=&#34;button&#34; data-os=&#34;mac&#34;&gt;macOS · socat / pf&lt;/button&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&#34;pfgen-bar&#34;&gt;
    &lt;label class=&#34;pfgen-hint&#34; data-f=&#34;protolabel&#34;&gt;协议
      &lt;select data-f=&#34;proto&#34;&gt;
        &lt;option value=&#34;tcp&#34;&gt;TCP&lt;/option&gt;
        &lt;option value=&#34;udp&#34;&gt;UDP&lt;/option&gt;
      &lt;/select&gt;
    &lt;/label&gt;
    &lt;span class=&#34;pfgen-hint&#34; data-f=&#34;hint&#34;&gt;&lt;/span&gt;
  &lt;/div&gt;
  &lt;div data-f=&#34;rules&#34;&gt;&lt;/div&gt;
  &lt;div class=&#34;pfgen-acts&#34;&gt;
    &lt;button type=&#34;button&#34; data-act=&#34;add&#34;&gt;&amp;#43; 添加一条规则&lt;/button&gt;
    &lt;button type=&#34;button&#34; data-act=&#34;reset&#34;&gt;重置&lt;/button&gt;
  &lt;/div&gt;
  &lt;p class=&#34;pfgen-err&#34; data-f=&#34;err&#34;&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
