Как заставить клиента работать в OSX El Capitan

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

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

8 ответов

Решение

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

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

Сделайте файл, в который вы его поместите, исполняемым и выполните (после соединения с 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

Я переделал решение @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 скрипт, чтобы он автоматически выполнялся при подключении. Но по некоторым причинам, это не работает таким образом. Если кто-то может объяснить / улучшить это, пожалуйста, сделайте.

Я смог использовать старую версию Forticlient и подтвердил, что она работает!

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

https://www.dropbox.com/s/p43ssvp0gusmzeq/forticlientsslvpn_macosx_4.0.2297.dmg?dl=0

ОБНОВЛЕНИЕ: Загрузка и установка новейшей и официальной версии 5.4.1 для Mac OS X устраняет все проблемы в Mac OS X El Capitan.

Как описано на форуме fortinet, необходимо скачать новейшую (пока неопубликованную) версию FortiClient, чтобы исправить проблемы в Mac OS X El Capitan:

https://www.dropbox.com/sh/cb0j4pxw1f8nq84/AABHzZW1bpx1VjzYAmiK00S9a?dl=0

Это было самое простое решение для меня.

Я взял скрипт hbogert и обернул его в Applescript для себя и другого сотрудника, он доступен здесь: https://www.dropbox.com/s/lh0hsqdesk3i0n7/Execute-Post-VPN-Connection.app.zip?dl=0

Просто подключитесь к VPN, затем запустите приложение и введите свой пароль администратора (необходим для sudo). ПРИМЕЧАНИЕ: ДОЛЖНЫ БЫТЬ СОХРАНЕНЫ / Приложения /

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

#!/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

Подробности об этом можно найти здесь.

Немного улучшив ответ @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.

В моей текущей версии OS X (Sierra 10.12.6) и FortiClient 5.6.1 кажется, что если ServerAddresses имеет более 2 адресов, то вызов "set" ничего не сохраняется (если вы "получаете", ничего не будет обновлено). Чтобы обойти это, я решил сохранить только первый DNS-адрес FortiClient и объединить его с моим общедоступным DNS-адресом (8.8.8.8).

Более того, я бы предложил автоматически запускать скрипт bash на FortiClient connect: это можно сделать, экспортировав скрипт конфигурации FortiClient, а затем повторно импортировав его.

Полное руководство ниже:

1 / Создайте следующий скрипт bash и сохраните его где-нибудь (в моем случае это было ~/bashscripts/update-forticlient-dns.sh) и не забудьте заменить <FIRST IP ADDRESS FOR FORTICLIENT DNS> в результате scutil --dns | grep "nameserver\[0\]" пока ваше соединение с FortiClient установлено

#!/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.

Другие вопросы по тегам