CentOS Stream 8
Sponsored Link

Nftables : 基本操作
2021/10/05
 
Nftables の基本操作です。[nft] ツールで各種操作を実行可能です。
[1]
nftables は、従来の iptables, ip6tables, arptables, ebtables の機能を統合したツールです。
それぞれの機能が担っていたネットワークレベルは、[Family] として抽象化されています。
[nft] ツールでの各種設定時には、これらの [Family] を指定して実行することになります。
現時点で指定可能な [Family] は下記の通りです。( 将来的に下記以外の [Family] が追加される可能性あり )
Family 概要
ip IPv4 トラフィック/パケットを参照する。レガシーツールの [iptables] に相当する。
ip6 IPv6 トラフィック/パケットを参照する。レガシーツールの [ip6tables] に相当する。
inet IPv4 と IPv6 両方のトラフィック/パケットを参照する。IPv4/IPv6 のデュアルスタックサポートを容易にする。
arp カーネルによってレイヤー3 レベルの処理が行われる前に、ARP レベルのトラフィックを参照する。レガシーツールの [arptables] に相当する。
bridge ブリッジを通過するトラフィック/パケットを参照する。レガシーツールの [ebtables] に相当する。
ただし、このファミリーには [nf_conntrack] は統合されていない。
netdev 他のファミリーとは毛色が異なり、ある単一のネットワークインターフェースに設定するベースチェインを作成する際に使用される。
ベースチェインは、設定された単一のネットワークインターフェースで、L2 プロトコルか L3 プロトコルかに関係なく、全てのトラフィックを参照する。
よって、ARP トラフィックをフィルタリングしたい場合は、このファミリーで実行可。
レガシーツールには、このファミリーに相当する機能はない。

[2]
nftables デフォルトでは設定なしのため、テーブルの作成から始めることになります。
テーブルは以下のようにして作成します。
⇒ nft add table [family] [table name]
# 現在のルールセット表示 (初期状態はルールなし)

[root@dlp ~]#
nft list ruleset

# [inet] ファミリーに [firewall01] テーブルを追加

[root@dlp ~]#
nft add table inet firewall01

# [inet] ファミリーのテーブル表示

[root@dlp ~]#
nft list tables inet

table inet firewall01
# 現在のルールセット表示

[root@dlp ~]#
nft list ruleset

table inet firewall01 {
}


# テーブルを削除する場合は以下

[root@dlp ~]#
nft delete table inet firewall01

[3]
テーブル作成後はチェインを追加します。
⇒ nft add chain [family] [table name] [chain name] { type [type] hook [hook} priority [priority] \; }
指定可能な [type], [hook] は下記の通りです。[priority] についてはよくある整数値の設定で、値が小さいほど優先後が高まります。
Type 概要
filter フィルタリング全般で使用。
全ての [family], [hook] で使用可。
route ルーティングで使用。
[ip], [ip6], [inet] ファミリーで使用可。
[output] フックで使用可。
nat NAT で使用。
[ip], [p6], [inet] ファミリーで使用可。
[input], [output], [prerouting]. [postrouting] フックで使用可。

Hook 概要
input [ip], [ip6], [inet], [apr], [bridge] ファミリーで使用可。
[filter], [nat] タイプで使用可。
output [ip], [ip6], [inet], [apr], [bridge] ファミリーで使用可。
[filter], [route], [nat] タイプで使用可。
forward [ip], [ip6], [inet], [bridge] ファミリーで使用可。
[filter] タイプで使用可。
prerouting [ip], [ip6], [inet], [bridge] ファミリーで使用可。
[filter], [nat] タイプで使用可。
postrouting [ip], [ip6], [inet], [bridge] ファミリーで使用可。
[filter], [nat] タイプで使用可。
ingress [netdev] ファミリーで使用可。
[filter] タイプで使用可。

# [filter] タイプ, [input] フック, 優先度 [0] で
# [inet] ファミリーの [firewall01] テーブルに [filter_INPUT] チェインを追加

[root@dlp ~]#
nft add chain inet firewall01 filter_INPUT { type filter hook input priority 0 \;}
[root@dlp ~]#
nft list ruleset

table inet firewall01 {
        chain filter_INPUT {
                type filter hook input priority filter; policy accept;
        }
}


# チェインを削除する場合は以下

[root@dlp ~]#
nft delete chain inet firewall01 filter_INPUT

[root@dlp ~]#
nft list ruleset

table inet firewall01 {
}
[4] テーブルとチェインを作成した後は、設定したいルールを追加します。
[root@dlp ~]#
nft list ruleset

table inet firewall01 {
        chain filter_INPUT {
                type filter hook input priority filter; policy accept;
        }
}

# 例として、コネクションの状態が [related, established] のパケットを許可するルールを追加

[root@dlp ~]#
nft add rule inet firewall01 filter_INPUT ct state related,established accept
[root@dlp ~]#
nft list table inet firewall01

table inet firewall01 {
        chain filter_INPUT {
                type filter hook input priority filter; policy accept;
                ct state established,related accept
        }
}

# 例として、ループバックインターフェースを許可するルールを追加

[root@dlp ~]#
nft add rule inet firewall01 filter_INPUT iif lo accept
[root@dlp ~]#
nft list table inet firewall01

table inet firewall01 {
        chain filter_INPUT {
                type filter hook input priority filter; policy accept;
                ct state established,related accept
                iif "lo" accept
        }
}

# 例として、追加済みのルール以外のパケットは破棄するルールを追加

[root@dlp ~]#
nft add rule inet firewall01 filter_INPUT drop
[root@dlp ~]#
nft -a list table inet firewall01

table inet firewall01 { # handle 2
        chain filter_INPUT { # handle 1
                type filter hook input priority filter; policy accept;
                ct state established,related accept # handle 2
                iif "lo" accept # handle 3
                drop # handle 4
        }
}

# 例として、[22] 番ポート宛でコネクションの状態が [new, untracked] の
# パケットを許可するルールを [handle 3] の後ろの位置に追加

[root@dlp ~]#
nft add rule inet firewall01 filter_INPUT handle 3 tcp dport 22 ct state { new,untracked } accept
[root@dlp ~]#
nft -a list table inet firewall01
table inet firewall01 { # handle 2
        chain filter_INPUT { # handle 1
                type filter hook input priority filter; policy accept;
                ct state established,related accept # handle 2
                iif "lo" accept # handle 3
                tcp dport 22 ct state { new, untracked } accept # handle 6
                drop # handle 4
        }
}

# 例として、パケットのメタデータが [icmp,ipv6-icmp] のパケットを許可するルールを [handle 6] の後ろの位置に追加

[root@dlp ~]#
nft add rule inet firewall01 filter_INPUT handle 6 meta l4proto { icmp,ipv6-icmp } accept
[root@dlp ~]#
nft -a list table inet firewall01

table inet firewall01 { # handle 2
        chain filter_INPUT { # handle 1
                type filter hook input priority filter; policy accept;
                ct state established,related accept # handle 2
                iif "lo" accept # handle 3
                tcp dport 22 ct state { new, untracked } accept # handle 6
                meta l4proto { icmp, ipv6-icmp } accept # handle 8
                drop # handle 4
        }
}


# ルールを削除する場合は削除したいルールの [handle] 番号を指定して削除

[root@dlp ~]#
nft delete rule inet firewall01 filter_INPUT handle 6
[root@dlp ~]#
nft -a list table inet firewall01

table inet firewall01 { # handle 2
        chain filter_INPUT { # handle 1
                type filter hook input priority filter; policy accept;
                ct state established,related accept # handle 2
                iif "lo" accept # handle 3
                meta l4proto { icmp, ipv6-icmp } accept # handle 8
                drop # handle 4
        }
}
関連コンテンツ