私はこの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を許可することで、セキュリティに実質的な違いはありません。 NTPプールは、プール内のサーバーの重みに基づいてこれらのホスト名を変更することが保証されているため、DNSクエリによって返されたサーバーのみへのアクセスを許可します。したがって、簡単な解決策は、すべてのアウトバウンドNTPを許可することです。
信頼できないユーザーがいて、ルールをロックダウンして、それらの特定の名前に対してNTPプールDNSサーバーから返されるIPのみを許可する場合、リゾルバーとしてdnsmasqを使用します(またはに切り替えます)それ)、1つのオプションは、dnsmasqを使用してipsetにデータを入力し、nftablesルールでそのipsetを参照することです(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のクエリ後も長期間プールサーバーを使用し続けるため、この場合はおそらくお勧めできません。