无需伪装的 Wireguard 隧道

无需伪装的 Wireguard 隧道

以下是网络拓扑图

网络拓扑结构

wireguard 连接由 发起local server,通过其公共 IP 调用vps。它们的配置文件如下所示:

虚拟专用服务器

[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = ***********************

[Peer]
PublicKey = **************
AllowedIPs = 10.0.0.2/32

本地服务器

[Interface]
Address = 10.0.0.2/24
ListenPort = 51820
PrivateKey = ******************

[Peer]
PublicKey = ***************
AllowedIPs = 10.0.0.0/24
Endpoint = 70.60.21.22:51820
PersistentKeepalive = 25

此时,Wireguard 隧道即可正常运行。

myapp.com域名指向VPS公共 IP。

中有一个 Web 应用程序local server,监听 HTTP 和 HTTPS 端口。它有一个动态 IP 并且位于 NAT 之后。最好将它公开,而无需 DDNS 或端口转发。 上有一个反向代理,可VPS将端口 80 和 443 数据包转发给它……并且它可以正常工作。显然,这个额外的软件可以通过巧妙的 wireguard 配置来替代,但这不是我们这里的主要问题。

好的,现在,假设我们是开发人员,所以到目前为止措辞可能有点不正确……但问题是,如果我们tcpdump在 上进行流量传输,local server同时接收来自指向 的客户端的请求myapp.com,则原始 IP总是10.0.0.1

出于明显的日志记录和防火墙目的,我们更愿意将其替换为客户端的 IP。

为了实现这一目标我们可以做些什么呢?

答案1

假设你使用 VPS 上的防火墙进行端口转发,而不是使用 Nginx 或 HAProxy 等反向代理(它们不会在 IP 层保留原始客户端地址),那么有几种不同的方法可以解决这个问题(本文概述了其他几种技术)。从互联网进行 WireGuard 端口转发文章)。通常,一条或两条简单的策略路由规则是处理该问题最可靠的方法。

关闭本地服务器上的 WireGuard,将其配置更改为以下内容,然后重新启动它:

[Interface]
Address = 10.0.0.2/24
ListenPort = 51820
PrivateKey = ******************
Table = 123
PreUp = ip rule add from 10.0.0.2 table 123 priority 456
PostDown = ip rule del from 10.0.0.2 table 123 priority 456

[Peer]
PublicKey = ***************
AllowedIPs = 0.0.0.0/0
Endpoint = 70.60.21.22:51820
PersistentKeepalive = 25

通过此配置,wg-quick将为您设置自定义路由表 ( 123),并以您的 WireGuard 接口作为其默认路由。该ip rule add from 10.0.0.2 table 123 priority 456命令定义了一个策略路由规则,以便将此路由表用于从 WireGuard 接口自己的地址发送的任何数据包——对于从您的 VPS 转发到本地服务器的 HTTP 请求的所有响应都是这种情况。

因此,有了这个,您不再需要伪装从 VPS 转发到本地服务器的数据包;您可以在 VPS 上关闭此功能,这样您就可以在本地服务器上看到原始客户端 IP。

相关内容