Я пытаюсь настроить более-менее бесшовный Site-to-site VPN. Оба сайта находятся на одном контроллере и используют USG с последней прошивкой (4.4.28.5118795).
Сети:
{
"tsl": "192.168.2.0/24",
"100s": "192.168.3.0/24"
}
Автоматическая настройка Site-to-site VPN работает отлично, и все клиенты на каждом сайте могут общаться с любым клиентом на любом из сайтов, если известен IP.
Следующий шаг — решить проблему с разрешением DNS. Поиск адресов устройств на локальном сайте работает без проблем. Но, естественно, запрос IP-адресов с удалённого сайта не «просто так» срабатывает.
В попытках это исправить я нашёл много гайдов по настройке. Основной, которым я пользовался, вот этот, но такую же информацию видел и в других обсуждениях.
Похоже, главный трюк — добавить в конфигурацию dnsmasq опцию «server» вида «server=/100s/192.168.3.1» для конфигурации tsl и «server=/tsl/192.168.2.1» для 100s. Это можно сделать тремя способами (как перечислил Kelle Lilja):
- Добавить опцию в файл, который dnsmasq считывает при старте
- Использовать команды unifi cli для добавления опции (что просто создаёт новый /etc/dnsmasq.conf)
- Использовать JSON-файл на контроллере, чтобы задать дополнительные опции (устойчивый вариант пункта 2)
Не вдаваясь в детали, я перепробовал все три способа и могу подтвердить, что конфигурации действительно загружаются dnsmasq. Например, через SSH на USG можно наблюдать в `/var/log/dnsmasq.log`, что при запуске dnsmasq он корректно подгружает мою конфигурацию:
Sep 19 14:51:21 dnsmasq[3909]: started, version 2.78-23-g9e09429 cachesize 10000
Sep 19 14:51:21 dnsmasq[3909]: compile time options: IPv6 GNU-getopt DBus i18n IDN DHCP DHCPv6 no-Lua TFTP conntrack ipset auth DNSSEC loop-detect inotify
Sep 19 14:51:21 dnsmasq-dhcp[3909]: DHCP, IP range 192.168.3.6 -- 192.168.3.254, lease time 1d
Sep 19 14:51:21 dnsmasq[3909]: using nameserver 192.168.2.1#53 for domain tsl
Sep 19 14:51:21 dnsmasq[3909]: using local addresses only for domain 100s
Sep 19 14:51:21 dnsmasq[3909]: using local addresses only for domain 3.168.192.in-addr.arpa
Sep 19 14:51:21 dnsmasq[3909]: reading /etc/resolv.conf
Sep 19 14:51:21 dnsmasq[3909]: using nameserver 192.168.2.1#53 for domain tsl
Sep 19 14:51:21 dnsmasq[3909]: using local addresses only for domain 100s
Sep 19 14:51:21 dnsmasq[3909]: using local addresses only for domain 3.168.192.in-addr.arpa
...
То есть, на клиентской машине в «tsl» могу запустить nslookup:
$ nslookup
Default Server: setup.ubnt.com
Address: 192.168.2.1
> google.com # DNS работает
Server: setup.ubnt.com
Address: 192.168.2.1
Non-authoritative answer:
Name: google.com
Addresses: 2607:f8b0:4005:804::200e
216.58.194.174
> client.100s. # Пробую FQDN удалённого клиента. НЕ РАБОТАЕТ
Server: setup.ubnt.com
Address: 192.168.2.1
DNS request timed out.
timeout was 2 seconds.
DNS request timed out.
timeout was 2 seconds.
*** Request to setup.ubnt.com timed-out
> server 192.168.3.1 # Использую удалённый DNS напрямую
Default Server: [192.168.3.1]
Address: 192.168.3.1
> sirius.100s. # Пробую FQDN удалённого клиента. РАБОТАЕТ
Server: [192.168.3.1]
Address: 192.168.3.1
Name: sirius.100s
Address: 192.168.3.21
Когда делаю такой запрос, могу в логах dnsmasq на сервере, который запрашивают (при включённом «log-queries»), видеть, что запросы доходят до начального dnsmasq, и он заявляет, что пересылает запрос на удалённый USG, но удалённый dnsmasq запросы так и не видит (согласно логам и отладке).
Что любопытно, команда UniFi `show dns forwarding statistics` показывает, что ошибок нет и пересылка работает корректно — счетчик «Queries sent» увеличивается на 2 при каждом неудачном nslookup:
user@USG:~$ show dns forwarding statistics
---------------- Cache statistics ----------------
Cache size: 10000
Queries forwarded: 37
Queries answered locally: 19
Total DNS entries inserted into cache: 75
DNS entries removed from cache before expiry: 0
--------------------- Nameserver statistics ---------------------
Server: 192.168.3.1
Queries sent: 2
Queries retried or failed: 0
Server: 75.75.75.75
Queries sent: 35
Queries retried or failed: 4
Server: 75.75.76.76
Queries sent: 6
Queries retried or failed: 0
Я пытался запускать dnsmasq вручную с разными опциями, чтобы дойти до сути. Для справки, самый быстрый способ проверить разные параметры — команда вроде этой:
sudo kill $(cat /run/dnsmasq/dnsmasq.pid 2> /dev/null) 2> /dev/null; sudo /usr/sbin/dnsmasq -x /run/dnsmasq/dnsmasq.pid -u dnsmasq -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new -d --log-queries=extra
Сначала думал, что проблема в опции `--local-service`. Без толку.
Пробовал также поиграться с `--interface` и связанными опциями — тоже без результата.
Я пытался обратиться в поддержку UniFi, но они сказали, что эта функция доступна только на EdgeRouter, а на USG — нет. Однако, судя по сообщениям других пользователей, это не совсем так.
Игры с dnsmasq показывают, что всё должно работать. Может, есть какая-то простая правило маршрутизации, которая всё починит...
Ещё встречал совет добавить вручную SOA/PTR записи в dnsmasq для решения задачи другим способом, но пока не пробовал этот путь.
Может, я что-то элементарное упускаю?
Сети:
{
"tsl": "192.168.2.0/24",
"100s": "192.168.3.0/24"
}
Автоматическая настройка Site-to-site VPN работает отлично, и все клиенты на каждом сайте могут общаться с любым клиентом на любом из сайтов, если известен IP.
Следующий шаг — решить проблему с разрешением DNS. Поиск адресов устройств на локальном сайте работает без проблем. Но, естественно, запрос IP-адресов с удалённого сайта не «просто так» срабатывает.
В попытках это исправить я нашёл много гайдов по настройке. Основной, которым я пользовался, вот этот, но такую же информацию видел и в других обсуждениях.
Похоже, главный трюк — добавить в конфигурацию dnsmasq опцию «server» вида «server=/100s/192.168.3.1» для конфигурации tsl и «server=/tsl/192.168.2.1» для 100s. Это можно сделать тремя способами (как перечислил Kelle Lilja):
- Добавить опцию в файл, который dnsmasq считывает при старте
- Использовать команды unifi cli для добавления опции (что просто создаёт новый /etc/dnsmasq.conf)
- Использовать JSON-файл на контроллере, чтобы задать дополнительные опции (устойчивый вариант пункта 2)
Не вдаваясь в детали, я перепробовал все три способа и могу подтвердить, что конфигурации действительно загружаются dnsmasq. Например, через SSH на USG можно наблюдать в `/var/log/dnsmasq.log`, что при запуске dnsmasq он корректно подгружает мою конфигурацию:
Sep 19 14:51:21 dnsmasq[3909]: started, version 2.78-23-g9e09429 cachesize 10000
Sep 19 14:51:21 dnsmasq[3909]: compile time options: IPv6 GNU-getopt DBus i18n IDN DHCP DHCPv6 no-Lua TFTP conntrack ipset auth DNSSEC loop-detect inotify
Sep 19 14:51:21 dnsmasq-dhcp[3909]: DHCP, IP range 192.168.3.6 -- 192.168.3.254, lease time 1d
Sep 19 14:51:21 dnsmasq[3909]: using nameserver 192.168.2.1#53 for domain tsl
Sep 19 14:51:21 dnsmasq[3909]: using local addresses only for domain 100s
Sep 19 14:51:21 dnsmasq[3909]: using local addresses only for domain 3.168.192.in-addr.arpa
Sep 19 14:51:21 dnsmasq[3909]: reading /etc/resolv.conf
Sep 19 14:51:21 dnsmasq[3909]: using nameserver 192.168.2.1#53 for domain tsl
Sep 19 14:51:21 dnsmasq[3909]: using local addresses only for domain 100s
Sep 19 14:51:21 dnsmasq[3909]: using local addresses only for domain 3.168.192.in-addr.arpa
...
То есть, на клиентской машине в «tsl» могу запустить nslookup:
$ nslookup
Default Server: setup.ubnt.com
Address: 192.168.2.1
> google.com # DNS работает
Server: setup.ubnt.com
Address: 192.168.2.1
Non-authoritative answer:
Name: google.com
Addresses: 2607:f8b0:4005:804::200e
216.58.194.174
> client.100s. # Пробую FQDN удалённого клиента. НЕ РАБОТАЕТ
Server: setup.ubnt.com
Address: 192.168.2.1
DNS request timed out.
timeout was 2 seconds.
DNS request timed out.
timeout was 2 seconds.
*** Request to setup.ubnt.com timed-out
> server 192.168.3.1 # Использую удалённый DNS напрямую
Default Server: [192.168.3.1]
Address: 192.168.3.1
> sirius.100s. # Пробую FQDN удалённого клиента. РАБОТАЕТ
Server: [192.168.3.1]
Address: 192.168.3.1
Name: sirius.100s
Address: 192.168.3.21
Когда делаю такой запрос, могу в логах dnsmasq на сервере, который запрашивают (при включённом «log-queries»), видеть, что запросы доходят до начального dnsmasq, и он заявляет, что пересылает запрос на удалённый USG, но удалённый dnsmasq запросы так и не видит (согласно логам и отладке).
Что любопытно, команда UniFi `show dns forwarding statistics` показывает, что ошибок нет и пересылка работает корректно — счетчик «Queries sent» увеличивается на 2 при каждом неудачном nslookup:
user@USG:~$ show dns forwarding statistics
---------------- Cache statistics ----------------
Cache size: 10000
Queries forwarded: 37
Queries answered locally: 19
Total DNS entries inserted into cache: 75
DNS entries removed from cache before expiry: 0
--------------------- Nameserver statistics ---------------------
Server: 192.168.3.1
Queries sent: 2
Queries retried or failed: 0
Server: 75.75.75.75
Queries sent: 35
Queries retried or failed: 4
Server: 75.75.76.76
Queries sent: 6
Queries retried or failed: 0
Я пытался запускать dnsmasq вручную с разными опциями, чтобы дойти до сути. Для справки, самый быстрый способ проверить разные параметры — команда вроде этой:
sudo kill $(cat /run/dnsmasq/dnsmasq.pid 2> /dev/null) 2> /dev/null; sudo /usr/sbin/dnsmasq -x /run/dnsmasq/dnsmasq.pid -u dnsmasq -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new -d --log-queries=extra
Сначала думал, что проблема в опции `--local-service`. Без толку.
Пробовал также поиграться с `--interface` и связанными опциями — тоже без результата.
Я пытался обратиться в поддержку UniFi, но они сказали, что эта функция доступна только на EdgeRouter, а на USG — нет. Однако, судя по сообщениям других пользователей, это не совсем так.
Игры с dnsmasq показывают, что всё должно работать. Может, есть какая-то простая правило маршрутизации, которая всё починит...
Ещё встречал совет добавить вручную SOA/PTR записи в dnsmasq для решения задачи другим способом, но пока не пробовал этот путь.
Может, я что-то элементарное упускаю?
