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