编辑答案

编辑答案

自 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 连接后,您都必须执行以下两项高级操作:

  1. 我们必须将隧道的接口设置为ppp0
  2. 重做默认路由(因为 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。

相关内容