iptables から nftables にサクッと切り替える

どうもみむらです。

Red Hat Enterprise Linux 8 になって iptables から nftables に本格的に切り替えが始まりました。
CentOS 8 もこれを受けて nftables への切り替えが必要になってきました。

参考資料:Linuxにおける新たなパケットフィルタリングツール「nftables」入門
https://knowledge.sakura.ad.jp/22636/

firewalld で書いていれば影響を受けないらしいのですが
iptables で直接ルールを書いている人なので、これを機に nftables に変換してしまおうかと。


実はさくっと切り替えられる

とりあえず変換して nftables で管理出来るようになればよいのであれば
下記の2パターンの方法で変換可能です。

パターン1 : iptables-restore-translate で設定ファイルを変換する
パターン2 : iptables を有効にしたあと nft で設定を取り出す

見た限りでは パターン1の方が色んなサイトでも紹介されており
出てくる設定を見ても綺麗な設定に思えるので、推奨なんだと思います。

ただパターン2だと、NAT 設定などもきちんと変換されますので、
急ぎで行いたい場合はパターン2で、
時間があるときは1で変換して、さらに手入れをするのが良いと思います。


1. iptables-restore-translate を使う

iptables の設定ファイル (/etc/sysconfig/iptables, /etc/sysconfig/ip6tables) や
iptables-save の結果を用いて変換をします。

1.1. 設定を保存する

CentOS や RHEL で iptables を直接触っている場合は
/etc/sysconfig/iptables もしくは /etc/sysconfig/ip6tables に保存されていると思いますので
このステップはスキップ可能です。

そうでないばあいで iptables の設定を取り出す必要がある場合は
iptables-save コマンド等で取り出しておきます。

1.2. 変換する

下記のコマンドを使用して iptables の設定を nftables のコマンドに変換して流し込みます。

# iptables-restore-translate -f /etc/sysconfig/iptables   | nft -f - # IPv4
# ip6tables-restore-translate -f /etc/sysconfig/ip6tables | nft -f - # IPv6

1.3. 保存する

下記のコマンドを実行して保存します。

なお下記の保存先は RHEL, CentOS の場合の例です。
お使いのディストリビューションに合わせて適宜変更してください

# nft list ruleset > /etc/sysconfig/nftables.conf

以上で変換が完了します。

この方法で変換した場合、下記のような設定が流し込まれます。
(あくまでも一例です)

# /etc/sysconfig/iptables
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
COMMIT

# iptables-restore-translate -f /etc/sysconfig/iptables
add table ip filter
add chain ip filter INPUT { type filter hook input priority 0; policy drop; }
add chain ip filter FORWARD { type filter hook forward priority 0; policy drop; }
add chain ip filter OUTPUT { type filter hook output priority 0; policy accept; }
add rule ip filter INPUT iifname "lo" counter accept
add rule ip filter INPUT ip protocol tcp ct state related,established  counter accept
add rule ip filter INPUT tcp dport 80 counter accept

# nft list ruleset
table ip filter {
        chain INPUT {
                type filter hook input priority 0; policy drop;
                iifname "lo" counter packets 0 bytes 0 accept
                ip protocol tcp ct state established,related counter packets 0 bytes 0 accept
                tcp dport http counter packets 0 bytes 0 accept
        }

        chain FORWARD {
                type filter hook forward priority 0; policy drop;
        }

        chain OUTPUT {
                type filter hook output priority 0; policy accept;
        }
}

また試してみた範囲では、NAT の処理が上手く変換できないようで
失敗することがありました。

次に紹介する方法では、リスクが少しあるのですが
上手く変換できましたのでご紹介します。


2. iptables を有効にしたあと nft で設定を取り出す

今まで使用していた設定を iptables コマンド経由で有効にしたあと
nft コマンドを用いて現在の設定を nftables 形式で取り出す方法です。

この方法が使えるのは OS に入っている iptables コマンドが
nftables の互換レイヤを使っている場合に限られます。

互換レイヤを利用しているかどうかについては、 “iptables –version” コマンドを実行し
末尾に (nf_tables) が付いているかどうかで判断できます。

# CentOS 7 (iptables)
# iptables --version
iptables v1.4.21

# CentOS 8 (nftables)
# iptables --version
iptables v1.8.2 (nf_tables)

2.1. iptables コマンド経由で設定を有効にする

iptables-restore コマンドを利用して、既存の設定を読み込ませます。

# iptables-restore < /etc/sysconfig/iptables
# ip6tables-restore < /etc/sysconfig/ip6tables

2.2. nft コマンドを使って設定を読み出して保存する

下記のコマンドを実行して保存します。

なお下記の保存先は RHEL, CentOS の場合の例です。
お使いのディストリビューションに合わせて適宜変更してください

# nft list ruleset > /etc/sysconfig/nftables.conf

以上で変換が完了します。

この方法で変換した場合、下記のような設定が流し込まれます。
(あくまでも一例です)

# /etc/sysconfig/iptables
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
COMMIT

# nft list ruleset
table ip filter {
        chain INPUT {
                type filter hook input priority 0; policy drop;
                iifname "lo" counter packets 0 bytes 0 accept
                meta l4proto tcp ct state related,established counter packets 0 bytes 0 accept
                meta l4proto tcp tcp dport 80 counter packets 0 bytes 0 accept
        }

        chain FORWARD {
                type filter hook forward priority 0; policy drop;
        }

        chain OUTPUT {
                type filter hook output priority 0; policy accept;
        }
}

冒頭で書きましたように
iptables-restore-translate を使った場合のほうが綺麗なコードが生成されるようですので
基本的にはこのコマンドを使用して変換した方が良さそうです。

ただ、エラーが出る場合もありますので、
お互いの変換結果を見ながら、手で書き直すぐらいが一番良いのかも知れません(苦笑)


iptables のコマンドを nftables のコマンドに変換する

iptables コマンドの代わりに iptables-translate コマンドを用いる事で
変換結果を得られます。

# iptables-translate -A INPUT -p tcp --dport 80 -j ACCEPT
nft add rule ip filter INPUT tcp dport 80 counter accept

それではよい nftables ライフを!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です