編輯後的答案

編輯後的答案

從 OSX El Capitan 開始,使用水平分割時,forticlient VPN 軟體就會崩潰。問題在於 DNS 請求在正常主介面上傳送到 VPN 隧道的 DNS。

我們如何讓 DNS 請求透過正確的介面(即 VPN 隧道)發送出去

答案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 並確認它可以工作!

這是我的保管箱上的連結:

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。

相關內容