OS X> 10.6.5 Kolejność wyszukiwania DNS z VPN

13

Po aktualizacji do OS X 10.6.5 (od .4) aplikacje nie wydają się wyszukiwać nazw hostów we właściwej kolejności (zgodnie z zamówieniem usługi w Preferencjach sieciowych), gdy moja sieć VPN jest podłączona.

Moja obecna konfiguracja to usługa Cisco IPSec VPN przed usługą AirPort. Serwery DNS są automatycznie konfigurowane do połączenia VPN (co jest OK), a DNS usługi AirPort wskazuje mój router (192.168.1.1, który wskazuje serwery OpenDNS).

Kiedy moja sieć VPN jest połączona, chciałbym, aby wyszukiwania DNS najpierw przechodziły przez serwery VPN VPN, ale wydaje się, że wszystkie moje aplikacje (Firefox, Thunderbird, ssh) najpierw korzystają z mojego serwera AirPort DNS (OpenDNS).

To działało dobrze przed aktualizacją.

Dziękuję za wszelką pomoc.

** edycja **

Natrafiłem na ten post i uruchomiłem polecenia w przyjętej odpowiedzi. To jednak nie pomogło.

Po dokładniejszych poszukiwaniach natrafiłem na to polecenie: scutil --dns

Dane wyjściowe polecenia znajdują się poniżej. Wszystko wygląda poprawnie, chyba że myślę, że resolver # 2 powinien być na pierwszym miejscu, i jest domena wyszukiwania w resolver # 1 (oczywiście nie jest to foobar.com, ale prawdziwa domena VPN). Myślę, że to były błędy (lub cokolwiek to jest) kłamstwa. Nie podałem go ręcznie i nie ma go na karcie DNS mojego połączenia AirPort. Po rozłączeniu VPN ta domena wyszukiwania nie istnieje, a resolvera nr 2 zniknął, tak jak powinien.

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

** edycja **

Cóż, dopóki ktoś nie będzie w stanie odpowiedzieć na moje pytanie, napisałem skrypt, który pomoże w rozwiązaniu problemu wymienionym poniżej. Powinien zostać uruchomiony po podłączeniu VPN i uruchomiony ponownie po rozłączeniu (nie znalazłem sposobu, aby uruchomić go automatycznie). Kilka uwag:

  1. Moje konto jest uruchomione jako administrator z odblokowanymi Preferencjami sieci, więc nie jestem pewien, jak ten skrypt działałby uczciwie na niczym innym.

  2. Musisz ustawić w skrypcie nazwę vpn_srvc_name, tak jak się domyślałeś, nazwę usługi VPN.

  3. Jestem pewien, że jest to prawdopodobnie łatwiejszy sposób, więc opublikuj swoje uwagi.

Scenariusz:

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

** edycja **

Wygląda na to, że wciąż jest to problem w Lionie. Aktualizuję tytuł i dodaję tag.

** edycja **

Najwyraźniej Lion wprowadził także kilka zmian w łączności bezprzewodowej, w tym zmianę nazwy usługi AirPort na Wi-Fi. Może to powodować problemy ze skryptem obejścia, który podałem, jeśli łączy się on z VPN przez połączenie bezprzewodowe. Lion (z jakiegoś powodu) utrzymuje usługę o nazwie AirPort pod maską. Aby to naprawić, musisz zmienić nazwę usługi Wi-Fi na inną niż AirPort. Jeśli chcesz zachować nazwę Wi-Fi, musisz najpierw zmienić jej nazwę na inną, a następnie zmienić nazwę z powrotem na Wi-Fi.

cytrusowy
źródło
Kiedy spojrzysz w Preferencjach systemowych i klikniesz sieci, w obszarze Połączenie VPN po lewej stronie wybierz zaawansowane (główny prawy dolny róg). Powinieneś teraz zobaczyć kartę DNS u góry. Po lewej stronie są adresy IP DNS, a po prawej pokazuje twoja domena. Czy są poprawne (wskazując na serwer DNS VPN)?
Everett,
Tak, są poprawne.
citrusmoose
Linia w set_dns_ips powinna być networksetup -setdnsservers "$@". Mój Mac Pro ma dwa połączenia Ethernet („Ethernet 1” i „Ethernet 2” to nazwy domyślne), dlatego należy je zacytować. EDYCJA: po co to robić
Chris R. Donnelly
Masz rację, @chris. Zaktualizowałem skrypt. Nie jestem pewien, co rozumiesz przez „dlaczego to robić”.
citrusmoose
Przepraszamy, @citrusmoose. Chciałem tylko powiedzieć, dlaczego zredagowałem komentarz; Nacisnąłem poddaj się, a potem zdałem sobie sprawę, że nie powiedziałem, dlaczego to zmienić, i nie chciałem odejść, ponieważ popierałem zmianę bez uzasadnionego powodu.
Chris R. Donnelly,

Odpowiedzi:

1

W moim przypadku żądania FQDN nie były przetwarzane na poprawny adres wewnętrzny. Zamiast tego wskazywali na adres zewnętrzny.

Łączę się z moim Cisco ASA przez IPsec. Chociaż kolejność jest poprawnie skonfigurowana w połączeniu sieciowym, żądania DNS nie są zgodne z kolejnością od czasu aktualizacji do 10.6.5.

Aby obejść ten problem, ręcznie przypisałem serwer DNS mojej sieci VPN do połączenia z lotniskiem (ponieważ jestem bezprzewodowy). Po zakończeniu połączenia VPN usuwam ręcznie dodany adres DNS.

KevinTM
źródło
Tak, to też jest moje obejście (ale bardzo denerwujące). Cieszę się, że ktoś inny ma ten problem, ponieważ wydaje się, że byłem jedynym. Przypuszczam, że inni mogą tego nie zauważyć, ponieważ większość wyszukiwań domen wewnętrznych zakończy się niepowodzeniem i wróci do prawidłowych serwerów DNS. W moim przypadku istnieje jednak kilka domen wewnętrznych, które (z jakiegoś powodu) mają wpisy na zewnętrznych serwerach DNS.
citrusmoose
Musi być lepsze podejście niż to, @Citrusmoose, czy miałeś szczęście z czymś mniej ręcznym i bardziej niezawodnym?
MightyE,
Nie, jeszcze niczego nie spotkałem.
cytrusowy łoś
1

Aby uniemożliwić systemowi OS X 10.8 tworzenie domyślnej trasy do połączenia VPN, otwórz połączenie internetowe (w aplikacjach). Wybierz polecenie Opcje z menu Połącz, a następnie odznacz opcję „Wyślij cały ruch przez połączenie VPN”. Kliknij OK i gotowe.

Aby utworzyć niestandardową trasę do podsieci po drugiej stronie połączenia VPN, przeczytaj resztę podpowiedzi ...

Jako root utwórz / etc / ppp / ip-up i wstaw następujący kod:

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

Uwagi:

  1. Po utworzeniu pliku wykonaj chmod u+x /etc/ppp/ip-up.
  2. Zmienna 5 USD to Twój zdalny adres IP (Twój adres IP w sieci zdalnej).
  3. W instrukcji pierwszego przypadku zmień pozycję 192.168.x na pierwsze trzy oktety sieci zdalnej. W tym przypadku zdalny adres IP to 192.168.3.1, a zdalna sieć to 192.168.30.0/24 (zdalne urządzenie VPN wykonuje routing - dzięki temu SAMBA będzie działać bez konieczności proxy ARP).
  4. Odkomentuj (usuń ##) z linii debugowania, aby zobaczyć, co robi ten skrypt. Dane wyjściowe zostaną zapisane w pliku /tmp/ip-up-debug.txt. Pamiętaj, aby odłożyć ## po zakończeniu testowania.
  5. Ten skrypt ma opcje dla trzech różnych połączeń VPN. Wystarczy zmienić wpisy 192.168.x na różne adresy sieciowe różnych sieci VPN.

Znaleziono tutaj

Antonio
źródło