今号では、nftables で設定可能なオプションや、様々な設定方法について、もう少し深堀りして説明します!
代表的なオプション
- -a (もしくは –handle) オプション
前回の記事でもご説明した通り、ハンドル番号を表示します。# nft --handle list chain inet table1 chain1 table inet table1 { chain chain1 { # handle 1 type filter hook input priority filter; policy accept; tcp dport 22 accept # handle 2 tcp dport 80 accept # handle 3 } }
- -f オプション
ファイルに記載されたルールセットを読み込みます。
nftabels のルールは nft ファイルに定義します。例えば、test.nft というファイルに、下記の内容で新たにテーブル、チェーン、ルールを追加するとします。table inet table2 { chain chain2 { type filter hook input priority filter; policy accept; tcp dport 25 accept } }
test.nft を -f オプションを指定して読み込みます。
# nft -f test.nft
nft list ruleset コマンドでルールセットを確認してみると、test.nft で指定したテーブル、チェーン、ルールが追加されたことが分かります。
# nft list ruleset table inet table1 { chain chain1 { type filter hook input priority filter; policy accept; tcp dport 22 accept tcp dport 80 accept } } table inet table2 { chain chain2 { type filter hook input priority filter; policy accept; tcp dport 25 accept } }
- -c オプション
nft ファイルの構文が正しいかを確認します。# nft -c -f test.nft
何らかの構文ミスがあった場合、下記の様に表示されることがあります。
# nft -c -f test.nft
ルールの書き方
ルールを設定する際の基本的な構造は、①条件 (どんなプロトコルやパケットが対象か) と、②処理 (そのパケットをどうするか) となります。
前回の記事での例を見てみましょう。
# nft add rule inet table1 chain1 tcp dport 22 accept # nft add rule inet table1 chain1 tcp dport 80 accept
この場合、tcp dport が ①、22 accept や 80 accept が②になります。
ちなみに、①に指定可能なパラメータとしては、下記のようなものがあります。
プロトコルの種類
- tcp
- udp
- icmp
プロトコルに対する詳細な条件
- dport
宛先ポート番号 - sport
送信元ポート番号 - daddr
宛先 IP アドレス - saddr
送信元 IP アドレス - iif
パケットが入ってきたネットワーク機器名 - oif
パケットが出ていくネットワーク機器名
さらに、②に指定可能なパラメータは、下記の通りです。
- accept
パケットを許可 - drop
パケットを拒否 (送信元に拒否された旨の通知なし) - reject
パケットを拒否 (送信元に拒否された旨の通知あり)
一般的な設定例
最後に、これまでの内容を踏まえ、簡単な設定例を 2つご紹介します。
※あくまで最小限の構成です。必要に応じてルールの追加をしてください。
注意事項
- これから紹介する設定例では、複数の条件を指定する必要があるため nft ファイルの形式にて記載しました。
下記の内容を nft 形式のファイルに記載の上 nft -f コマンドでそのファイルを指定し、設定を反映させてください。 - nft -f コマンド実行後は、設定を永続化するため systemctl reload nftables を実行してください。
設定例
例1:一般的な Web サーバ
・SSH (22)、HTTP (80)、HTTPS (443) のみを許可
・上記以外は拒否
table inet server1 { chain input { type filter hook input priority 0; policy drop; # 確立済み・または関連のある通信を許可 (これがないとレスポンスが遮断される) ct state established,related accept # 自分の SSH 接続を許可 tcp dport 22 accept # Web サーバ用のポート (80、443) を許可 tcp dport { 80, 443 } accept # ループバックを許可 iif lo accept } chain forward { type filter hook forward priority 0; policy drop; } chain output { type filter hook output priority 0; policy accept; } }
例2:IP アドレスのブロックリスト
・指定した IP アドレスからのアクセスを拒否 (drop)
table inet server2 { chain input { type filter hook input priority 0; policy accept; # ブロックしたい IP アドレス (1つのルールごとに 1つ) ip saddr 192.0.2.10 drop ip saddr 192.0.2.50 drop ip saddr 203.0.113.12 drop } }