有一个带有wireguard的外部服务器(主机),IP地址为98.XX.XX.XX和带有wireguard的内部服务器(客户端)192.168.0.2。
在客户端安装 Web 服务器(nginx、phpfpm)。在主机上,所有端口都转发到客户端。如果我从 192.168.0.2 得到 98.XX.XX.XX IM 响应 Web 服务器页面。这一切都很好,但是在客户端的日志文件中,所有连接的 IP 地址都是 192.168.0.1(网关wiregusrd 主机 98.XX.XX.XX)。
我尝试使用客户端规则来做到这一点:
Table = 1
PostUp = ip rule add pref 500 from 192.168.0.2 lookup 1
PostDown = ip rule del pref 500
服务器端规则
Address = 195.168.0.1/24
SaveConfig = true
PostUp = iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
PostUp = iptables -t nat -A PREROUTING -d 98.XX.XX.XX -p tcp -m multiport --dports 80,443,25,53,21,20,110,113,465,587,993,995,4747,3306,4200 -j DNAT --to-destination 195.168.0.2
PostUp = iptables -t nat -A PREROUTING -d 98.XX.XX.XX -p tcp -m multiport --dports 5432,43,143,123,8002 -j DNAT --to-destination 195.168.0.2
PostDown = iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
PostDown = iptables -t nat -D PREROUTING -d 98.XX.XX.XX -p tcp -m multiport --dports 80,443,25,53,21,20,110,113,465,587,993,995,4747,3306,4200 -j DNAT --to-destination 195.168.0.2
PostDown = iptables -t nat -D PREROUTING -d 98.XX.XX.XX -p tcp -m multiport --dports 5432,43,143,123,8002 -j DNAT --to-destination 195.168.0.2
ListenPort = 51823
PrivateKey =
[Peer]
PublicKey =
AllowedIPs = 195.168.0.0/24
但是,如果我从客户端 192.168.0.2 ping 或发送数据包,我有外部 IP,我的提供商 IP 地址为 169.XX.XX.XX。我需要从 IP 地址 98.XX.XX.XX(主机)wireguard 发送数据包
我需要的简单方案
客户端 ip 24.18.22.12 -> Wireguard 主机 (98.XX.XX.XX) -> 内部 Web 服务器 (192.168.0.2) (内部 Web 服务器看到客户端 ip 原始 24.18.22.12,没有wireguard 网关)
如果我将内部网络服务器(192.168.0.2)的数据发布到谷歌或某些网站,我会得到Wireguard主机(98.XX.XX.XX)的IP地址,但不会得到提供商的IP地址169.XX.XX.XX
内部网络服务器 (192.168.0.2) -> google.com (google 看到 Wireguard 主机 (98.XX.XX.XX))
我需要的很简单:在nat(wireguard)后面的Web服务器中,所有http GET ips获取ip地址wireguard getaway(192.168.0.2)而不是24.18.22.12(真实客户端ip)192.168.0.2 - -[08/May/2022:14:15:14 +0300] "GET /view.php?show=body HTTP/1.0" 200 2803 "https://site.domain/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36"
所有请求,获取,发布等。有IP 192.168.0.2。
答案1
客户端 ip 24.18.22.12 -> Wireguard 主机 (98.XX.XX.XX) -> 内部 Web 服务器 (192.168.0.2) (内部 Web 服务器看到客户端 ip 原始 24.18.22.12,没有wireguard 网关)
嗯,你正在做 NAT,字面意思是网络地址是翻译的。所以,你想要的东西是不可能的。
所以,不能同时做NAT和不做NAT。
Wireguard 是第 3 层隧道,这意味着您实际上只能转发 IP(v4 或 v6)数据包,如果您希望客户端处理主机 IP 地址的数据包,那么您需要在主机,或使用 NAT(您不需要)。我看不出有什么不同的方法,除非你可以为客户端公开一个单独的公共 IP 地址。
因此,您需要在主机 (98.xxx) 上进行 HTTP 处理;删除您设置的所有 NAT 规则,将 nginx 设置为反向代理,它还可以处理 TLS 连接并大大减少连接时间,并使用内部(即,wireguard)客户端 IP 地址通过wireguard 隧道与实际的Web 服务器进行通信。
内部网络服务器 (192.168.0.2) -> google.com (google 看到 Wireguard 主机 (98.XX.XX.XX))
这是可能的;如果您愿意,您的主机还可以为客户端的传出连接充当 NAT“VPN 出口”的角色。实际上,为了简单起见,为了更清晰的配置,为了更高的安全性,我只是为此设置一个单独的wireguard隧道,这样你的机器就有以下设置:
答案2
您好,这实际上很简单!
在我看来,这是“最好”的方法,而不是使用代理来添加标头...此策略方法适用于所有内容,而不仅仅是 Web 服务器。
我使用它来托管具有正确原始 IP 的邮件服务器,用于 Fail2ban 和其他 IP 相关白名单。 (因为我的ISP屏蔽了25端口)
--- 假设的网络布局 --- |地点 |公共IP |线卫IP| | ---| ---| ---| |虚拟专用服务器 | 46.123.123.0 | 10.0.0.1 | |家庭服务器| 91.123.123.0 | 10.0.0.200 | 10.0.0.200 |[RGO] 随机人物在线 | 64.123.123.0 | |
这里的目标是让 RGO 在使用 VPS IP 时访问托管在家庭服务器上的网页,但报告原始源 IP (RGO) 供我们的服务使用。
- - 脚步 - -
首先,我们需要添加 DNAT 规则以将流量路由到我们的家庭服务器(在 VPS 上)
像这样的东西适用于简单的设置:
iptables -t nat -I PREROUTING 1 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.200:80
基本上,我们要求 iptables 捕获通过端口 80 接收的数据包,并将默认路由过程覆盖为我们自己的
现在数据包沿一个方向流动,但响应将无法正确路由,因此当主服务器想要发送数据时,我们将使用策略路由来正确路由数据包,而不是执行 SNAT 来让数据包回流。
它基本上是标记数据包并覆盖默认路由以再次使用我们的 Wireguard 隧道。
因此,要实现此目标,您应该将其添加到您的 Wireguard 客户端(家庭服务器)配置文件中:
[Interface]
PrivateKey = <Wireguard Private Key HERE>
Address = 10.0.0.200
Table = 123
PreUp = ip rule add from 10.0.0.200 table 123 priority 456
PostDown = ip rule del from 10.0.0.200 table 123 priority 456
[Peer]
PublicKey = <Wireguard Peer PubKey HERE>
Endpoint = 46.123.123.0:51822
AllowedIPs = 0.0.0.0/0 # This is required for this method to work
PersistentKeepalive = 25
- 结果 -
现在,当 RGO IP 向具有 DNAT 规则的 VPS IP 请求某些内容时,您的家庭服务器上的服务将看到 RGO IP。
祝你有美好的一天,
希望这对你有帮助,即使我晚了一年:D
雷恩·本·阿马尔