由于我的供应商没有给我一个公共 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 )的已知限制。
计划:Internet <-> (ens192) VPS (wg1) <-> (wg1) homeserver
解决方案:
对于以后遇到此问题的任何人,这里是解决方案。
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 除外。