Как переписать правила nftables, использующие имена хостов, для работы с несколькими адресами?
У меня есть это правило nftables:
ip daddr { "0.nixos.pool.ntp.org", "1.nixos.pool.ntp.org", "2.nixos.pool.ntp.org", "3.nixos.pool.ntp.org" } udp dport ntp accept comment "Allow NTP traffic for system time"
Цель состоит в том, чтобы разрешить трафик NTP от хоста, который в противном случае отклоняет большую часть трафика (политика отклонения по умолчанию). Имена хостов в правиле берутся из конфигурации NTP системы по умолчанию (поэтому они совпадают с именами хостов, с которыми настроен демон NTP).
Однако он не загружается, потому что 0.nixos.pool.ntp.org
(и другие) имеют несколько адресов:
$ host 0.nixos.pool.ntp.org
0.nixos.pool.ntp.org has address 66.228.42.59
0.nixos.pool.ntp.org has address 216.229.4.66
0.nixos.pool.ntp.org has address 216.229.0.50
0.nixos.pool.ntp.org has address 69.10.161.7
Поэтому nftables жалуется и отказывается загружать набор правил:
# nft -f ...-nftables-rules
...-nftables-rules:37:16-37: Error: Hostname resolves to multiple addresses
ip daddr { "0.nixos.pool.ntp.org", ... } udp dport ntp accept comment "..."
^^^^^^^^^^^^^^^^^^^^^^
Эти доменные имена находятся вне моего контроля. Таким образом, я не могу помешать им разрешить несколько адресов. Я также не знаю, когда записи адресов, связанные с ними, могут измениться.
Как мне написать свой набор правил nftables для решения этого случая?
2 ответа
Для уточнения: это не ответ на ваш вопрос о nftables. Это предложить некоторые другие варианты.
Если вы полностью управляете рассматриваемой машиной (т. Е. Нет ненадежных пользователей, которые могут создавать вредоносные NTP-запросы), то нет существенной разницы в безопасности, поскольку разрешается исходящий NTP на любой сервер по сравнению с доступом только к серверам, возвращаемым DNS-запросом. потому что пул NTP гарантированно изменит эти имена хостов на основе весов серверов в пуле. Таким образом, простое решение - просто разрешить все исходящие NTP.
Если у вас есть ненадежные пользователи и вы хотите заблокировать свои правила, чтобы разрешить только те IP-адреса, которые возвращаются DNS-сервером пула NTP для этих конкретных имен, и вы используете dnsmasq в качестве распознавателя (или хотите переключиться на него), тогда один вариант возможно, использовать dnsmasq для заполнения ipset, а затем ссылаться на этот ipset в правиле nftables (при условии, что nftables поддерживает ipsets). Я использую это с iptables, чтобы ограничить определенный исходящий трафик (например, HTTPS) только теми доменами, которые, как я знаю, я хочу использовать, без необходимости заранее знать IP-адреса.
Если вы следуете последнему подходу, используйте определения ipset примерно так:
ipset create ntp hash:ip family inet counters # IPv4
ipset create ntp-inet6 hash:ip family inet6 counters # IPv6
вместе с опцией dnsmasq, как это:
ipset=/nixos.pool.ntp.org/ntp,ntp-inet6
В описанной выше конфигурации dnsmasq добавит адреса IPv4 для имен, которые он разрешает, в ntp
IPSET и IPv6-адреса для ntp-inet6
ipset. Тогда вы можете сослаться на эти ипсеты в ваших правилах. Вы также можете настроить тайм-аут на ipsets, но это, вероятно, нецелесообразно в этом случае, потому что NTP будет продолжать использовать серверы пула в течение длительных периодов времени после запроса DNS, если источник будет признан стабильным.
Я не думаю, что существует собственный способ использовать «настоящие» переменные, разрешенные DNS, в NFTables.
Я решил эту проблему, создав дополнение: https://github.com/superstes/nftables_addon_dns.
Это скрипт Python3, который создает и обновляет файл конфигурации NFTables, который можно включить. Пусть он работает примерно на 100 серверах уже несколько месяцев.