我正在尝试在我的客户端和 wireguard 服务器之间放置一个中间服务器或代理。
我不想从自己的计算机直接连接到 Wireguard 端点。
如果 wireguard 端点例如是 2.2.2.2:2408,我希望我的客户端连接到 3.3.3.3:1200(我的 vps),然后连接转发到目标端点。
wireguard 客户端 > 带端口转发的中间服务器 > 目标服务器
尝试使用 iptables 将我的 vps 上的端口 1200 转发到 wireguard 服务器 IP:PORT,但没有成功:
iptables -t nat -A PREROUTING -p udp --dport 1200 -j DNAT --到目的地 2.2.2.2:2408
有人告诉我可能需要使用 SNAT 将源重写为中间服务器的 IP,但我不确定如何做到这一点。
尝试使用 iptables 将我的 vps 上的端口 1200 转发到 wireguard 服务器 IP:PORT,但没有成功:
iptables -t nat -A PREROUTING -p udp --dport 1200 -j DNAT --to-destination 2.2.2.2:2408
有人告诉我可能需要使用 SNAT 将源重写为中间服务器的 IP,但我不确定如何做到这一点。
答案1
为了说明,客户端将具有可见的公共 IP 地址 192.0.2.2。
为什么这不管用
如果仅重写目的地,数据包将被路由(转发)到 2.2.2.2,源不变,为 192.0.2.2。此数据包将被实现以下功能的任何路由器层丢弃:严格反向路径过滤,很可能是第一个。即使从未在路径上掉线,当数据包到达 2.2.2.2 时,2.2.2.2 将回复其来源:192.0.2.2。假设此直接路径可用,如果数据包到达 WireGuard 客户端的 NAT/路由器,它仍然不应该接受它,因为它不是它所期望的来源(2.2.2.2 而不是 3.3.3.3)。即使它真的到达了客户端,WireGuard 也会使用其漫游功能并将对等点更新为 2.2.2.2 而不是 3.3.3.3,这违背了 OP 不直接连接的意图。
源 NAT
正如 OP 所建议的,执行源 NAT 将允许获取转发到 2.2.2.2 时使用的 VPS 的源,并通过它在 192.0.2.2 和 2.2.2.2 之间“路由”流量。
最容易使用 SNAT/MASQUERADE(在后路由的最后一步发生)是检查数据包是否已经经历了 DNAT 转换(在预路由中),因此不必在此规则中重复特定值:
iptables -t nat -A POSTROUTING -m conntrack --ctstate DNAT -j MASQUERADE
如果尚未完成,还应将 VPS 配置为路由器(这将是一种单臂路由器):
sysctl -w net.ipv4.ip_forward=1
其他方法
另一种完全不同的、不涉及 NAT 的方法是隧道3.3.3.3 和 2.2.2.2 之间的数据包(即 WireGuard 信封),但这需要能够更改 2.2.2.2 上的配置(包括路由)。
或者,也可以使用两个单独的 WireGuard 隧道(仅通过隧道传输数据,而不是信封)来实现(为简单起见):一个在 192.0.2.2 和 3.3.3.3 之间,另一个在 3.3.3.3 和 2.2.2.2 之间。这仍然取决于 OP 的使用情况和/或可以在 2.2.2.2 上进行哪些配置。