Как переписать правила 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. Это предложить некоторые другие варианты.

  1. Если вы полностью управляете рассматриваемой машиной (т. Е. Нет ненадежных пользователей, которые могут создавать вредоносные NTP-запросы), то нет существенной разницы в безопасности, поскольку разрешается исходящий NTP на любой сервер по сравнению с доступом только к серверам, возвращаемым DNS-запросом. потому что пул NTP гарантированно изменит эти имена хостов на основе весов серверов в пуле. Таким образом, простое решение - просто разрешить все исходящие NTP.

  2. Если у вас есть ненадежные пользователи и вы хотите заблокировать свои правила, чтобы разрешить только те 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 серверах уже несколько месяцев.

Другие вопросы по тегам