OS X> 10.6.5 Порядок пошуку DNS за допомогою VPN


13

Після оновлення до OS X 10.6.5 (з .4) програми, здається, не шукають імена хостів у правильному порядку (відповідно до порядку обслуговування в мережевих налаштуваннях), коли підключений мій VPN.

Моя поточна настройка - це служба VPN Cisco IPSec перед службою AirPort. DNS-сервери автоматично встановлюються для з'єднання VPN (що в порядку), і DNS служби AirPort вказує на мій маршрутизатор (192.168.1.1, який вказується на сервери OpenDNS).

Коли мій VPN підключений, я хотів би, щоб пошук DNS спочатку пройшов через сервери VPN DNS, але всі мої програми (Firefox, Thunderbird, ssh) спочатку використовують мій DNS-сервер AirPort (OpenDNS).

Перед оновленням це працювало чудово.

Дякуємо за будь-яку допомогу.

** редагувати **

Я натрапив на цю посаду і запустив команди у прийнятій відповіді. Це, здається, не допомогло.

Провівши трохи більше, я натрапив на цю команду: scutil --dns

Вихід з команди знаходиться нижче. Все виглядає правильно, за винятком того, що я думаю, що розв’язувач №2 повинен стати першим, і в дозволі №1 є пошуковий домен (це, очевидно, не foobar.com, а справжній домен VPN). Я думаю, що це була помилка (або що б там не було). Я не вказував її вручну, і це не на вкладці DNS для мого з'єднання AirPort. Коли VPN відключено, цього пошукового домену немає, і роздільник №2 відсутній, як і належить.

resolver #1
  search domain[0] : foobar.com
  nameserver[0] : 192.168.1.1
  order   : 200000

resolver #2
  domain : foobar.com
  nameserver[0] : 172.30.50.100
  nameserver[1] : 172.30.50.80
  order   : 100200

resolver #3
  domain : local
  options : mdns
  timeout : 2
  order   : 300000

resolver #4
  domain : 254.169.in-addr.arpa
  options : mdns
  timeout : 2
  order   : 300200

resolver #5
  domain : 8.e.f.ip6.arpa
  options : mdns
  timeout : 2
  order   : 300400

resolver #6
  domain : 9.e.f.ip6.arpa
  options : mdns
  timeout : 2
  order   : 300600

resolver #7
  domain : a.e.f.ip6.arpa
  options : mdns
  timeout : 2
  order   : 300800

resolver #8
  domain : b.e.f.ip6.arpa
  options : mdns
  timeout : 2
  order   : 301000

** редагувати **

Ну, поки хтось не зможе відповісти на моє запитання, я написав сценарій, щоб допомогти у вирішенні, зазначеному нижче. Його слід запустити після підключення VPN та запустити знову після відключення (я не знайшов способу запустити його автоматично). Кілька приміток:

  1. Мій обліковий запис працює як адміністратор з розблокованими мережевими налаштуваннями, тому я не впевнений, як цей сценарій спрацював би над усім.

  2. Вам потрібно встановити vpn_srvc_name у сценарії до свого, ви здогадалися, імені служби vpn.

  3. Я впевнений, що, мабуть, є простіший спосіб зробити це, тому сміливо розміщуйте свої зауваження.

Сценарій:

#!/bin/bash

function get_pri_srvc_id ()
{
  cat <<EOF | scutil | \
    grep 'PrimaryService' | \
    awk -F': ' '{print $2}'
show State:/Network/Global/IPv4
EOF
}

function get_srvc_name ()
{
  cat <<EOF | scutil | \
    grep 'UserDefinedName' | \
    awk -F': ' '{print $2}'
show Setup:/Network/Service/$1
EOF
}

function get_srvc_ids ()
{
  cat <<EOF | scutil | \
    sed -nEe '
/ServiceOrder/ {
  :ids
  n
  /[0-9]+ :/ {
    s/ *[0-9]+ : ([0-9A-Z-]+) */\1/p
    b ids
  }
}'
show Setup:/Network/Global/IPv4
EOF
}

function get_srvc_id_by_name ()
{
  local srvc_ids=$(get_srvc_ids)

  for srvc_id in $srvc_ids
  do
    local srvc_name=$(get_srvc_name "$srvc_id")
    if [[ "$srvc_name" == "$1" ]]
    then
      echo $srvc_id
      return
    fi
  done
}

function get_dns_ips ()
{
  local srvc_id=$(get_srvc_id_by_name "$1")

  cat <<EOF | scutil | \
    sed -nEe '
/ServerAddresses/ {
  :ips
  n
  /[0-9]+ :/ {
    s/ *[0-9]+ : ([0-9.]+) */\1/p
    b ips
  }
}'
show $2:/Network/Service/$srvc_id/DNS
EOF
}

function set_dns_ips ()
{
  networksetup -setdnsservers "$@"
}

vpn_srvc_name='NAME OF VPN SERVICE'
ip_file='/tmp/setup_dns_ips'

pri_srvc_id=$(get_pri_srvc_id)
pri_srvc_name=$(get_srvc_name "$pri_srvc_id")

if [[ ! -e "$ip_file" ]]
then
  setup_dns_ips=$(get_dns_ips "$pri_srvc_name" "Setup")
  state_dns_ips=$(get_dns_ips "$pri_srvc_name" "State")
  vpn_ips=$(get_dns_ips "$vpn_srvc_name" "State")

  set_dns_ips "$pri_srvc_name" $vpn_ips $setup_dns_ips $state_dns_ips

  if [[ -z "$setup_dns_ips" ]]
  then
    setup_dns_ips="Empty"
  fi

  echo $setup_dns_ips >$ip_file
else
  setup_dns_ips=$(cat $ip_file)

  set_dns_ips "$pri_srvc_name" $setup_dns_ips

  rm $ip_file
fi

** редагувати **

Схоже, це все ще проблема в Леві. Я оновлюю заголовок і додаю тег.

** редагувати **

Мабуть, Лев також вніс деякі зміни в бездротовій мережі, включаючи перейменування служби AirPort на Wi-Fi. Це може спричинити проблеми зі сценарієм обходу, який я надав, якщо хтось підключається до своєї VPN через бездротове з'єднання. Лев (чомусь) тримає сервіс під назвою AirPort під кришкою. Щоб виправити це, вам потрібно перейменувати послугу Wi-Fi на щось, крім AirPort. Якщо ви хочете зберегти ім'я Wi-Fi, спочатку потрібно перейменувати його на щось інше, а потім перейменувати його на Wi-Fi.


Якщо ви заглянете в "Системні налаштування" і натисніть на мережі, під VPN-з'єднанням зліва виберіть розширений (нижній правий сервер). Тепер ви повинні побачити вкладку DNS вгорі. Зліва - IP-адреси для DNS, а справа - ваш домен. Чи правильно це (вказує на сервер VPN DNS)?
Еверетт

Так, вони вірні.
цитрусові

Рядок у set_dns_ips повинен бути networksetup -setdnsservers "$@". Мій Mac Pro має два підключення до Ethernet ("Ethernet 1" та "Ethernet 2" - це імена за замовчуванням), і тому їх треба цитувати. EDIT: навіщо це робити
Chris R. Donnelly

Ти маєш рацію, @chris. Я оновив сценарій. Не впевнений, що ви маєте на увазі під «навіщо це робити».
цитрусові

Вибачте, @citrusmoose. Просто намагався сказати, чому я редагував коментар; Я натиснув на подання, тоді зрозумів, що не сказав, чому це потрібно змінити, і не хотів відмовлятися, як просто виступав за зміни без поважних причин.
Кріс Р. Доннеллі

Відповіді:


1

У моєму випадку запити FQDN не вирішили правильну внутрішню адресу. Натомість вони вказували на зовнішню адресу.

Я підключаюся до свого Cisco ASA через IPsec. Хоча замовлення налаштовано правильно при підключенні до мережі, запити DNS не дотримуються порядку після оновлення до 10.6.5.

Щоб обійти це, я вручну призначив DNS-сервер для моєї VPN в підключення до аеропорту (оскільки я бездротовий). Після завершення з'єднання VPN я видаляю DNS-адресу вручну.


Так, це теж моє вирішення (але дуже дратує). Я радий, що у когось іншого є ця проблема, оскільки, здається, я був єдиним. Я думаю, що інші можуть не помітити, оскільки більшість пошукових запитів для внутрішніх доменів вийдуть з ладу і повернуться до правильних серверів DNS. У моєму випадку, однак, існує кілька внутрішніх доменів, які (чомусь) мають записи на зовнішніх серверах DNS.
цитрусові

Має бути кращий підхід, ніж цей, @Citrusmoose, чи пощастило вам з чимось менш ручним і більш надійним?
Могутне

Ні, я ще нічого не натрапив.
цитрусові

1

Щоб зупинити OS X 10.8 від створення маршруту за замовчуванням до VPN-з'єднання, відкрийте Internet Connect (у програмах). Виберіть "Параметри" у меню "Підключення" та зніміть прапорець "Надіслати весь трафік через VPN-з'єднання". Натисніть кнопку ОК, і ви закінчите.

Щоб зробити власний маршрут до підмережі з іншого боку підключення VPN, прочитайте решту підказки ...

Як корінь, створіть / etc / ppp / ip-up та введіть такий код:

#!/bin/sh
# When the ppp link comes up, this script is called with the following
# parameters
#       $1      the interface name used by pppd (e.g. ppp3)
#       $2      the tty device name
#       $3      the tty device speed
#       $4      the local IP address for the interface
#       $5      the remote IP address
#       $6      the parameter specified by the 'ipparam' option to pppd

DEBUGFILE=/tmp/ip-up-debug.txt
## echo "1:$1 2:$2 3:$3 4:$4 5:$5 6:$6" > $DEBUGFILE
NET=`echo $5 | cut -d. -f1,2,3`
## echo $NET >> $DEBUGFILE

case $NET in 192.168.3)
     ## echo "CASE1" >> $DEBUGFILE
     RESULT=`/sbin/route add -net 192.168.30.0 $5 255.255.255.0`
     ##echo $RESULT >> $DEBUGFILE
     ;;
     192.168.2)
     ## echo "CASE2" >> $DEBUGFILE
     RESULT=`/sbin/route add -net 192.168.20.0 netmask 255.255.255.0 gw $5`
     ## echo $RESULT >> $DEBUGFILE
     ;;
     192.168.1)
     ## echo "CASE3" >> $DEBUGFILE
     RESULT=`/sbin/route add -net 192.168.10.0 netmask 255.255.255.0 gw $5`
     ## echo $RESULT >> $DEBUGFILE
     ;;
     *)
     ## echo "No match" >> $DEBUGFILE
     ;;
esac

Примітки:

  1. Після створення файлу, зробити chmod u+x /etc/ppp/ip-up.
  2. Змінна $ 5 - це ваша віддалена IP-адреса (ваша IP-адреса у віддаленій мережі).
  3. У першій заяві випадку змініть запис 192.168.x на перші три октети віддаленої мережі. У цьому випадку віддалений IP - 192.168.3.1, а віддалена мережа - 192.168.30.0/24 (віддалене вікно VPN здійснює маршрутизацію - це так, SAMBA буде працювати без необхідності проксі ARP).
  4. Відлучіть (видаліть ## s) з рядків налагодження, щоб побачити, що робить цей скрипт. Вихід буде записаний у файл /tmp/ip-up-debug.txt. Не забудьте повернути ## назад, коли закінчите тестування.
  5. Цей скрипт має варіанти для трьох різних VPN-з'єднань. Просто змініть записи 192.168.x на різні мережеві адреси різних VPN.

Знайдено тут

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