我已连接到雇主的 VPN,并尝试手动向工作站添加路由,以便通过 VPN 发送主机流量。如何发现 VPN 网关的本地 IP 地址?
TMI:有人告诉我,手动指定路由是必要的,因为 Linux 不支持基于 DNS 的路由。(我完全不明白。)至少我可以确认,我对目标主机的请求始终超时。
读过这个帖子,我想我需要发现这个IP地址,然后执行:
route add -host <Target Server IP> gw <Local IP of VPN Gateway>
我的 VPN 客户端是思科 AnyConnect。我尝试通过运行 来查找网关ip route | grep default
,但这只给出了我的 wifi 路由器的地址。运行后,ip a
我得到了以下信息:
5: cscotun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1390 qdisc fq_codel state UNKNOWN group default qlen 500
link/none
inet [AN IPv4 ADDRESS]/32 brd [AN IP ADDRESS] scope global cscotun0
valid_lft forever preferred_lft forever
inet6 [AN IPv6 ADDRESS]/126 scope link
valid_lft forever preferred_lft forever
inet6 [AN IPv6 ADDRESS]/64 scope link stable-privacy
valid_lft forever preferred_lft forever
答案1
TMI:有人告诉我,手动指定路由是必要的,因为 Linux 不支持基于 DNS 的路由。(我完全不明白。)至少我可以确认,我对目标主机的请求始终超时。
这在一定程度上是正确的,但并不完全像你所暗示的那样。
IP 路由绝不基于 DNS,因为名称查找是与路由查找分开的步骤——当操作系统需要检查路由表时,它无法将其与使用的原始域名相关联。
因此,在这方面 Windows 和 Linux 之间没有区别。企业 VPN 通常通过为用户可能需要访问的所有主机提供特定的基于 IP 的路由来工作。
Windows 和 Linux做不同之处在于能够“路由”DNS 查找本身根据后缀将其分配给不同的 DNS 服务器。Linux 仅在使用“systemd-resolved”(并且 VPN 应用程序与其配合)或手动配置其他应用程序(例如使用 dnsmasq)时才支持此功能,而 Windows 则将其“原生”化。
(许多人还不认为 systemd 提供的功能是“内置的”。)
企业 VPN 通常使用“分离 DNS”,其中像“foo.example.com”这样的域名可能会产生不同的结果 - 即当查询 VPN DNS 服务器时解析为私有 IP 地址,否则解析为公共 IP 地址。在这种情况下,您不需要基于域的 IP 路由,而是需要 DNS 查询来使用正确的 DNS 服务器。
我的 VPN 客户端是 Cisco AnyConnect。我尝试通过运行 ip route | grep default 来查找网关,但这只给出了我的 wifi 路由器的地址。
是的,你的 VPN 没有设置“默认”路由;这对于企业 VPN 来说通常是正常的。(事实上,如果有曾是通过 VPN 的默认路由,你首先不会遇到这个问题,因为全部无论如何,流量都会通过 VPN!)
但是,还请注意,AnyConnect 使用“tun”接口,即“第 3 层隧道”或“点对点”隧道。对于这种隧道类型,远程网关实际上无关紧要(因为没有可能受其影响的第 2 层标头),并且路由仅指定设备就足够了。
例如:
ip route add <TargetServerIP>/32 dev cscotun0
答案2
我怀疑您是否想要“VPN 网关的本地 IP 地址”,因为这不会路由流量。事实上,您截取的第二段文本的第一个 [AN IPv4 ADDRESS] 第三行显示了这一点。
我首先要尝试的是不使用 IP 地址,而只使用接口,例如使用如下命令
ip route add [IP ADDRESS OR ROUTE/XX] dev cscotun0
如果你想找到 VPN 网关的远程 IP 地址(需要通过该地址传输流量),下面的方法可能会有效
ip route | grep "cscotun0" | grep "link" | cut -f1 -d" "
(我没有对此进行过确切的测试,因为我只有一个 OpenVPN tun 设备。我们的想法是找到与设备关联的直接连接路由以获取远程端 - 这确实假设 cscotun0 设备是一个点对点设备)
我不确定“Linux 不支持基于 DNS 的路由”是什么意思。您可以在“ip”或“route”命令中指定域名,它肯定会起作用。它不会做的是,如果 DNS 在命令运行后发生变化,它会更新远程 IP 地址 - 您需要重新运行该命令。任何其他行为都没有意义,因为这意味着要对穿过路由器的每个数据包进行 DNS 查找,这将非常缓慢且浪费资源。