過去 2 年間、同じ設定で nftables を使用してきましたが、先日プログラムを更新したところ、すべてのドキュメントにはまだ正しいと記載されているにもかかわらず、設定が有効ではないというエラーが表示されます。誰か不正なシンボルか何かを見つけられるでしょうか?
これが私の設定です:
flush ruleset
# `inet` applies to both IPv4 and IPv6.
table inet filter {
chain input {
type filter hook input priority 0;
# accept any localhost traffic
iif lo accept
# no ping floods:
ip protocol icmp icmp type echo-request limit rate over 10/second burst 4 packets drop
ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 10/second burst 4 packets drop
# accept traffic originated from us
ct state established,related accept
# ssh
tcp dport 22 accept
# http/https
tcp dport 80 accept
tcp dport 443 accept
# tftp/netboot
udp dport 4011 accept
udp dport 67 accept
tcp dport 69 accept
udp dport 69 accept
# listinator
tcp dport 8080 accept
tcp dport 4343 accept
# smb
tcp dport 139 accept
tcp dport 445 accept
udp dport 137 accept
udp dport 138 accept
# mc
tcp dport 25565 accept
# count and drop any other traffic
counter drop
}
chain output {
type filter hook output priority 0;
policy accept;
}
chain forward {
type filter hook forward priority 0;
nft add rule inet filter forward ct status dnat accept;
policy drop;
}
}
起動時のエラー:
Starting nftables...
/etc/nftables.conf:57:6-8: Error: syntax error, unexpected add
nft add rule inet filter forward ct status dnat accept;
^^^
nftables.service: Main process exited, code=exited, status=1/FAILURE
nftables.service: Failed with result 'exit-code'.
Failed to start nftables.
答え1
これはnftables 脚本コマンドでロードされますnft -f
。nft
単語は内部では意味を持たず、表示されるべきではありません。しかし、同じ場所に 1 1/2 個の他の問題があります。それでは見てみましょう:
コマンドがエラーを発する行の周辺にはnft
次の内容があります:
chain forward { type filter hook forward priority 0; nft add rule inet filter forward ct status dnat accept; policy drop; }
nft
削除される、すでに
inet filter forward
(チェーン)ブロック内にあるしたがって、
add rule inet filter forward
も削除する必要があります。 実際には、;
の後に新しい行があるため、 は不要です。ct status dnat accept
policy drop;
基本チェーン定義と一緒に配置する必要があります今回は
;
構文の必須部分policy
です。キーワードは鎖意味、一部ではないルール定義。これは現在、間のルールによってベースチェーン定義から分離されて受け入れられているように見えますが、これは信頼できるものではありません。これは後のリリースで変更される可能性があります。同じ注意事項がチェーンにも当てはまります。後で誤ってルールを挿入しないように、基本チェーン定義から
output
分離しないでください。policy accept;
forward
最終的に、チェーンは次のように置き換えられます。
chain forward {
type filter hook forward priority 0; policy drop;
ct status dnat accept
}
正しい構文ではあるが、あまり面白くないのは、次のようにスクリプトの最後に、ブロック内ではなく構造の完全に外側でルールを定義することです。
chain forward {
type filter hook forward priority 0; policy drop;
}
}
add rule inet filter forward ct status dnat accept
いずれにせよ、チェーン ブロックnft list ruleset
内で以前と同じように表示されますinet filter forward
。
ノート:
使用するのはOKですが
ip protocol icmp
、使用するのはダメですip6 nexthdr ipv6-icmp
その理由は、IPv4ヘッダーのプロトコルが常にレイヤー4プロトコルであるIPv4とは対照的に、IPv6の次のヘッダー必ずしもレイヤー4(icmp、udp、tcp...)ヘッダーではありません。代わりに拡張ヘッダーIPv6 ヘッダーとレイヤー 4 (最終) ヘッダーの間に表示されます。この場合、ルールは一致しません。
OS は既にこのパケットがどのレイヤー 4 プロトコルに属しているかを判別しているため、この情報はパケット コンテンツ情報ではなくメタ情報として利用できます
meta l4proto ipv6-icmp
。これもまたマニュアルページに記載されている:
この表現は、IPv6 ヘッダー フィールドを参照します。 を使用する場合は注意してください。
ip6 nexthdr
値は次のヘッダーのみを参照します。つまり、ip6 nexthdr tcp
IPv6 パケットに拡張ヘッダーが含まれていない場合にのみ一致します。フラグメント化されたパケットや、たとえばルーティング拡張ヘッダーを含むパケットは一致しません。meta l4proto
実際のトランスポート ヘッダーを一致させ、追加の拡張ヘッダーを無視する場合は、 を使用してください。しかし実際には、同じ行に
icmpv6 type ...
行が含まれているため、これはすでにレイヤー4プロトコルをICMPv6に一致するようにフィルタリングしており、同時にICMPv6を使用すると、レイヤー3プロトコルが暗黙的にIPv6と一致するように設定されます。: それを正すために何も必要ありません。ip protocol icmp
同様に、前の行も同じ理由でなくてもかまいません(ただし、現在の動作は問題ありません)。この線:
ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 10/second burst 4 packets drop
次のように単純に置き換える必要があります:
icmpv6 type echo-request limit rate over 10/second burst 4 packets drop
(先頭に付ける必要はありません
meta nfproto ipv6 meta l4proto icmpv6
)FTPサーバー
-
TCP ポート 69 は使用されないため、これを許可するルールは必要ありません。
TFTP とステートフルファイアウォール
FTPサーバーファイアウォールにとってFTPと同じくらい難しいプロトコルです。最初のクエリの後、データ転送自体はUDPポート69をどこでも使用しません。TFTP 接続トラック ヘルパー非推奨の sysctl 設定が再度有効になっていない限り、追加のルール (
nf_conntrack_tftp
カーネル モジュールを自動ロードする) が必要になる可能性があります。net.netfilter.nf_conntrack_helper
ここでこの件について触れるのは本当に論点から外れてしまいます。私の回答の冒頭部分をご覧ください。CentOS 8 を nft と firewalld を備えた NAT ルーターとして使用 - TFTP を通過させるにはどうすればよいですか?コピーして置き換えることができるTFTPルールセットの例を用意するnftables wiki の FTP の例。
-
ポート値が異なるだけの同一のルールは、次のように分解できる。匿名セット。nftables バージョン1.0.2以上では
-o
(optimize)オプションも存在するこれを自動的に実行してみます。