從 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 連線設定後,您必須執行以下兩項進階操作:
- 我們必須將隧道的介面設定為
ppp0
- 重做預設路由(因為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。