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
rootcheck () {
if [ $(id -u) != "0" ]
then
echo "We need sudo permissions to run this script"
sudo "$0" "$@" # Modified as suggested below.
exit $?
fi
}
rootcheck "$@"
我通过重新配置 DNS 设置以在 FortiClient 提供的服务器之前使用 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 有超过 2 个地址,那么“set”调用不会持续任何东西(如果你“get”,什么都不会更新)。为了解决这个问题,我决定只保留第一个 FortiClient DNS 地址并将其与我的公共 DNS 地址(8.8.8.8)合并。
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
编辑后的答案
(重新)改进了几乎所有其他人的改进答案(@elmart,@user26312,我自己)。脚本中不需要编辑:
使用 sudo 使您放入的文件可执行并执行(在连接 VPN 之后)。在脚本进行任何更改之前,它会查看您当前的默认路由,因此知道您当前的网关和接口。
旧答案
这不是一个完整的解决方案,您必须在每次 VPN 连接设置后执行以下两项高级操作:
ppp0
scutil-forti
例如,使用名称创建一个文件重做网关路由,因此制作另一个文件 ,
routes-forti
(注意带有特定网络设置的行):现在,执行,
我已经将@hbogert 的解决方案改造成更易于管理的单个脚本:
假设您使用的是 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 的答案(我认为)。
这样脚本就不需要被编辑(并且改变界面不应该是一个问题)。
xargs
用于去除空格。我还添加了(虽然我不知道这是否是一种改进):
到脚本一开始就提醒人们使用 sudo。
我拿了 hbogert 的脚本并将其包装在 Applescript 中,供我自己和另一位员工使用,可在此处获得: https ://www.dropbox.com/s/lh0hsqdesk3i0n7/Execute-Post-VPN-Connection.app.zip?dl=0
只需连接到 VPN,然后执行应用程序并输入您的管理员密码(sudo 需要)。注意:必须保存在 /Applications/
我通过重新配置 DNS 设置以在 FortiClient 提供的服务器之前使用 Google DNS 服务器为我解决了这个问题。不幸的是,这必须在每次重新连接后完成。
可以在此处找到有关此的详细信息。
在我当前的 OS X 版本(Sierra 10.12.6)和 FortiClient 5.6.1 上,如果 ServerAddresses 有超过 2 个地址,那么“set”调用不会持续任何东西(如果你“get”,什么都不会更新)。为了解决这个问题,我决定只保留第一个 FortiClient DNS 地址并将其与我的公共 DNS 地址(8.8.8.8)合并。
此外,我建议在 FortiClient 连接上自动运行 bash 脚本:这可以通过导出 FortiClient 配置脚本然后重新导入来完成
完整指南如下:
1/ 创建以下 bash 脚本并将其存储在某处(在我的情况下,它是在 中
~/bashscripts/update-forticlient-dns.sh
)并且不要忘记用FortiClient 连接时<FIRST IP ADDRESS FOR FORTICLIENT DNS>
的结果替换scutil --dns | grep "nameserver\[0\]"
2/ 运行 FortiClient,然后进入Preferences > General并单击Backup按钮,这会将您的 FortiClient 配置导出到文件中
3/ 在此文件中,找到并编辑/forticlient_configuration/vpn/sslvpn/connections/connection[name="YOUR CONNECTION"]/on_connect/script/script节点并在其中调用您的脚本:
4/ 返回 FortiClient 控制台,单击左下角的锁,然后转到Preferences > General并单击Restore按钮:找到更新的配置文件,就是这样,您的 DNS 配置将在每次更新时即时更新连接到 VPN。