У меня есть последняя чистая 64-разрядная версия Ubuntu 14.04.1 с официального сайта, установленная в Virtualbox. Я подключаюсь к сети VPN с помощью vpnc, который устанавливает 2 DNS-сервера с использованием DHCP:
user@virtual:~$ cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 10.88.94.1
nameserver 8.8.8.8
nameserver 10.40.0.1
куда 10.88.94.1
и 8.8.8.8
возвращаются vpn dhcp и 10.40.0.1
возвращается lan dhcp. Первый DNS-сервер, возвращаемый vpn dhcp, настроен как авторитетный нерекурсивный сервер имен для некоторых внутренних имен.
Проблема в том, что Ubuntu каким-то образом игнорирует авторитетный флаг и отклоняет действительный ответ, поскольку он нерекурсивен:
user@virtual:~$ nslookup
> video.something.com
;; Got recursion not available from 10.88.94.1, trying next server
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: video.something.com
Address: 180.112.94.1
Поскольку tcpdump ясно показывает, что ответ от первого DNS-сервера имеет установленный флаг «авторитетный», но каким-то образом он игнорируется ('*' во втором ответе означает «авторитетный», '-' означает «нерекурсивный»):
13:23:44.505098 IP 10.40.130.209.44159 > 10.88.94.1.domain: 63790+ A? video.something.com. (32)
13:23:44.506285 IP 10.88.94.1.domain > 10.40.130.209.44159: 63790*- 1/0/0 A 10.88.94.12 (48)
13:23:44.506390 IP 10.40.130.209.45437 > 8.8.8.8.domain: 63790+ A? video.something.com. (32)
13:23:44.608414 IP 8.8.8.8.domain > 10.40.130.209.45437: 63790 1/0/0 A 180.112.94.1 (48)
Такая же настройка работает должным образом (используется первый результат DNS) как в Windows, так и в OSX. Но не в Ubuntu. Могу ли я это исправить в Ubuntu, чтобы авторитетные ответы обрабатывались правильно, независимо от «нерекурсивного» флага, или он полностью сломан и где я ничего не могу сделать?
Тип запасного поведения, которого вы, кажется, ожидаете, не является частью того, как должен работать DNS. Ко второму серверу имен в resolv.conf следует обращаться только в том случае, если первый не отвечает или возникает какая-то сетевая ошибка другого типа.
Microsoft явно сделала свое дело, и это, безусловно, полезно для того, что вы пытаетесь сделать, но на него не следует полагаться при настройке VPN. У Microsoft также есть идея использования разного разрешения имен для разных сетевых интерфейсов.
Если вы не можете повлиять на конфигурацию VPN, лучше всего в Linux может быть настройка собственного сервера имен, который решает, куда перенаправлять запросы по домену.
Чтобы рекурсия DNS работала на сервере bind9 Ubuntu, убедитесь, что следующие строки находятся в /etc/bind/ named.conf.options на DNS-сервере:
recursion yes;
allow-recursion { any; };
При этом вы утверждаете, что у вас нет доступа к DNS-серверам. В таком случае рассматривали ли вы возможность изменения порядка ваших DNS-серверов? Например, если вы возьмете последнюю запись DNS ...
nameserver 10.40.0.1
и поместите его в файл /etc/resolvconf/resolv.conf.d/head, затем запустите resolvconf -u
, запись будет автоматически добавлена в начало файла /etc/resolv.conf. Это делает 10.40.0.1 первым DNS-сервером, который будет использоваться, а затем он проверяет записи VPN после этого (при условии, что 10.40.0.1 допускает рекурсию DNS).