Назад | Перейти на главную страницу

Как следует переписать правила 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, чтобы справиться с этим случаем?

Чтобы прояснить заранее: это не ответ на ваш вопрос о 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. Затем вы можете ссылаться на эти ipset в своих правилах. Вы также можете настроить тайм-аут для IPSET, но это, вероятно, нецелесообразно в данном случае, потому что NTP будет продолжать использовать серверы пула в течение длительного периода времени после запроса DNS, если источник окажется стабильным.