
私シンプルなステートフルファイアウォールそしてnftablesフォローするArch Linux nftables ガイド。私はこの質問をArch Linuxフォーラムに投稿しましたが、答えを受け取りませんでした。
ガイドを完了してコンピュータを再起動した後、システムロードできません。nftables.service。エラーを解決するために、以下を実行しました。
systemctl status nftables
関連出力は次のとおりです。
/etc/nftables.conf:7:17-25: Error: conflicting protocols specified: inet-service v. icmp
このエラーは、入力チェーンで新しいping(icmp)を許可するように設定したルールについて文句を言います。ルールは次のとおりです。間違った点はありません。
icmp type echo-request ct state new accept
ルールを削除すると機能します。しかし、私はルールが欲しい。
これは私のルールです。nftables.confガイドを完了した後:
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
iif "lo" accept
ct state invalid drop
icmp type echo-request ct state new accept
ip protocol udp ct state new jump UDP
tcp flags & (fin | syn | rst | ack) == syn ct state new jump TCP
ip protocol udp reject
ip protocol tcp reject with tcp reset
meta nfproto ipv4 counter packets 0 bytes 0 reject with icmp type prot-unreachable
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
chain TCP {
tcp dport http accept
tcp dport https accept
tcp dport ssh accept
tcp dport domain accept
}
chain UDP {
tcp dport domain accept
}
}
私は何を見逃していますか?よろしくお願いします。
答え1
これはnftables 0.7(または他のバージョン)の構文上の制限です。inet
どのIPプロトコルが最初に使用されるかを明示的に指定せず、デュアルIPv4 / IPv6テーブルで直接使用されるICMPおよびICMPv6を考慮しません。
したがって、ルールは次のようになります。
icmp type echo-request ct state new accept
IPv4とIPv6の両方で作業するには、次のように2回作成する必要があります。
修正するnexthdr
:実際には、上位層プロトコルを指すIPv6に依存してはいけません。拡張ヘッダ固定ヘッダーと親ヘッダー(最後のヘッダー)の間。正しい構文を追加して(すでにプロトコル情報を提供するメタ情報を使用して)、「正しい」構文がnftables 0.7に有効であるかどうかはわかりません。元の答えを残します。
meta nfproto ipv4 meta l4proto icmp icmp type echo-request ct state new accept
meta nfproto ipv6 meta l4proto icmpv6 icmpv6 type echo-request ct state new accept
ip protocol icmp icmp type echo-request ct state new accept
ip6 nexthdr icmpv6 icmpv6 type echo-request ct state new accept
対応するバイトコードが与えられた場合(ディスプレイを使用nft --debug=netlink list ruleset -a
):
inet filter input 9 8
[ meta load nfproto => reg 1 ]
[ cmp eq reg 1 0x00000002 ]
[ payload load 1b @ network header + 9 => reg 1 ]
[ cmp eq reg 1 0x00000001 ]
[ payload load 1b @ transport header + 0 => reg 1 ]
[ cmp eq reg 1 0x00000008 ]
[ ct load state => reg 1 ]
[ bitwise reg 1 = (reg=1 & 0x00000008 ) ^ 0x00000000 ]
[ cmp neq reg 1 0x00000000 ]
[ immediate reg 0 accept ]
inet filter input 10 9
[ meta load nfproto => reg 1 ]
[ cmp eq reg 1 0x0000000a ]
[ payload load 1b @ network header + 6 => reg 1 ]
[ cmp eq reg 1 0x0000003a ]
[ payload load 1b @ transport header + 0 => reg 1 ]
[ cmp eq reg 1 0x00000080 ]
[ ct load state => reg 1 ]
[ bitwise reg 1 = (reg=1 & 0x00000008 ) ^ 0x00000000 ]
[ cmp neq reg 1 0x00000000 ]
[ immediate reg 0 accept ]
ICMPはIPプロトコル1、エコー要求値8です。 ICMPv6
はIPv6プロトコル58(0x3a)で、対応するエコー要求値は128(0x80)です。
最新のnftables 0.9はルールを直接受け入れますicmp type echo-request ct state new accept
が、対応するバイトコードは次のとおりです。
inet filter input 9 8
[ meta load nfproto => reg 1 ]
[ cmp eq reg 1 0x00000002 ]
[ meta load l4proto => reg 1 ]
[ cmp eq reg 1 0x00000001 ]
[ payload load 1b @ transport header + 0 => reg 1 ]
[ cmp eq reg 1 0x00000008 ]
[ ct load state => reg 1 ]
[ bitwise reg 1 = (reg=1 & 0x00000008 ) ^ 0x00000000 ]
[ cmp neq reg 1 0x00000000 ]
[ immediate reg 0 accept ]
つまり、ICMPv6ではなくICMPのみを処理するため、次のように単純な追加ルールを追加する必要があります。
icmpv6 type echo-request ct state new accept
以前のバージョンと同等のバイトコードを返します。
inet filter input 10 9
[ meta load nfproto => reg 1 ]
[ cmp eq reg 1 0x0000000a ]
[ meta load l4proto => reg 1 ]
[ cmp eq reg 1 0x0000003a ]
[ payload load 1b @ transport header + 0 => reg 1 ]
[ cmp eq reg 1 0x00000080 ]
[ ct load state => reg 1 ]
[ bitwise reg 1 = (reg=1 & 0x00000008 ) ^ 0x00000000 ]
[ cmp neq reg 1 0x00000000 ]
[ immediate reg 0 accept ]