8.4. nftables スクリプトの作成および実行
nftables フレームワークを使用する主な利点は、スクリプトの実行がアトミックであることです。つまり、システムがスクリプト全体を適用するか、エラーが発生した場合には実行を阻止することを意味します。これにより、ファイアウォールは常に一貫した状態になります。
さらに、nftables スクリプト環境を使用すると、次のことができます。
- コメントの追加
- 変数の定義
- 他のルールセットファイルの組み込み
nftables パッケージをインストールすると、Red Hat Enterprise Linux が自動的に *.nft スクリプトを /etc/nftables/ ディレクトリーに作成します。このスクリプトは、さまざまな目的でテーブルと空のチェーンを作成するコマンドが含まれます。
8.4.1. 対応している nftables スクリプトの形式 リンクのコピーリンクがクリップボードにコピーされました!
nftables スクリプト環境では、次の形式でスクリプトを記述できます。
nft list rulesetコマンドと同じ形式でルールセットが表示されます。#!/usr/sbin/nft -f # Flush the rule set flush ruleset table inet example_table { chain example_chain { # Chain for incoming packets that drops all packets that # are not explicitly allowed by any rule in this chain type filter hook input priority 0; policy drop; # Accept connections to port 22 (ssh) tcp dport ssh accept } }nftコマンドと同じ構文:#!/usr/sbin/nft -f # Flush the rule set flush ruleset # Create a table add table inet example_table # Create a chain for incoming packets that drops all packets # that are not explicitly allowed by any rule in this chain add chain inet example_table example_chain { type filter hook input priority 0 ; policy drop ; } # Add a rule that accepts connections to port 22 (ssh) add rule inet example_table example_chain tcp dport ssh accept
8.4.2. nftables スクリプトの実行 リンクのコピーリンクがクリップボードにコピーされました!
nftables スクリプトは、nft ユーティリティーに渡すか、スクリプトを直接実行することで実行できます。
手順
nftablesスクリプトをnftユーティリティーに渡して実行するには、次のコマンドを実行します。# nft -f /etc/nftables/<example_firewall_script>.nftnftablesスクリプトを直接実行するには、次のコマンドを実行します。1 回だけ実行する場合:
スクリプトが以下のシバンシーケンスで始まることを確認します。
#!/usr/sbin/nft -f重要-fパラメーターを指定しないと、nftユーティリティーはスクリプトを読み取らず、Error: syntax error, unexpected newline, expecting stringを表示します。必要に応じて、スクリプトの所有者を
rootに設定します。# chown root /etc/nftables/<example_firewall_script>.nft所有者のスクリプトを実行ファイルに変更します。
# chmod u+x /etc/nftables/<example_firewall_script>.nft
スクリプトを実行します。
# /etc/nftables/<example_firewall_script>.nft出力が表示されない場合は、システムがスクリプトを正常に実行します。
nft はスクリプトを正常に実行しますが、ルールの配置やパラメーター不足、またはスクリプト内のその他の問題により、ファイアウォールが期待通りの動作を起こさない可能性があります。
8.4.3. nftables スクリプトでコメントの使用 リンクのコピーリンクがクリップボードにコピーされました!
nftables スクリプト環境は、# 文字の右側から行末までのすべてをコメントとして解釈します。
コメントは、行の先頭またはコマンドの横から開始できます。
...
# Flush the rule set
flush ruleset
add table inet example_table # Create a table
...
8.4.4. nftables スクリプトでの変数の使用 リンクのコピーリンクがクリップボードにコピーされました!
nftables スクリプトで変数を定義するには、define キーワードを使用します。シングル値および匿名セットを変数に保存できます。より複雑なシナリオの場合は、セットまたは決定マップを使用します。
- 値を 1 つ持つ変数
以下の例は、値が
enp1s0のINET_DEVという名前の変数を定義します。define INET_DEV = enp1s0スクリプトで変数を使用するには、
$記号と、それに続く変数名を指定します。... add rule inet example_table example_chain iifname $INET_DEV tcp dport ssh accept ...- 匿名セットを含む変数
以下の例では、匿名セットを含む変数を定義します。
define DNS_SERVERS = { 192.0.2.1, 192.0.2.2 }スクリプトで変数を使用するには、
$記号と、それに続く変数名を指定します。add rule inet example_table example_chain ip daddr $DNS_SERVERS accept注記中括弧は、変数がセットを表していることを示すため、ルールで使用する場合は、特別なセマンティクスを持ちます。
8.4.5. nftables スクリプトへのファイルの追加 リンクのコピーリンクがクリップボードにコピーされました!
nftables スクリプト環境では、include ステートメントを使用して他のスクリプトを含めることができます。
絶対パスまたは相対パスのないファイル名のみを指定すると、nftables には、デフォルトの検索パスのファイルが含まれます。これは、Red Hat Enterprise Linux では /etc に設定されています。
例8.1 デフォルト検索ディレクトリーからのファイルを含む
デフォルトの検索ディレクトリーからファイルを指定するには、次のコマンドを実行します。
include "example.nft"
例8.2 ディレクトリーの *.nft ファイルをすべて含む
*.nft で終わるすべてのファイルを /etc/nftables/rulesets/ ディレクトリーに保存するには、次のコマンドを実行します。
include "/etc/nftables/rulesets/*.nft"
include ステートメントは、ドットで始まるファイルに一致しないことに注意してください。
8.4.6. システムの起動時に nftables ルールの自動読み込み リンクのコピーリンクがクリップボードにコピーされました!
systemd サービス nftables は、/etc/sysconfig/nftables.conf ファイルに含まれるファイアウォールスクリプトを読み込みます。
前提条件
-
nftablesスクリプトは、/etc/nftables/ディレクトリーに保存されます。
手順
/etc/sysconfig/nftables.confファイルを編集します。-
nftablesパッケージのインストールで/etc/nftables/に作成された*.nftスクリプトを変更した場合は、これらのスクリプトのincludeステートメントのコメントを解除します。 新しいスクリプトを作成した場合は、
includeステートメントを追加してこれらのスクリプトを含めます。たとえば、nftablesサービスの起動時に/etc/nftables/example.nftスクリプトを読み込むには、以下を追加します。include "/etc/nftables/_example_.nft"
-
オプション:
nftablesサービスを開始して、システムを再起動せずにファイアウォールルールを読み込みます。# systemctl start nftablesnftablesサービスを有効にします。# systemctl enable nftables