Проблема DNS при VPN подключении (MacOS 10.6.x). Решение!

Только я расслабился, что Mac OS работает как часики и на тебе! Наступил на такую граблю, что не вышепчешь. А называется она вот как — при VPN подключении DNS сервера такого подключения недоступны. То есть распознать локальные домены никак!

Нет, есть конечно костыли в виде — пропишите имена и IP адреса локальных доменов в hosts, или поставьте VPN подключение выше текущего подключения в списке. Но костыли они и есть костыли. В первом случае — не дай бог, что-то изменится, а вы ни сном ни духом. А во втором у вас благополучно отваливается весь ваш канал связи и все пойдет напрямую через VPN, включая и запросы в сеть интернет.

Я думал это я идиот и не могу настроить. Ан нет! После двух часов гугления выяснилось, что проблема стара как мир, все о ней отлично знают, что начиная с 10.6, система начала благополучно плевать на resolv.conf и брать свои настройки с другого места, которые формируются автоматически системой.

Но мы то не лыком шиты?

Возможность самому исправить свою проблему нам оставили! И это хорошо. Поэтому лезем в директорию /etc/ppp — что там? Скорее всего пусто. Не беда, сейчас мы захламим это пространство скриптами, написаным человеком, который в bash пишет второй раз в жизни.

Скрипт ip-up

#!/bin/sh

OUTVAR1=""
TMPIP=""
TMPIP_NEXT="yes"

IPS=$(/usr/sbin/scutil --dns | grep nameserver | awk '{print $3}')

for IP in $IPS
do
  if test -n "${DNS1}"; then
     if test $DNS1 = $IP; then
        continue;
     fi;
  fi
  if test -n "${DNS2}"; then
     if test $DNS2 = $IP; then
        continue;
     fi;
  fi

  if test -n "${TMPIP_NEXT}"; then
      TMPIP=$IP;
      TMPIP_NEXT="";
      continue;
  fi

  if test -n "${TMPIP}"; then
    if test -n "${OUTVAR1}"; then
       OUTVAR1=${OUTVAR1}" "${TMPIP};
    else
      OUTVAR1=${TMPIP};
    fi
  fi
  TMPIP=$IP
done

if test -n "${DNS2}"; then
  OUTVAR1=${DNS2}" "${OUTVAR1};
fi
if test -n "${DNS1}"; then
  OUTVAR1=${DNS1}" "${OUTVAR1};
fi

if test -n "${TMPIP}"; then
    if test -n "${OUTVAR1}"; then
         if test -n "${DNS1}"; then
                OUTVAR1=${OUTVAR1}" "${TMPIP};
         else
             OUTVAR1=${TMPIP}" "${OUTVAR1};
         fi;
    else
      OUTVAR1=${TMPIP};
    fi;
fi

DNSREF=""
SERVICES=$(echo "list State:/Network/Service/[^/]+/DNS" | /usr/sbin/scutil | grep subKey | awk '{print $4}')
for IFX in $SERVICES
do
DNSREF="d.init\nget "$IFX"\nd.add ServerAddresses * "$OUTVAR1"\nset "$IFX"\n"
echo "${DNSREF}" | /usr/sbin/scutil
break
done

Данный скрипт вызывается сразу после подключения. Самое смешное то, что система УЖЕ знает новые DNS для этого подключения, но она их просто игнорирует. Мы же ее обманем и подсунем ей новые DNS в текущее активное подключение как первичные DNS, сдвинув старые на позицию ниже.

Скрипт ip-down

#!/bin/sh
OUTVAR1=""

IPS=$(/usr/sbin/scutil --dns | grep nameserver | awk '{print $3}')
for IP in $IPS
do
  if test -n "${DNS1}"; then
     if test $DNS1 = $IP; then
        continue;
     fi;
  fi
  if test -n "${DNS2}"; then
     if test $DNS2 = $IP; then
        continue;
     fi;
  fi

  if test -n "${IP}"; then
    if test -n "${OUTVAR1}"; then
       OUTVAR1=${OUTVAR1}" "${IP};
    else
      OUTVAR1=${IP};
    fi
  fi
done

DNSREF=""
SERVICES=$(echo "list State:/Network/Service/[^/]+/DNS" | /usr/sbin/scutil | grep subKey | awk '{print $4}')
for IFX in $SERVICES
do
DNSREF="d.init\nget "$IFX"\nd.add ServerAddresses * "$OUTVAR1"\nset "$IFX"\n"
echo "${DNSREF}" | /usr/sbin/scutil
break
done

Как вы уже догадались — это скрипт, который отвечает за удаление последствий того, что мы нагородили в ip-up. Да-да-да, мы просто вычистим из списка DNS те сервера, которые отвалились.

Сразу оговорюсь — я этот жуткий язык во второй раз вижу. Мне главное — чтобы работало, а оно вроде как исправно работает.

Ну и думаю, что вам понятно, что скрипты должны быть размещены под правами админа. Комманду sudo, chown, chmod никто не отменял.

P.S. В Mac OS 10.7.x такой проблемы уже нет — исправили, слава богу. Но кто им мешал выпустить патчик для леопарда?! Но пока для льва не выпустят работоспособный билд, я буду сидеть на 10.6 — все же и Spaces на голову выше чем новый MissionControl, и батарейка держит лучше, да и система поотзывчивее, хотя меньше красивых наворотов. Эх… и тут пришлось с напильником работать!

2 comments to Проблема DNS при VPN подключении (MacOS 10.6.x). Решение!

  • Александр

    Добрый вечер!
    Помогите, пожалуйста, настроить VPN. Все сделал согласно следующей инструкции, но тщетно
    http://help.netbynet…eta/mac-os-vpn/
    Самое интересно что сервер к которому подключаюсь пингует мой IP, а я IP сервера нет.
    Mac os Lion 10.7.2 (MAcbook Pro MC700)
    Заранее благодарю.

Добавить комментарий

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>