如何让Forticlient在OSX El Capitan中工作


10

从OSX El Capitan开始,使用水平分割时forticlient VPN软件很烂。问题是DNS请求在正常的主接口上发送到VPN隧道的DNS。

我们如何获得通过正确接口(即VPN隧道)发送的DNS请求

Answers:


11

编辑答案

(重新)对其他所有人的改进答案(@ 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连接设置之后,您都必须做以下两件事:

  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

但是,断开连接后应该恢复这些步骤,不是吗?
Elmart 2015年

1
TL; DR无需还原。否,该State:/Network/Service/forticlientsslvpn/IPv4密钥从VPN隧道运行开始就存在,并且在删除VPN隧道断开连接时被删除。路线实际上并没有什么不同。
hbogert 2015年

8

我已经将@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脚本中,以便在连接时自动执行。但是由于某种原因,它不能那样工作。如果有人可以对此进行解释/改进,请这样做。




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的依赖性。
卡巴斯德(Kasperd),2015年

由于此问题的问题在于大脑裂开,即使在VPN连接后,您的默认路由也可能是您的网关。您只需刮擦$ netstat -rn即可获取网关和接口。
hbogert

0

我拿了hbogert的脚本,并为自己和另一位员工将其包装在Applescript中,可以在这里找到:https ://www.dropbox.com/s/lh0hsqdesk3i0n7/Execute-Post-VPN-Connection.app.zip?dl =0

只需连接到VPN,然后执行该应用程序并输入您的管理员密码(对于sudo而言是必需的)。注意:必须保存在/ Applications /


0

我通过在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

可以在这里找到有关此内容的详细信息。


那么,如果我需要公司的DNS来解析公司网络中的主机名怎么办?
hbogert

这取决于VPN的配置方式。通常,“内部” DNS服务器会传递到您的计算机。这些就是我所说的“ <来自FORTICLIENT的DNS的IP地址>”。如果您的计算机无法解析8.8.8.8或8.8.4.4的地址,它将使用由“ <从FORTICLIENT发送给DNS的IP地址”中的IP地址定义的DNS服务器。
Christoph Hermann

0

在我当前的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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.