firewalld でインタフェースやソースアドレスに基づいて特定のゾーンに入ったパケットが、そのゾーンに設定されているサービスやポートにマッチしなかったときのデフォルトの動作は、ゾーンの target
で指定します。
指定します、と言っても定義済のゾーンでは次のように定義されています。これを変更することはあまりないと思います。
zone | target |
---|---|
drop |
DROP |
trusted |
ACCEPT |
block |
%%REJECT%% |
他のゾーン | default |
ACCEPT
はパケットを許可、DROP
はパケットをドロップします。
%%REJECT%%
(以下 REJECT
と記述します)と default
は、どちらも ICMP destination unreachable かなにかで拒否を応答しますが、以下の記述だけを見ると REJECT
と default
に違いは無いように思えます。
The %%REJECT%% target is used in block zone to reject (with default firewalld reject type) every packet not matching any rule.
がしかし、実際には下記の issue で説明されているような違いがあります。
要約すると、
default
は icmp が通るREJECT
は icmp は明示的に通さない限り通らない
- A -> B な forward で A のゾーンが
default
なら B のゾーンも適用される- A のゾーンが
REJECT
なら B は適用されずに Reject される
- A のゾーンが
- (
AllowZoneDrifting
が有効なら)ソースアドレスベースのゾーンでdefault
になれば、インタフェースベースのゾーンも続けて適用される- ソースベースのゾーンで
REJECT
になれが、インタフェースベースのゾーンは適用されずに Reject される
- ソースベースのゾーンで
最後の AllowZoneDrifting
について、以下によると元々はこれがデフォの動きだったのですが、
0.6.5/0.7.0/0.8.0 でこれはバグ扱いで無効になりました。ゾーンベースの FW ではパケットが複数のゾーンを通るべきではないためらしいです。その後、0.7.4/0.8.2/1.0.0 で AllowZoneDrifting
でオプショナルな機能になりました(デフォは無効)。