借助 WSL 访问 IP 地址时转向另一 IP

工作中我有这么一种需求,想要将对某些 IP 地址的访问重定向到另外的 IP 地址,至少要包括 TCP 流量。实际场景大概是,云服务器之间能够用他们自身的 IP 地址访问,但是办公网访问这些服务需要使用 EIP(应该代表弹性 IP),偶尔我需要本地修改为测试环境的 namespace,直连云上的数据库和微服务。配置中心自然会返回给我一堆 IP 而不是 EIP,我希望不改动他们只在我本地将请求映射到 EIP。

如果是域名倒是好办,只需要简单修改 hosts 文件。这是也 LLM AI 给我的方案之一。但我不指望这些客户端蠢到 IP 地址本身(而不是域名)还需要另外解析为 IP 地址。另一个似乎是修改网卡的网关还是路由规则,看上去也不可行,没有一台对端机器来处理这些路由。可能 Windows 的网络底层不是很自由,所以我问 Linux 是不是简单很多(我印象中用 iptables 的 NAT 规则做过转发)。LLM AI 表示确实如此。

于是有一个虽然曲折但是能用的方案就出现了。我的 Windows 机器有 WSL 2 环境,也有 Proxifier 这样强制走代理的软件。那么我只需要:

  1. 先配置好 WSL 下的 IP 转发规则;
  2. 在 WSL 搭建一个代理服务器;
  3. 在 Windows 上让需要的程序走上述代理。

废话少说。鉴于新版 Debian 默认搭载 nftables 而非 iptables,我让 LLM AI 直接给出 nft 命令。然后加上启动代理服务器的命令:

sudo nft add table nat
sudo nft 'add chain nat prerouting { type nat hook prerouting priority 0; }'
sudo nft 'add chain nat output { type nat hook output priority 0; }'
# 修改下面的 IP
sudo nft add rule nat output ip daddr 10.1.0.1 dnat to 10.2.0.1
sudo nft add rule nat output ip daddr 10.1.0.2 dnat to 10.2.0.2
microsocks -p 1081

这段命令代表访问时 10.1.0.1 去访问 10.2.0.1,访问 10.1.0.2 转而访问 10.2.0.2,在 1081 端口暴露出 socks5 代理。

注意仅 WSL 2 能正确处理 iptables 类规则,WSL 1 印象中不行。其中 microsocks 可以换成喜欢的代理程序和协议,这里我随便找了一个简单、单一功能且不会引发注意的。推荐在 WSL Settings 保持“启用 localhost 转发”,然后可以直接在宿主环境(Windows)下用 localhost:1081 访问到代理;如若不行可尝试将网络模式改为 Mirrored 并重启。

这里没有持久化 nft 规则,也没有设置开机启动。我是用时再复制粘贴运行。可根据需要自行定制。

在 Windows 环境中用 Proxifier 为 10.1.0.* 指定规则走上述代理就行。

鉴于 Proxifier 是付费软件。如果只需要单一或者很少的程序走代理,也可以查看他们自己有没有类似运行参数。如 Java 开发,JRE 就有 VM 参数可以让网络请求走 HTTP 代理:

-Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=1082

但是不保证所有类库都遵循。实在不行也可以尝试某程序员常备软件的 TUN 模式。或者打开内核转发配置成路由网关。

若无特别说明,本文系原创,遵循 署名-非商业性使用 3.0 (CC BY-NC 3.0) 协议,转载文章请注明来自【闪星空间】,或链接上原文地址:http://shansing.com/read/554/

发表评论»

NO SPAMS! 不要发垃圾评论哦!

表情