以下是网络拓扑图
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。