![编辑答案](https://linux22.com/image/668667/%E7%BC%96%E8%BE%91%E7%AD%94%E6%A1%88.png)
自 OSX El Capitan 以来,使用水平分割时,forticlient VPN 软件会崩溃。问题是 DNS 请求通过正常的主接口发送到 VPN 隧道的 DNS。
我们如何通过正确的接口(即 VPN 隧道)发送 DNS 请求
答案1
编辑答案
(重新)改进了几乎所有其他人的改进答案 (@elmart、@user26312、我自己)。脚本中不需要编辑:
#!/bin/bash
default_line=$(netstat -rn |grep default)
gateway=$(echo $default_line | awk '{print $2}')
interface=$(echo $default_line | awk '{print $6}')
echo $gateway
echo $interface
scutil <<EOF
d.init
get State:/Network/Service/forticlientsslvpn/IPv4
d.add InterfaceName ppp0
set State:/Network/Service/forticlientsslvpn/IPv4
EOF
route delete default
route delete -ifscope $interface default
route add -ifscope $interface default $gateway
route add -net 0.0.0.0 -interface $interface
使放入此文件的文件可执行,并使用 sudo 执行(在连接到 VPN 后)。在脚本进行任何更改之前,它会查看您当前的默认路由,因此知道您当前的网关和接口。
旧答案
这不是一个完整的解决方案,每次设置 VPN 连接后,您都必须执行以下两项高级操作:
- 我们必须将隧道的接口设置为
ppp0
- 重做默认路由(因为 1. 隐式设置了错误的默认网关,拆分隧道此后仍应正常工作)
创建一个名为的文件,scutil-forti
例如
d.init
get State:/Network/Service/forticlientsslvpn/IPv4
d.add InterfaceName ppp0
set State:/Network/Service/forticlientsslvpn/IPv4
重新进行网关路由,因此需要创建另一个文件,routes-forti
使用以下内容(请注意针对您的网络的特定设置的行):
sudo route delete default
sudo route delete -ifscope en0 default # This line depends on your interface
sudo route add -ifscope en0 default 192.168.2.252 # This depends on your normal local gateway.
sudo route add -net 0.0.0.0 -interface en0
现在执行,
$ cat scutil-forti |sudo scutil ; bash routes-forti
答案2
我已将@hbogert 的解决方案重新修改为更易于管理的单个脚本:
#!/bin/bash
scutil <<EOF
d.init
get State:/Network/Service/forticlientsslvpn/IPv4
d.add InterfaceName ppp0
set State:/Network/Service/forticlientsslvpn/IPv4
EOF
route delete default
route delete -ifscope en0 default
route add -ifscope en0 default 192.168.1.1
route add -net 0.0.0.0 -interface en0
这是假设您使用的是 en0 接口和 192.168.1.1 默认网关。如果不是,请将其替换为您的相应值。如果您不知道它们,请键入route get www.google.com
以获取它们。然后:
- 将其放入路径中某处的文件中(例如“fix-vpn”)。
- 授予其执行权限(
chmod u+x fix-vpn
)。 sudo fix-vpn
连接到 vpn 后立即使用 sudo ( ) 运行它。
我试过了,它有效。正如我所说,这只是对之前解决方案的重新设计。我只是将其作为单独的答案发布,因为我的评论空间不够。
顺便说一句,我还以为这可以包含在/etc/ppp/ip-up
脚本中,以便在连接时自动执行。但由于某种原因,它不能那样工作。如果有人可以解释/改进这一点,请这样做。
答案3
我能够使用旧版本的 Forticlient,并确认它可以正常工作!
这是我的 Dropbox 上的链接:
https://www.dropbox.com/s/p43ssvp0gusmzeq/forticlientsslvpn_macosx_4.0.2297.dmg?dl=0
答案4
稍微改进一下@elmart 的回答(我认为)。
#!/bin/bash
scutil <<EOF
d.init
get State:/Network/Service/forticlientsslvpn/IPv4
d.add InterfaceName ppp0
set State:/Network/Service/forticlientsslvpn/IPv4
EOF
ROUTE_OUT=$(route get www.google.com)
GATEWAY=$(echo "${ROUTE_OUT}"|grep gateway|cut -d':' -f2|xargs)
INTERFACE=$(echo "${ROUTE_OUT}"|grep interface|cut -d':' -f2|xargs)
echo "Fixing $INTERFACE with gateway $GATEWAY"
route delete default
route delete -ifscope $INTEFACE default
route add -ifscope $INTERFACE default $GATEWAY
route add -net 0.0.0.0 -interface $INTERFACE
这样,脚本就不需要进行编辑(更改界面也不会有问题)。xargs
用于去除空格。
我还添加了(虽然我不知道这是否是一种改进):
rootcheck () {
if [ $(id -u) != "0" ]
then
echo "We need sudo permissions to run this script"
sudo "$0" "$@" # Modified as suggested below.
exit $?
fi
}
rootcheck "$@"
在脚本的最开始部分提醒人们使用 sudo。