RHEL 7でfirewall-cmd
を使用して、iptables(NAT)のPREROUTINGチェーンに新しいルールを追加しようとしています。
$ firewall-cmd --permanent --direct --add-rule ipv4 nat PREROUTING 0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8161
次に、$ iptables -t nat -L
を介してiptablesをチェックします。
...
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
PREROUTING_direct all -- anywhere anywhere
PREROUTING_ZONES_SOURCE all -- anywhere anywhere
PREROUTING_ZONES all -- anywhere anywhere
...
Chain PREROUTING_direct (1 references)
target prot opt source destination
REDIRECT tcp -- anywhere anywhere tcp dpt:http redir ports 8161
...
ただし、同等のiptablesコマンドを次のように実行すると、次のようになります。
...
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
PREROUTING_direct all -- anywhere anywhere
PREROUTING_ZONES_SOURCE all -- anywhere anywhere
PREROUTING_ZONES all -- anywhere anywhere
REDIRECT tcp -- anywhere anywhere tcp dpt:http redir ports 8161
...
Chain PREROUTING_direct (1 references)
target prot opt source destination
REDIRECT tcp -- anywhere anywhere tcp dpt:http redir ports 8161
Chain PREROUTING
でこの追加のルールを取得します。これにより、ファイアウォールが無効になっている場合でも事前ルーティングが機能します(つまり、ファイアウォールデーモンを無効にしてiptables
コマンドを実行します)。
したがって、私の質問は2つあります。
iptables
コマンドとまったく同じfirewall-cmd
コマンドはありますか?firewall-cmd
を介して永続的に追加され、ファイアウォールデーモンが無効になった後もそこにとどまることができますか?firewall-cmd
を--direct
オプションとともに使用しています。これは、iptablesコマンドを受け入れることを意味します。したがって、iptables -t nat
で同じオプションを使用して、1つの例外を除いて同じ効果を得ることができます。この方法でfirewall-cmd
を使用すると、NATルールがPREROUTING_direct
チェーンに追加され、iptables
を直接使用してPREROUTING
チェーンにルールが追加されます。
iptables -t nat -L
の出力で、ルールを2回追加しました。各チェーンに1回です。
問題の2番目の部分については、firewalldサービスは停止時にすべての定義されたチェーンを削除します。そのため、PREROUTING_direct
に追加されたルールは使用できなくなります。短い答えはいいえです。
チェーンのPREROUTINGでこの追加のルールを取得すると、ファイアウォールが無効になっている場合でも、事前ルーティングが機能するようになります。
ですから、それが本当かどうかは完全にはわかりません。
Firewalldを停止したときにPREROUTINGが機能しなくなった場合(そしてなぜそうするのかわかりません)、firewalldがポリシー全体を削除しているためだと思います(例:iptables -F
/iptables -X
)。その場合、同じルールの別のバージョンを手動で追加したという事実はほとんど違いがありません。 iptables -F
でも削除されます。
(最初の)コマンドは、firewalldを停止しない限り、必要に応じて永続的な事前ルーティングルールを提供する必要があります。私はそれで十分だと思う傾向がありますが、私はあなたのニーズについて何かを見逃している可能性があります。
明確にするために:PREROUTING_DIRECTチェーンとPREROUTINGチェーンの事前ルーティングルールの間に実用的な違いはありません。どちらのアプローチも同じように機能し、同じ効果があり、ファイアウォールポリシーに他の変更がない場合は、必要なことを実行する必要があります。
唯一の違いは、firewalldが基本的に舞台裏で小さな管理を行っており、actualルールを、システム定義のもの。
tl; dr:firewalldを実行し続け、そのコマンドを使用してルールを作成および管理します。 Firewall-cmdコマンドと 'raw' iptablesコマンドの視覚効果はわずかに異なりますが、ネットワークトラフィックには同じ効果があります。