OS X> 10.6.5 Pesanan Pencarian DNS dengan VPN

13

Setelah memperbarui ke OS X 10.6.5 (dari .4), aplikasi tampaknya tidak mencari nama host dalam urutan yang benar (sesuai dengan urutan layanan di Preferensi Jaringan) ketika VPN saya terhubung.

Pengaturan saya saat ini adalah layanan Cisco IPSec VPN di depan layanan AirPort. Server DNS secara otomatis diatur untuk koneksi VPN (yang OK), dan DNS layanan AirPort menunjuk ke router saya (192.168.1.1, yang diarahkan ke server OpenDNS).

Ketika VPN saya terhubung, saya ingin agar pencarian DNS melalui server DNS VPN terlebih dahulu, tetapi semua aplikasi saya (Firefox, Thunderbird, ssh) tampaknya menggunakan server DNS AirPort saya terlebih dahulu (OpenDNS).

Ini berfungsi dengan baik sebelum pembaruan.

Terima kasih atas bantuannya.

** sunting **

Saya menemukan posting ini , dan menjalankan perintah dalam jawaban yang diterima. Tapi sepertinya itu tidak membantu.

Setelah mencari sedikit lebih banyak, saya menemukan perintah ini: scutil --dns

Output dari perintah di bawah ini. Semuanya terlihat benar, kecuali saya pikir resolver # 2 harus didahulukan, dan ada domain pencarian di resolver # 1 (itu jelas bukan foobar.com, tetapi domain VPN yang sebenarnya). Saya pikir ini adalah kebohongan bug (atau apa pun itu). Saya tidak menentukannya secara manual, dan itu tidak ada di tab DNS untuk koneksi AirPort saya. Ketika VPN terputus, domain pencarian itu tidak ada di sana, dan resolver # 2 hilang, sebagaimana mestinya.

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

** sunting **

Baiklah, sampai seseorang dapat menjawab pertanyaan saya, saya telah menulis sebuah skrip untuk membantu menyelesaikannya di bawah ini. Itu harus dijalankan setelah Anda menghubungkan VPN Anda, dan jalankan lagi setelah Anda terputus (saya belum menemukan cara untuk menjalankannya secara otomatis). Beberapa catatan:

  1. Akun saya dijalankan sebagai Admin dengan Preferensi Jaringan tidak dikunci, jadi saya tidak yakin bagaimana skrip ini adil dalam hal apa pun kecuali.

  2. Anda perlu mengatur vpn_srvc_name dalam skrip ke nama layanan Anda, Anda dapat menebaknya, vpn.

  3. Saya yakin mungkin ada cara yang lebih mudah untuk melakukan ini, jadi jangan ragu untuk mengirim komentar Anda.

Naskah:

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

** sunting **

Sepertinya ini masih menjadi masalah di Lion juga. Saya memperbarui judul dan menambahkan tag.

** sunting **

Rupanya Lion juga membawa beberapa perubahan nirkabel, termasuk mengganti nama layanan AirPort ke Wi-Fi. Ini dapat menyebabkan masalah dengan skrip penyelesaian yang saya berikan jika ada yang terhubung ke VPN mereka melalui koneksi nirkabel. Lion (karena alasan tertentu) menyimpan layanan bernama AirPort di bawah tenda. Untuk memperbaikinya, Anda perlu mengubah nama layanan Wi-Fi Anda menjadi sesuatu selain AirPort. Jika Anda ingin menyimpan nama Wi-Fi, Anda harus mengganti namanya menjadi sesuatu yang berbeda terlebih dahulu, kemudian ganti namanya kembali ke Wi-Fi.

citrusmoose
sumber
Ketika Anda melihat System Preferences dan mengklik jaringan, di bawah koneksi VPN di sebelah kiri pilih lanjutan (corener kanan bawah). Sekarang Anda akan melihat tab DNS di bagian atas. Di sebelah kiri adalah IP untuk DNS, dan kanan menunjukkan domain Anda. Apakah ini benar (menunjuk ke server DNS VPN)?
Everett
Ya, mereka benar.
citrusmoose
Baris di set_dns_ips seharusnya networksetup -setdnsservers "$@". Mac Pro saya memiliki dua koneksi Ethernet ("Ethernet 1" dan "Ethernet 2" adalah nama standarnya) sehingga harus dikutip. EDIT: mengapa melakukan ini
Chris R. Donnelly
Kamu benar, @chris. Saya telah memperbarui skrip. Tidak yakin apa yang Anda maksud dengan "mengapa melakukan ini".
citrusmoose
Maaf, @rusrusmoose. Hanya berusaha mengatakan mengapa saya mengedit komentar; Saya tekan ajukan kemudian menyadari bahwa saya tidak mengatakan mengapa harus mengubahnya dan tidak ingin dianggap hanya menganjurkan perubahan tanpa alasan yang baik.
Chris R. Donnelly

Jawaban:

1

Dalam kasus saya, permintaan FQDN tidak menyelesaikan ke alamat internal yang benar. Sebaliknya, mereka menunjuk ke alamat eksternal.

Saya terhubung ke ASA Cisco saya melalui IPsec. Sementara pesanan diatur dengan benar dalam koneksi jaringan, permintaan DNS tidak mengikuti pesanan sejak memperbarui ke 10.6.5.

Untuk mengatasinya, saya secara manual menetapkan server DNS untuk VPN saya ke koneksi Bandara (karena saya nirkabel). Setelah saya selesai dengan koneksi VPN, saya menghapus alamat DNS yang ditambahkan secara manual.

KevinTM
sumber
Ya, ini solusi saya juga (tapi sangat menjengkelkan). Saya senang ada orang lain yang mengalami masalah ini, karena sepertinya saya adalah satu-satunya. Saya kira orang lain mungkin tidak memperhatikan karena sebagian besar pencarian untuk domain internal akan gagal dan kembali ke server DNS yang benar. Namun dalam kasus saya, ada beberapa domain internal yang (karena alasan tertentu) memiliki entri di server DNS eksternal.
citrusmoose
Harus ada pendekatan yang lebih baik dari ini, @Citrusmoose, apakah Anda beruntung dengan sesuatu yang kurang manual dan lebih kuat?
MightyE
Tidak, saya belum menemukan apa pun.
citrusmoose
1

Untuk menghentikan OS X 10.8 dari membuat rute default ke koneksi VPN Anda, buka Internet Connect (dalam Aplikasi). Pilih Opsi dari menu Sambungkan, lalu hapus centang opsi "Kirim semua lalu lintas melalui koneksi VPN". Klik OK, dan Anda selesai.

Untuk membuat rute khusus ke subnet di sisi lain koneksi VPN, baca petunjuk lainnya ...

Sebagai root, buat / etc / ppp / ip-up, dan masukkan kode berikut:

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

Catatan:

  1. Setelah Anda membuat file, lakukan a chmod u+x /etc/ppp/ip-up.
  2. Variabel $ 5 adalah alamat IP jarak jauh Anda (alamat IP Anda di jaringan jarak jauh).
  3. Dalam pernyataan kasus pertama, ubah entri 192.168.x ke tiga oktet pertama dari jaringan jarak jauh Anda. Dalam hal ini, IP jarak jauh adalah 192.168.3.1, dan jaringan jarak jauh adalah 192.168.30.0/24 (kotak VPN jarak jauh sedang melakukan perutean - ini agar SAMBA akan bekerja tanpa perlu proxy ARP).
  4. Batalkan komentar (hapus tanda ##) dari baris debug untuk melihat apa yang dilakukan skrip ini. Output akan ditulis ke file /tmp/ip-up-debug.txt. Ingatlah untuk mengembalikan ## kembali saat Anda selesai menguji.
  5. Skrip ini memiliki opsi untuk tiga koneksi VPN yang berbeda. Ubah saja entri 192.168.x ke berbagai alamat jaringan VPN yang berbeda.

Ditemukan di sini

Antonio
sumber