Некоторые картинки не загружаются из РФ и РК, используйте VPN.

пятница, 28 апреля 2023 г.

Mikrotik переброс DNS запросов на другой Mikrotik

Задача пинговать кастомные зоны на vpn клиентах (openvpn).

При помощи модифицированного скрипта подготовки ovpn файлов я формирую следующую конфигурацию:

client
dev tun
proto tcp-client
remote vpn.mysite.ru
nobind
persist-key
persist-tun
auth-nocache
ca [inline]
cert [inline]
key [inline]
askpass 1.cfg
auth-user-pass stdin
remote-cert-tls server
pull-filter ignore redirect-gateway
dhcp-option DNS 10.111.11.1
dhcp-option ADAPTER_DOMAIN_SUFFIX skzloc,lokihome
route 10.11.11.0 255.255.255.0 10.111.11.1
route 10.110.1.0 255.255.255.0 10.111.11.1
cipher AES-256-CBC
tls-cipher TLS-RSA-WITH-AES-256-CBC-SHA
auth SHA1

В этом конфиге примечательно то, что указано два DNS суффикса, соответственно все имена, содержащие данный DNS суффикс, будут резолвится (в первую очередь) через указанный DNS сервер. Есть UP внизу, рекомендуется к ознакомлению

Дальше соль заключается в том, что 10.111.11.1 ничего не знает о зоне skzloc, о ней знает другой VPN сервер (10.222.22.2), который связан с 10.111.11.1. Указание в настройках DNS еще одного DNS сервера 10.222.22.2 не приведет к нужному результату, т.к. использование не первичных DNS серверов для резолвинга происходит только в случае недоступности первичных, а не отсутствия от них ответа. В голову пришла мысль - надо обмениваться статическими DNS записями, типа скрипт раз в N время подключается ко второму роутеру и перетягивает данные по другой зоны, а тот в свою очередь делает тоже самое. Идея интересная, но имеет кучу минусов....

И тут меня шарахнуло - "Layer 7" и таки да "Layer 7"+Mangle+DNAT - вот оно решение:


/ip firewall layer7-protocol add name="skzloc" regexp="^.+skzloc"
/ip firewall mangle add chain=prerouting layer7-protocol=skzloc action=mark-connection new-connection-mark=dns_skzloc protocol=udp dst-port=53
/ip firewall nat add chain=dstnat action=dst-nat connection-mark=dns_skzloc to-addresses=10.222.22.2

Так как второй сервер также выступает точкой входа с доступом к сети за 10.111.11.1, то на нем нужно повторить настройку для второго домена.

При этом DHCP сервер на этих микротиках имеет скрипт, который создает запись в Static DNS при выдаче лизы (скрипт не мой, найден на просторах интернета):

# When "1" all DNS entries with IP address of DHCP lease are removed
:local dnsRemoveAllByIp "1"
# When "1" all DNS entries with hostname of DHCP lease are removed
:local dnsRemoveAllByName "1"
# When "1" addition and removal of DNS entries is always done also for non-FQDN hostname
:local dnsAlwaysNonfqdn "0"
# DNS domain to add after DHCP client hostname
:local dnsDomain "skzloc"
# DNS TTL to set for DNS entries
:local dnsTtl "00:15:00"
# Source of DHCP client hostname, can be "lease-hostname" or any other lease attribute, like "host-name" or "comment"
:local leaseClientHostnameSource "lease-hostname"

:local leaseComment "dhcp-lease-script_$leaseServerName_$leaseClientHostnameSource"
:local leaseClientHostname
:if ($leaseClientHostnameSource = "lease-hostname") do={
  :set leaseClientHostname $"lease-hostname"
} else={
  :set leaseClientHostname ([:pick \
    [/ip dhcp-server lease print as-value where server="$leaseServerName" address="$leaseActIP" mac-address="$leaseActMAC"] \
    0]->"$leaseClientHostnameSource")
}
:local leaseClientHostnames "$leaseClientHostname"
:if ([:len [$dnsDomain]] > 0) do={
  :if ($dnsAlwaysNonfqdn = "1") do={
    :set leaseClientHostnames "$leaseClientHostname.$dnsDomain,$leaseClientHostname"
  } else={
    :set leaseClientHostnames "$leaseClientHostname.$dnsDomain"
  }
}
:if ($dnsRemoveAllByIp = "1") do={
  /ip dns static remove [/ip dns static find comment="$leaseComment" and address="$leaseActIP"]
}
:foreach h in=[:toarray value="$leaseClientHostnames"] do={
  :if ($dnsRemoveAllByName = "1") do={
    /ip dns static remove [/ip dns static find comment="$leaseComment" and name="$h"]
  }
  /ip dns static remove [/ip dns static find comment="$leaseComment" and address="$leaseActIP" and name="$h"]
  :if ($leaseBound = "1") do={
    :delay 1
    /ip dns static add comment="$leaseComment" address="$leaseActIP" name="$h" ttl="$dnsTtl"
  }
}

UP 02/05/2023

Совершенно случайно выяснили что Layer 7 знатно нагибает процессор и с минимальным объемом правил сокращает гигабит до четверти на RB2011 (он же 951), на RB4011 картина может быть лучше. В итоге нашли другое решение, можно сказать - из коробки - запись static dns с типом FWD:

/ip dns static add forward-to=10.222.22.2 regexp=".*\\.skzloc\$" type=FWD


Комментариев нет:

Отправить комментарий