无法通过 Mac OS X 的 VPN 连接解析主机

无法通过 Mac OS X 的 VPN 连接解析主机

序言

我从我的 Macbook 建立了 VPN 连接,似乎连接成功。

工作VPN

但是,我无法访问我的工作计算机,因为主机名无法解析:

$ ping myusername
ping: cannot resolve myusername: Unknown host

新的解决方法

在尝试了所有我能尝试的方法后,我发现这个命令可以让我同时使用 VPN 网络和互联网:

sudo route add -net 192.168.7.218 192.168.7.117 255.255.0.0

公司的 DNS 服务器可以通过其 IP 访问。如何配置网络将它们用于从 192.168 开始的所有内容吗?

旧的解决方法

我找到了一个临时的解决方法,通过修改两个选项,我可以经由 VPN 访问网络:

我打勾了通过 VPN 连接发送所有流量

VPN 选项

我在VPN界面的DNS设置中手动输入搜索域名:

在VPN选项中输入域名

执行这两个步骤就足以让我的工作计算机可以 ping 通:

$ nslookup myusername
Server:     192.168.10.16
Address:    192.168.10.16#53

Name:   myusername.universe.mycompany
Address: 192.168.11.56

$ ping myusername
PING myusername.universe.mycompany (192.168.11.56): 56 data bytes
64 bytes from 192.168.11.56: icmp_seq=0 ttl=126 time=126.164 ms

但是,由于我将所有流量都通过 VPN 进行传输,因此我无法再访问互联网:

$ ping google.com
PING google.com (74.125.232.48): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1

问题

如何正确设置网络,以便它知道何时通过 VPN,何时使用正常连接?我需要它正确解析 Windows 服务器名称。

如果我需要发布任何控制台命令输出,我愿意这样做,只要您告诉我具体是哪个。
任何帮助都非常感谢,因为这对我来说现在是一种阻碍。

谢谢!

答案1

你可能想看看解析器手册页

引用一个解决方案:

特定客户端的配置可以从具有本手册页中所述格式的文件中读取。系统目前将这些配置放在 /etc/resolv.conf 文件和 /etc/resolver 目录中的文件中。但是,客户端配置不仅限于文件存储。DNS 多客户端搜索策略的实施还可以将客户端配置放在其他数据源中,例如系统配置数据库。DNS 系统的用户不应该对配置数据的来源做出任何假设。

据我所知,如果您想要特殊的名称服务器,您需要将一个名为的文件放入example.com/etc/resolver域的名称服务器的 IP 中example.com-- 可能是他们使用resolv.conf语法,我不记得了。但你应该能够弄清楚 :)

编辑:就自动化流程而言,我确信使用 AppleScript 或 Automator 可以实现。但我从未考虑过这个问题,所以关于这个话题的第二个问题可能会有所帮助。

答案2

OSX 似乎存在网络掩码设置错误的问题。这是我在 Snow Leopard 和 Mountain Lion 中使用 PPTP VPN 的经验,此帖子对此提供了支持这里

我找到了解决方案这里,其中涉及设置 ppp0 流量的路由规则。

基本上:

$ sudo <your_text_editor_of_choice> /etc/ppp/ip-up

    #!/bin/sh
    /sbin/route add -net 192.168 -interface ppp0

$ sudo chmod 755 /etc/ppp/ip-up

这将在您每次连接到 VPN 时设置路由规则。

答案3

Mac OSX DNS 解析很奇怪。下面是快速修复方法。

  1. 将以下代码放入文件名中reset_dns

    #!/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='MY VPN'
    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")
      setup_vpn_ips=$(get_dns_ips "$vpn_srvc_name" "Setup")
      state_vpn_ips=$(get_dns_ips "$vpn_srvc_name" "State")
    
      echo "set_dns_ips $pri_srvc_name $setup_vpn_ips $state_vpn_ips $setup_dns_ips $state_dns_ips"
      set_dns_ips "$pri_srvc_name" $setup_vpn_ips $state_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)
    
      echo "set_dns_ips $pri_srvc_name $setup_dns_ips"
      set_dns_ips "$pri_srvc_name" $setup_dns_ips
    
      rm $ip_file
    fi
    
  2. 将“MY VPN”一词替换为您的 VPN 连接的名称。

  3. 连接到 VPN 后,reset_dns从终端窗口运行

Mac OSX 仅使用与您的“主”网络连接关联的 DNS 服务器。上述代码将您的 VPN 连接的 DNS 服务器添加到主网络连接(即通常是 Wi-Fi 或以太网),以便首先使用您的 VPN DNS 服务器,然后才是您的主连接 DNS 服务器。

断开 VPN 连接后再次运行该reset_dns命令以删除条目并恢复原始 DNS 服务器配置。不过,这是可选的,因为保持 DNS 服务器关联通常不会造成任何损害。

答案4

我也遇到了同样的问题。原来我的家用路由器与我的工作系统处于同一 IP 范围内。一旦我将家用路由器更改为不同的范围,我就能连接了。

相关内容