Задача пинговать кастомные зоны на 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
Комментариев нет:
Отправить комментарий