WireGuard 握手不遵守路由表

WireGuard 握手不遵守路由表

我正在尝试将 Cisco AnyConnect VPN 之后的 WireGuard 隧道链接到我的公司网络。在办公室,我可以激活隧道,一切运行正常。在家里,我首先激活 AnyConnect VPN。

运行route -n get <ENDPOINT IP>返回 AnyConnect 网关和接口。此外,traceroute <ENDPOINT IP>还给出了预期的结果。但是,tcpdump -host <ENDPOINT IP>显示在尝试激活 WireGuard 隧道时,UDP 数据包通过默认接口(WiFi)发送,并且永远不会到达服务器。

我尝试过使用 AnyConnect VPN 处理所有流量,而不仅仅是公司网络。然后,握手成功了,因为 AnyConnect 接口首先出现在路由表中。但在这种情况下,我无法使用隧道,因为进入隧道 IP 范围的流量仍然通过 AnyConnect VPN 路由。通过添加新路由route -n add -net 10.60.0.0 <WG GATEWAY>不会导致错误,但之后该规则实际上并不存在于路由表中。

重要的:10.60.0.0/16 网络未被公司使用,因此添加上述路由不会与已经存在的路由冲突。

所以我想我有两个问题:

  1. 是否可以明确告诉 WireGuard 使用哪个接口进行握手?
  2. 如何从 Cisco AnyConnect 中排除某些 IP?

答案1

解决方案是使用 CLI 设置 WireGuard 界面。使用完全相同的设置,并在 VPN 关闭时创建两者,使用wg-quick up <name>.conf可以工作,但应用程序却不行。

非常有趣的行为,可能是个错误。

答案2

WireGuard 文章 路由和网络命名空间集成 可能有以下解释:

当创建 WireGuard 接口时(使用 ip link add wg0 type wireguard),它会记住创建它的命名空间。“我是在命名空间 A 中创建的。”稍后,WireGuard 可以移动到新的命名空间(“我正在移动到命名空间 B。”),但它仍然会记住它起源于命名空间 A。

WireGuard 使用 UDP 套接字来实际发送和接收加密数据包。此套接字始终位于命名空间 A(原始出生地命名空间)中。这允许一些非常酷的属性。也就是说,您可以在一个命名空间 (A) 中创建 WireGuard 接口,将其移动到另一个命名空间 (B),并让从命名空间 B 发送的明文数据包通过命名空间 A 中的 UDP 套接字以加密形式发送。

由于您在办公室中创建了界面,因此 WireGuard 现在使用与办公室中相同的界面。

为了使其使用 VPN,解决方案可能是在 VPN 连接时重新创建 WireGuard 接口。

相关内容