我设置了 Wireguard VPN,用于iptables
将 VPS 上收到的数据包(带有 )转发到服务器,效果很好。但是,eno2
Debian 自动配置的(服务器的)接口会创建 IP 路由,其中一个是x:x:x:x::/64 dev eno2
,即服务器所在的本地网络。
这会产生不必要的行为,因为当我(从本地网络)通过 VPS 向服务器发送数据包时(这意味着服务器将在接口 上接收数据包wg0
),服务器会在本地网络(接口eno2
)上进行回复,因为源 IPv6 地址在 Internet 和本地网络上是相同的,因此与路由匹配x:x:x:x::/64 dev eno2
,即使非本地 IPv6 流量通过 发送wg0
。并且它使用我发送数据包的计算机不知道的 IP 地址进行响应,因为我已使用 Wireguard 设置了 NAT。
正如标题所写,IPv4 不会发生这种情况,因为它使用 NAT,所以源 IP 地址不匹配192.168.1.0/24 dev eno2
。
我始终可以直接连接到服务器而不通过 VPS,或者fe80::/10
在需要时使用本地链接地址进行连接,并使用具有较低度量和较高优先级的路由(例如x:x:x:x::/64 dev wg0 metric 200 pref high
)覆盖自动配置的路由,以保留 Debian 所做的自动配置,但此路由除外。但这没有考虑到网络前缀可能会发生变化。我也能够通过从 VPS 添加 SNAT 规则来使其工作,iptables
但这会破坏需要源 IP 地址的服务(例如 SPF)。
有没有更好的解决方案?也许可以添加一条将数据包从 发送回 的路由wg0
,wg0
并使该路由优先于 路由x:x:x:x::/64 dev eno2
,这样我仍然可以使用其公共 IPv6 地址访问本地网络上的服务器?
为 VPN 分配服务器现有网络之外的不同地址。尤其是与通过以太网的任何 /64 链路上的地址不同。
好的托管服务提供商会根据请求将多个从未使用的 /64 路由到您的主机,例如 /56。然后,您可以为 VPN 地址设置整个 /64。作为公共 IP 地址,如果防火墙允许,它们可以访问互联网。
质量较差的托管服务提供商只会提供额外的链接前缀。他们的网关会假设它可以通过以太网进行 NDP,而实际上它需要通过 wg 通过您的服务器进行路由。像使用 ndpresponder 程序一样,自己进行 NDP 回复以使其工作。
如果不需要互联网访问,请考虑生成 ULA 地址以用于 VPN 地址。请访问此处获取适合您的 ULA 前缀。
地址空间如此之大,地球上的每个人都可以分配数千个 /48,这个数字要大得多,到那时利用率可能就会很明显。为各种目的建立新子网是更简单的 IPv6 处理方式。
我可能表达得不太好,所以只是为了说明一下:我正在使用 VPS 作为反向代理来访问我的服务器。我想要访问服务器的客户端不在 VPN 上,但它与服务器在同一个本地网络上,所以这就是问题所在:
尽管我预期:
2001::1
是客户端的IPv6地址,fdea:0335:40b8::2
是VPN内服务器的IPv6地址。因为我在 VPN 上使用 ULA,所以我可以根据源地址路由数据包(检查它是否是 VPN 的地址)。
服务器在本地网络上有一个 IPv6 地址,例如
x:x:x:x::2
,在 VPN 上有一个地址,例如fdea:0335:40b8::2
。由于 VPS 通过将 IP 目标更改为 来通过 VPN 将数据包转发到服务器fdea:0335:40b8::2
,因此服务器将使用此 IPv6 地址进行回复。有了这些信息,我可以执行以下操作:这样就解决了问题,因为
fdea:0335:40b8::2/128
比前面提到的路由更具体,因此具有优先级。然后我可以在配置文件x:x:x:x::/64
中添加上述命令和,以便它们仅在必要时才处于活动状态。wg0
PostUp=
PreDown=
感谢所有提供帮助的人,请告诉我是否需要进一步澄清或做任何修改以使这个问题和答案更具可利用性。