Отредактированный ответ

Отредактированный ответ

Программное обеспечение forticlient VPN зависает при использовании split horizon, начиная с OSX El Capitan. Проблема в том, что DNS-запросы отправляются на нормальный основной интерфейс к DNS VPN-туннеля.

Как сделать так, чтобы DNS-запросы отправлялись через правильный интерфейс (т.е. VPN-туннель)?

решение1

Отредактированный ответ

(Повторно)улучшенный ответ почти всех остальных (@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

Сделайте файл, в который вы это вставляете, исполняемым и выполните его (после подключения к VPN) с помощью sudo. Прежде чем скрипт внесет какие-либо изменения, он просматривает ваш текущий маршрут по умолчанию и, следовательно, знает ваш текущий шлюз и интерфейс.


Старый ответ

Это не полное решение, вам придется выполнить следующие две важные вещи после каждой настройки 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 ( sudo fix-vpn) сразу после подключения к VPN.

Я попробовал, и это работает. Как я уже сказал, это просто переработка предыдущего решения. Я просто опубликовал его как отдельный ответ, потому что у меня не хватило места в комментарии.

Кстати, я тоже думал, что это можно включить в /etc/ppp/ip-upскрипт, чтобы он автоматически выполнялся при подключении. Но по какой-то причине это так не работает. Если кто-то может объяснить/улучшить это, пожалуйста.

решение3

Мне удалось воспользоваться старой версией Forticlient и убедиться, что она работает!

Вот ссылка на него в моем Dropbox:

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.

Связанный контент