Answers:
(重新)对其他所有人的改进答案(@ elmart,@ user26312,myself)进行了改进。脚本中不需要编辑:
#!/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
创建一个名称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
State:/Network/Service/forticlientsslvpn/IPv4
密钥从VPN隧道运行开始就存在,并且在删除VPN隧道断开连接时被删除。路线实际上并没有什么不同。
我已经将@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
以获取它们。然后:
chmod u+x fix-vpn
)。sudo fix-vpn
连接到vpn后,立即使用sudo()运行它。我已经尝试过了,而且效果很好。正如我所说,这只是先前解决方案的重做。我只是将其发布为单独的答案,因为我的评论空间不足。
顺便说一句,我还认为这可以包含在/etc/ppp/ip-up
脚本中,以便在连接时自动执行。但是由于某种原因,它不能那样工作。如果有人可以对此进行解释/改进,请这样做。
我能够使用旧版本的Forticlient,并确认它可以工作!
这是我的保管箱上的链接:
https://www.dropbox.com/s/p43ssvp0gusmzeq/forticlientsslvpn_macosx_4.0.2297.dmg?dl=0
更新:下载并安装Mac OS X的最新官方版本5.4.1解决了Mac OS X El Capitan上的所有问题。
如在fortinet论坛中所述,应该下载最新版本(尚未发布)的FortiClient来解决Mac OS X El Capitan上的问题:
https://www.dropbox.com/sh/cb0j4pxw1f8nq84/AABHzZW1bpx1VjzYAmiK00S9a?dl=0
这对我来说是最简单的解决方案。
我认为,@ 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。
route get
命令中使用IP地址来消除对DNS的依赖性。
$ netstat -rn
即可获取网关和接口。
我通过在FortiClient提供的服务器之前重新配置DNS设置以使用Google DNS服务器为我解决了该问题。不幸的是,这必须在每次重新连接后完成。
#!/bin/bash
scutil <<EOF
d.init
d.add ServerAddresses 8.8.8.8 8.8.4.4 <IP ADDRESSES FOR DNS FROM FORTICLIENT>
set State:/Network/Service/forticlientsslvpn/DNS
quit
EOF
可以在这里找到有关此内容的详细信息。
在我当前的OS X版本(Sierra 10.12.6)和FortiClient 5.6.1上,如果ServerAddresses具有两个以上的地址,则“ set”调用不会持久化任何内容(如果“ get”,则不会有任何结果)更新)。要解决此问题,我决定仅保留第一个FortiClient DNS地址,并将其与我的公共DNS地址(8.8.8.8)合并。
此外,我建议在FortiClient connect上自动运行bash脚本:这可以通过导出FortiClient配置脚本然后重新导入来完成。
完整指南如下:
1 /创建以下bash脚本并将其存储在某个位置(在我的情况下,它存储在中~/bashscripts/update-forticlient-dns.sh
),并且不要忘记用FortiClient连接启动时<FIRST IP ADDRESS FOR FORTICLIENT DNS>
的结果替换scutil --dns | grep "nameserver\[0\]"
。
#!/bin/bash
ROOT_PASSWORD=$1
# Uncomment this if you want to log everything happening during this script execution into a dedicated log file
# exec >/tmp/forticlient-log 2>&1
# Ensuring we did a sudo correctly once
# Because we cannot both use a pipe and an stdin redirection at the same time
# (or at least, my bash knowledge is not wide enough for that :-))
echo "$ROOT_PASSWORD" | sudo -S ls /dev/null
sudo scutil <<EOF
get State:/Network/Service/forticlientsslvpn/DNS
d.add ServerAddresses 8.8.8.8 <FIRST IP ADDRESS FOR FORTICLIENT DNS>
set State:/Network/Service/forticlientsslvpn/DNS
quit
EOF
2 /运行FortiClient,然后进入“首选项” >“ 常规”,然后单击“ 备份”按钮,这会将您的FortiClient配置导出到文件中
3 /在此文件中,找到并编辑/ forticlient_configuration / vpn / sslvpn / connections / connection [name =“ YOUR CONNECTION”] / on_connect / script / script节点,并在其中调用脚本:
<on_connect>
<script>
<os>mac</os>
<script>/Users/fcamblor/bashscripts/update-forticlient-dns.sh "your_secret_root_password_here"</script>
</script>
</on_connect>
4 /返回到FortiClient控制台,单击左下角的锁,然后转到“首选项” >“ 常规”,然后单击“ 还原”按钮:找到更新的配置文件,就是这样,每次您进行DNS配置都会实时更新连接到VPN。