Программное обеспечение forticlient VPN не работает при использовании разделенного горизонта, начиная с OSX El Capitan. Проблема в том, что запросы DNS отправляются через обычный первичный интерфейс в DNS туннеля VPN.
Как получить DNS-запросы, которые будут отправляться через правильный интерфейс (например, VPN-туннель)
(Re) улучшил улучшенный ответ почти всех остальных (@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-соединения:
ppp0
Создайте файл с именем 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
получить их. Затем:
chmod u+x fix-vpn
).sudo fix-vpn
) сразу после подключения к vpn.Я пробовал и работает. Как я уже сказал, это просто переработка предыдущего решения. Я просто разместил это как отдельный ответ, потому что у меня не было достаточно места в комментарии.
Кстати, я тоже подумал, что это можно включить в /etc/ppp/ip-up
script, чтобы он автоматически выполнялся при подключении. Но почему-то так не работает. Если кто-то может объяснить / улучшить это, пожалуйста, сделайте это.
Я смог использовать старую версию 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
Для меня это было самым простым решением.
Немного улучшив ответ @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.
Я взял сценарий Хбогерта и обернул его в Applescript для себя и другого сотрудника, он доступен здесь: https://www.dropbox.com/s/lh0hsqdesk3i0n7/Execute-Post-VPN-Connection.app.zip?dl=0
Просто подключитесь к VPN, затем запустите приложение и введите свой пароль администратора (требуется для sudo). ПРИМЕЧАНИЕ: ДОЛЖЕН БЫТЬ СОХРАНЕН В / Applications /
Я решил проблему для себя, перенастроив настройки 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
Подробности об этом можно найти Вот.
В моей текущей версии OS X (Sierra 10.12.6) и FortiClient 5.6.1 кажется, что если ServerAddresses имеет более двух адресов, то вызов "set" ничего не сохраняет (если вы "получите", ничего не будет обновлено). Чтобы обойти это, я решил оставить только первый DNS-адрес FortiClient и объединить его с моим публичным DNS-адресом (8.8.8.8).
Более того, я бы предложил автоматически запускать сценарий bash при подключении FortiClient: это можно сделать, экспортировав сценарий конфигурации 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 = "ВАШЕ СОЕДИНЕНИЕ"] / on_connect / script / script node и вызовите внутри него свой скрипт:
<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.