![通过 WireGuard VPN 从 Docker 容器将呼叫路由到 IP 过滤的 Web 服务](https://linux22.com/image/771631/%E9%80%9A%E8%BF%87%20WireGuard%20VPN%20%E4%BB%8E%20Docker%20%E5%AE%B9%E5%99%A8%E5%B0%86%E5%91%BC%E5%8F%AB%E8%B7%AF%E7%94%B1%E5%88%B0%20IP%20%E8%BF%87%E6%BB%A4%E7%9A%84%20Web%20%E6%9C%8D%E5%8A%A1.png)
设想:
一个简单的 PHP 脚本 (myip.php),托管在具有公共 IP WSIP 的服务器上。该脚本可通过 http 和 https 访问。
我有一台小型服务器 (GW),具有公共 IP GWIP。此服务器仅用作网关。
另一台服务器(WORKER)必须访问 php 脚本,但是仅通过 GW.WORKER 上安装了 Docker。
Wireguard配置在GW和WORKER之间,充当GW的VPN服务器。
网关 wg0.conf
[Interface]
PrivateKey = <GW-PRI-K>
Address = 10.1.0.1/24
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = <WORKER-PUB-K>
AllowedIPs = 10.1.0.2/32,10.1.0.0/24
工作者 wg0.conf
[Interface]
PrivateKey = <WORKER-PRI-K>
Address = 10.1.0.2/24
[Peer]
PublicKey = <GW-PUB-K>
Endpoint = GWIP:51820
AllowedIPs = 10.1.0.1/24,WSIP/32
PersistentKeepalive = 25
从 WORKER(主机)我可以访问 Web 服务。一切正常。
curl http://$WSIP/myip.php
xxx.xxx.243.174
curl https://$WSIP/myip.php
xxx.xxx.243.174
但是,如果我从 docker 容器运行相同的命令:
curl http://$WSIP/myip.php
xxx.xxx.243.174
curl https://$WSIP/myip.php
没有反应对于 https。
WORKER相关路由表条目:
10.1.0.0/24 dev wg0 proto kernel scope link src 10.1.0.2
WSIP dev wg0 scope link
看起来访问服务器 WS 没有问题,但是响应出现了一些问题。
我非常确信解决方案应该与伪装有关,但几个小时后我有点迷失了。
有什么线索吗?
答案1
由于您使用 http 获得了答案,因此这不应该是路由或网络故障。此外,您使用 curl 不会收到错误,因此它可能只是一个空答案。
您能否尝试获取 http 代码curl -I https://$WSIP/myip.php
,并使用 使 curl 详细显示curl -v https://$WSIP/myip.php
?
您还可以检查 php 日志。