由于我的提供商没有给我提供公共 IPv4 地址,因此我使用 VPS 结合 Wireguard 隧道来使我的家庭服务器可从 Internet 访问(通过 Ipv4 和 Ipv6)。
在我的家庭服务器上,流量首先到达反向代理(Traefik)。目前,我正在使用 rinetd 将 VPS 上端口 80/443 的传入流量转发到我的家庭服务器 (10.10.0.2) 的 Wireguard IP 地址。这有效,但存在一个问题,即数据包的源 IP 始终是我的 VPS (10.10.0.1) 的 wireguard IP。这是 rinetd 的已知限制(https://manpages.ubuntu.com/manpages/bionic/man8/rinetd.8.html)。
计划:互联网 <-> (ens192) VPS (wg1) <-> (wg1) 家庭服务器
解决方案:
对于以后遇到此问题的人,这里是解决方案。
VPS 上的 Iptables 配置:
iptables -I FORWARD -d 10.10.0.2 -p tcp -m conntrack --ctstate DNAT -j ACCEPT
iptables -I FORWARD -s 10.10.0.2 -p tcp -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -t nat -I PREROUTING -p tcp -d [VPS public IP] -i ens192 --dport 80 -j DNAT --to-destination 10.10.0.2:80
iptables -t nat -I PREROUTING -p tcp -d [VPS public IP] -i ens192 --dport 443 -j DNAT --to-destination 10.10.0.2:443
iptables -t nat -A POSTROUTING -o ens192 -j SNAT --to-source [VPS public IP]
ip6tables -I FORWARD -d fdb0:926d:918e::2 -p tcp -m conntrack --ctstate DNAT -j ACCEPT
ip6tables -I FORWARD -s fdb0:926d:918e::2 -p tcp -m conntrack --ctstate ESTABLISHED -j ACCEPT
ip6tables -t nat -I PREROUTING -p tcp -d [VPS public IP] -i ens192 --dport 80 -j DNAT --to-destination [fdb0:926d:918e::2]:80
ip6tables -t nat -I PREROUTING -p tcp -d [VPS public IP] -i ens192 --dport 443 -j DNAT --to-destination [fdb0:926d:918e::2]:443
ip6tables -t nat -A POSTROUTING -o ens192 -j SNAT --to-source [VPS public IP]
在家庭服务器上:配置路由:
ip -4 route add default dev wg1 table 4242
ip -6 route add default dev wg1 table 4242
ip -4 rule add pref 500 from 10.10.0.2 lookup 4242
ip -6 rule add pref 500 from fdb0:926d:918e::2 lookup 4242
并配置 wireguard allowedIPs 以允许所有 IP,除本地(家庭)网络和我的 VPS 的公共 IPv4 和 IPv6 之外。
答案1
在此之后,我能够使用 iptables 使我的家庭服务器可用,但源 IP 仍然只有 10.10.0.1。
因为您添加了SNAT
强制源 IP 的规则,所以我猜想是这样的。本教程告诉您应用 SNAT,这样主服务器就会被诱骗通过相同的 WireGuard 隧道正确回复,而不是将其回复直接发送到其常规默认路由的 WAN IP。(如果没有它,客户端会尝试与您的 VPS IP 通信,但会收到来自您的 ISP 公共 IP 的回复。)
从 VPS 的 iptables 中删除 SNAT 规则,然后进行设置策略路由作为替代方案,在家庭服务器上,如过去几个帖子中所述。使用ip rule
或 systemd-networkd[RoutingPolicyRule]
来确保回复是否到达从家庭服务器的 WireGuard IP,它们也将通过 WireGuard 进行路由。(Table=
在这里指定 wg-quick 的选项可能会很有用,然后您可以创建一个仅引用 wg-quick 创建的表的规则。)