Thứ tự tra cứu DNS X> 10.6.5 với VPN


13

Sau khi cập nhật lên OS X 10.6.5 (từ .4), các ứng dụng dường như không tìm kiếm tên máy chủ theo đúng thứ tự (theo thứ tự dịch vụ trong Tùy chọn mạng) khi VPN của tôi được kết nối.

Thiết lập hiện tại của tôi là dịch vụ VPN IPSec của Cisco trước dịch vụ AirPort. Các máy chủ DNS được tự động thiết lập cho kết nối VPN (không sao) và DNS dịch vụ AirPort đang trỏ đến bộ định tuyến của tôi (192.168.1.1, được trỏ đến các máy chủ OpenDNS).

Khi VPN của tôi được kết nối, trước tiên tôi muốn tìm kiếm DNS thông qua các máy chủ DNS VPN, nhưng tất cả các ứng dụng của tôi (Firefox, Thunderbird, ssh) trước tiên dường như sử dụng máy chủ DNS AirPort của tôi (OpenDNS).

Điều này đã làm việc tốt trước khi cập nhật.

Cảm ơn vì bất kì sự giúp đỡ.

** chỉnh sửa **

Tôi đã xem qua bài đăng này , và chạy các lệnh trong câu trả lời được chấp nhận. Nó dường như không giúp đỡ mặc dù.

Sau khi tìm kiếm thêm một chút, tôi bắt gặp lệnh này: scutil --dns

Đầu ra từ lệnh dưới đây. Mọi thứ đều có vẻ chính xác, ngoại trừ tôi nghĩ rằng trình phân giải số 2 nên được ưu tiên và có một miền tìm kiếm trong trình phân giải số 1 (rõ ràng không phải là foobar.com, mà là miền VPN thực). Tôi nghĩ rằng đây là lỗi (hoặc bất cứ điều gì) nằm. Tôi đã không chỉ định thủ công và nó không nằm trên tab DNS cho kết nối AirPort của tôi. Khi VPN bị ngắt kết nối, miền tìm kiếm đó sẽ không ở đó và trình phân giải # 2 sẽ biến mất.

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

** chỉnh sửa **

Chà, cho đến khi ai đó có thể trả lời câu hỏi của tôi, tôi đã viết một kịch bản để giúp giải quyết vấn đề được đề cập dưới đây. Nó nên được chạy sau khi bạn kết nối VPN và chạy lại sau khi bạn ngắt kết nối (Tôi chưa tìm được cách chạy tự động). Một vài lưu ý:

  1. Tài khoản của tôi được chạy dưới dạng Quản trị viên với Tùy chọn mạng được mở khóa, vì vậy tôi không chắc tập lệnh này sẽ công bằng như thế nào trên mọi thứ.

  2. Bạn cần đặt vpn_srvc_name trong tập lệnh thành của bạn, bạn đoán nó, tên dịch vụ vpn.

  3. Tôi chắc chắn có thể có một cách dễ dàng hơn để làm điều này, vì vậy hãy đăng nhận xét của bạn.

Kịch bản:

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

** chỉnh sửa **

Có vẻ như đây vẫn là một vấn đề trong Lion. Tôi đang cập nhật tiêu đề và thêm một thẻ.

** chỉnh sửa **

Rõ ràng Lion cũng mang đến một số thay đổi không dây, bao gồm đổi tên dịch vụ AirPort thành Wi-Fi. Điều này có thể gây ra sự cố với tập lệnh khắc phục mà tôi đã cung cấp nếu một kết nối với VPN của họ qua kết nối không dây. Lion (vì một số lý do) giữ dịch vụ có tên AirPort bên dưới mui xe. Để khắc phục, bạn cần đổi tên dịch vụ Wi-Fi của mình thành một cái gì đó ngoài AirPort. Nếu bạn muốn giữ tên Wi-Fi, trước tiên bạn phải đổi tên thành tên khác, sau đó đổi tên thành Wi-Fi.


Khi bạn nhìn vào Tùy chọn hệ thống và nhấp vào mạng, bên dưới kết nối VPN ở bên trái, chọn nâng cao (corener phía dưới bên phải). Bây giờ bạn sẽ thấy một tab DNS ở trên cùng. Bên trái là IP của DNS và bên phải hiển thị tên miền của bạn. Những điều này có đúng không (chỉ vào máy chủ DNS VPN)?
Everett

Vâng, họ đúng.
cam quýt

Dòng trong set_dns_ips phải là networksetup -setdnsservers "$@". Mac Pro của tôi có hai kết nối Ethernet ("Ethernet 1" và "Ethernet 2" là tên mặc định) và do đó chúng phải được trích dẫn. EDIT: tại sao phải làm điều này
Chris R. Donnelly

Bạn nói đúng, @chris. Tôi đã cập nhật kịch bản. Không chắc chắn ý của bạn là "tại sao phải làm điều này".
cam quýt

Xin lỗi, @citrusmoose. Chỉ cố gắng nói tại sao tôi chỉnh sửa bình luận; Tôi nhấn gửi sau đó nhận ra tôi đã không nói lý do tại sao phải thay đổi điều đó và không muốn từ chối vì chỉ ủng hộ thay đổi mà không có lý do chính đáng.
Chris R. Donnelly

Câu trả lời:


1

Trong trường hợp của tôi, các yêu cầu FQDN không giải quyết đúng địa chỉ nội bộ. Thay vào đó, họ đã chỉ vào địa chỉ bên ngoài.

Tôi kết nối với Cisco ASA của mình thông qua IPsec. Mặc dù thứ tự được thiết lập chính xác trong kết nối mạng, các yêu cầu DNS không tuân theo thứ tự kể từ khi cập nhật lên 10.6.5.

Để khắc phục sự cố, tôi đã gán thủ công máy chủ DNS cho VPN của mình vào kết nối Sân bay (vì tôi không dây). Sau khi hoàn thành kết nối VPN, tôi xóa địa chỉ DNS được thêm thủ công.


Vâng, đây là cách giải quyết của tôi quá (nhưng rất khó chịu). Tôi rất vui vì người khác gặp vấn đề này, vì dường như tôi là người duy nhất. Tôi cho rằng những người khác có thể không nhận thấy vì hầu hết các tra cứu cho các tên miền nội bộ sẽ thất bại và quay trở lại các máy chủ DNS chính xác. Tuy nhiên, trong trường hợp của tôi, có một số tên miền nội bộ (vì một số lý do) có các mục trong máy chủ DNS bên ngoài.
cam quýt

Có một cách tiếp cận tốt hơn thế này, @Citrusmoose, bạn có gặp may mắn với thứ gì đó ít thủ công và mạnh mẽ hơn không?
MightyE

Không, tôi chưa bắt gặp bất cứ điều gì.
cam quýt

1

Để ngăn OS X 10.8 tạo tuyến đường mặc định tới kết nối VPN của bạn, hãy mở Kết nối Internet (trong Ứng dụng). Chọn Tùy chọn từ menu Kết nối, sau đó bỏ chọn tùy chọn "Gửi tất cả lưu lượng truy cập qua kết nối VPN". Nhấp vào OK, và bạn đã hoàn tất.

Để tạo tuyến tùy chỉnh đến mạng con ở phía bên kia của kết nối VPN, hãy đọc phần còn lại của gợi ý ...

Là root, tạo / etc / ppp / ip-up và đặt mã sau đây:

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

Ghi chú:

  1. Một khi bạn tạo tập tin, làm một chmod u+x /etc/ppp/ip-up.
  2. Biến $ 5 là địa chỉ IP từ xa của bạn (địa chỉ IP của bạn trên mạng từ xa).
  3. Trong trường hợp đầu tiên, thay đổi mục 192.168.x thành ba octet đầu tiên của mạng từ xa của bạn. Trong trường hợp này, IP từ xa là 192.168.3.1 và mạng từ xa là 192.168.30.0/24 (hộp VPN từ xa đang thực hiện định tuyến - vì vậy SAMBA sẽ hoạt động mà không cần ARP proxy).
  4. Uncomment (xóa ## 's) khỏi các dòng gỡ lỗi để xem kịch bản này đang làm gì. Đầu ra sẽ được ghi vào tệp /tmp/ip-up-debug.txt. Hãy nhớ đặt lại ## khi bạn hoàn tất kiểm tra.
  5. Kịch bản này có các tùy chọn cho ba kết nối VPN khác nhau. Chỉ cần thay đổi các mục 192.168.x thành các địa chỉ mạng khác nhau của các VPN khác nhau của bạn.

Tìm thấy ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.