Як заставити працюючих в OSX El Capitan


10

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

Як нам отримати запити DNS надсилати через правильний інтерфейс (тобто тунель VPN)

Відповіді:


11

Відредагована відповідь

(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 вам доведеться виконати дві наступні речі високого рівня:

  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

Але ці кроки потрібно відміняти після відключення, чи не так?
elmart

1
TL; DR не потрібно повертати. Ні, State:/Network/Service/forticlientsslvpn/IPv4ключ є, щоб почати з того, як тунель VPN запущений і видалений, коли тунель VPN видалений, від'єднується. Маршрути насправді не відрізняються від тих, якими вони мають бути.
hbogert

8

Я переробив рішення @ 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сценарій, щоб він автоматично виконувався при підключенні. Але чомусь це не працює так. Якщо хтось може пояснити / покращити це, будь ласка, зробіть це.



1

ОНОВЛЕННЯ: Завантаження та встановлення новітньої та офіційної версії 5.4.1 для Mac OS X виправляє всі проблеми на Mac OS X El Capitan.

Як описано на форумі fortinet, для виправлення неполадок на Mac OS X El Capitan слід завантажити найновішу (поки що не опубліковану) версію FortiClient:

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

Це було найпростішим рішенням для мене.


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 "$@"

На самому початку сценарію, щоб нагадати людям використовувати судо.


route getДля усунення залежності від DNS було б краще використовувати IP-адресу в команді.
kasperd

Оскільки це запитання має розділений мозок, навіть після підключення VPN маршрут вашого за замовчуванням, ймовірно, ваш шлюз. Ви можете просто скребти, $ netstat -rnщоб отримати шлюз та інтерфейс.
hbogert

0

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

Просто підключіться до VPN, потім запустіть додаток і введіть пароль свого адміністратора (необхідний для sudo). ПРИМІТКА: ОБОВ'ЯЗКОВО ЗБЕРЕГАТИ В


0

Я вирішив проблему для мене, переконфігурувавши параметри 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

Детальніше про це можна прочитати тут .


Що ж станеться, якщо мені потрібен DNS моєї компанії для вирішення імен хостів у мережі компанії?
hbogert

Це залежить від налаштування VPN. Зазвичай "внутрішні" DNS-сервери передаються на вашу машину. Це ті, кого я назвав "<ІР-АДРЕСИ ДЛЯ ДНІЗУ З ФОРТИКЛІЕНТА>". Якщо ваша машина не може вирішити адресу з 8.8.8.8 або 8.8.4.4, вона використовує DNS-сервери, визначені IP-адресами в розділі "<АДРЕСИ IP для ДНС ВІД ФОРТИКЛІЕНТА>".
Крістоф Герман

0

У моїй поточній версії OS X (Sierra 10.12.6) та FortiClient 5.6.1, схоже, якщо ServerAddresses має більше ніж 2 адреси, то виклик "встановити" нічого не зберігається (якщо ви "отримаєте", нічого не буде оновлено). Щоб вирішити це, я вирішив зберегти лише першу 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 = "ВАШЕ З'ЄДНАННЯ"] / 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.