CentOS 7.7.1908 firewalld default-zone の違いによる iptables のポリシー違い

CentOS 7.7.1908
firewalld default-zone の違いによる iptables のポリシー違いを調べてみました。

留意点　★ 部分

```
iptables-save
```

#1. defult-zone が public の場合

``` ruby:iptables-save
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [161:27475]
:FORWARD_IN_ZONES - [0:0]
:FORWARD_IN_ZONES_SOURCE - [0:0]
:FORWARD_OUT_ZONES - [0:0]
:FORWARD_OUT_ZONES_SOURCE - [0:0]
:FORWARD_direct - [0:0]
:FWDI_public - [0:0]
:FWDI_public_allow - [0:0]
:FWDI_public_deny - [0:0]
:FWDI_public_log - [0:0]
:FWDO_public - [0:0]
:FWDO_public_allow - [0:0]
:FWDO_public_deny - [0:0]
:FWDO_public_log - [0:0]
:INPUT_ZONES - [0:0]
:INPUT_ZONES_SOURCE - [0:0]
:INPUT_direct - [0:0]
:IN_public - [0:0]
:IN_public_allow - [0:0]
:IN_public_deny - [0:0]
:IN_public_log - [0:0]
:OUTPUT_direct - [0:0]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -j INPUT_direct
-A INPUT -j INPUT_ZONES_SOURCE
★-A INPUT -j INPUT_ZONES
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A FORWARD -j FORWARD_direct
-A FORWARD -j FORWARD_IN_ZONES_SOURCE
-A FORWARD -j FORWARD_IN_ZONES
-A FORWARD -j FORWARD_OUT_ZONES_SOURCE
-A FORWARD -j FORWARD_OUT_ZONES
-A FORWARD -m conntrack --ctstate INVALID -j DROP
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -j OUTPUT_direct
-A FORWARD_IN_ZONES -i enp0s3 -g FWDI_public
-A FORWARD_IN_ZONES -g FWDI_public
-A FORWARD_OUT_ZONES -o enp0s3 -g FWDO_public
-A FORWARD_OUT_ZONES -g FWDO_public
-A FWDI_public -j FWDI_public_log
-A FWDI_public -j FWDI_public_deny
-A FWDI_public -j FWDI_public_allow
-A FWDI_public -p icmp -j ACCEPT
-A FWDO_public -j FWDO_public_log
-A FWDO_public -j FWDO_public_deny
-A FWDO_public -j FWDO_public_allow
★-A INPUT_ZONES -i enp0s3 -g IN_public
★-A INPUT_ZONES -g IN_public
★-A IN_public -j IN_public_log
★-A IN_public -j IN_public_deny
★-A IN_public -j IN_public_allow
-A IN_public -p icmp -j ACCEPT
★-A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
COMMIT
# Completed on Sun Oct 27 16:41:01 2019
```

下記ポリシーにより チェイン INPUT は チェイン INPUT_ZONES を参照

```
★-A INPUT -j INPUT_ZONES
```

次に、チェイン INPUT_ZONES は下記のポリシーとなっていて、
インターフェイス enp0s3 からは チェイン IN_public を参照
さらに、enp0s3 以外のインタフェースについても、チェイン IN_public を参照となっている。

```
★-A INPUT_ZONES -i enp0s3 -g IN_public
★-A INPUT_ZONES -g IN_public
```

それでは チェイン IN_public はどうなっているかというと
チェイン IN_public_log, IN_public_deny, IN_public_allow を参照のこととなっている。

```
★-A IN_public -j IN_public_log
★-A IN_public -j IN_public_deny
★-A IN_public -j IN_public_allow
```

そして、デフォルトのポリシーでは、チェイン IN_public_log, IN_public_deny はなく、 IN_public_allow のみとなっている。

IN_public_allow では下記の定義となっていて、SSHを許可するポリシーとなっている。

```
★ -A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
```

実は firewall-cmd --add-service コマンドで外部からアクセスを許可するサービスを設定すると、IN_public_allow に設定されることになる。

```
firewall-cmd --add-service=https --zone=public 
```

```
-A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
-A IN_public_allow -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
```


#2. default-zone が private の場合


```
firewall-cmd --get-default-zone
> public
```

```
firewall-cmd --set-default-zone trusted
> success
```

```ruby:iptables-save
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [37:3004]
:FORWARD_IN_ZONES - [0:0]
:FORWARD_IN_ZONES_SOURCE - [0:0]
:FORWARD_OUT_ZONES - [0:0]
:FORWARD_OUT_ZONES_SOURCE - [0:0]
:FORWARD_direct - [0:0]
:FWDI_public - [0:0]
:FWDI_public_allow - [0:0]
:FWDI_public_deny - [0:0]
:FWDI_public_log - [0:0]
:FWDI_trusted - [0:0]
:FWDI_trusted_allow - [0:0]
:FWDI_trusted_deny - [0:0]
:FWDI_trusted_log - [0:0]
:FWDO_public - [0:0]
:FWDO_public_allow - [0:0]
:FWDO_public_deny - [0:0]
:FWDO_public_log - [0:0]
:FWDO_trusted - [0:0]
:FWDO_trusted_allow - [0:0]
:FWDO_trusted_deny - [0:0]
:FWDO_trusted_log - [0:0]
:INPUT_ZONES - [0:0]
:INPUT_ZONES_SOURCE - [0:0]
:INPUT_direct - [0:0]
:IN_public - [0:0]
:IN_public_allow - [0:0]
:IN_public_deny - [0:0]
:IN_public_log - [0:0]
:IN_trusted - [0:0]
:IN_trusted_allow - [0:0]
:IN_trusted_deny - [0:0]
:IN_trusted_log - [0:0]
:OUTPUT_direct - [0:0]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -j INPUT_direct
-A INPUT -j INPUT_ZONES_SOURCE
★ -A INPUT -j INPUT_ZONES
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A FORWARD -j FORWARD_direct
-A FORWARD -j FORWARD_IN_ZONES_SOURCE
-A FORWARD -j FORWARD_IN_ZONES
-A FORWARD -j FORWARD_OUT_ZONES_SOURCE
-A FORWARD -j FORWARD_OUT_ZONES
-A FORWARD -m conntrack --ctstate INVALID -j DROP
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -j OUTPUT_direct
-A FORWARD_IN_ZONES -i enp0s3 -j FWDI_trusted
-A FORWARD_IN_ZONES -j FWDI_trusted
-A FORWARD_OUT_ZONES -o enp0s3 -j FWDO_trusted
-A FORWARD_OUT_ZONES -j FWDO_trusted
-A FWDI_public -j FWDI_public_log
-A FWDI_public -j FWDI_public_deny
-A FWDI_public -j FWDI_public_allow
-A FWDI_public -p icmp -j ACCEPT
-A FWDI_trusted -j FWDI_trusted_log
-A FWDI_trusted -j FWDI_trusted_deny
-A FWDI_trusted -j FWDI_trusted_allow
-A FWDI_trusted -j ACCEPT
-A FWDO_public -j FWDO_public_log
-A FWDO_public -j FWDO_public_deny
-A FWDO_public -j FWDO_public_allow
-A FWDO_trusted -j FWDO_trusted_log
-A FWDO_trusted -j FWDO_trusted_deny
-A FWDO_trusted -j FWDO_trusted_allow
-A FWDO_trusted -j ACCEPT
★ -A INPUT_ZONES -i enp0s3 -j IN_trusted
★ -A INPUT_ZONES -j IN_trusted
-A IN_public -j IN_public_log
-A IN_public -j IN_public_deny
-A IN_public -j IN_public_allow
-A IN_public -p icmp -j ACCEPT
-A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
★ -A IN_trusted -j IN_trusted_log
★ -A IN_trusted -j IN_trusted_deny
★ -A IN_trusted -j IN_trusted_allow
★ -A IN_trusted -j ACCEPT
COMMIT
```

firewall-cmd で default-zone を public から trusted に変更すると、iptables のポリシーが上記のとおりに変更される。

```
★ -A INPUT -j INPUT_ZONES
★ -A INPUT_ZONES -i enp0s3 -j IN_trusted
★ -A INPUT_ZONES -j IN_trusted
★ -A IN_trusted -j IN_trusted_log
★ -A IN_trusted -j IN_trusted_deny
★ -A IN_trusted -j IN_trusted_allow
★ -A IN_trusted -j ACCEPT
```

INPUT チェーンは INPUT_ZONES チェーンを参照という点は default zone が public のときと変わらない。
しかし、INPUT_ZONES チェーンの内容が変更されている。
INPUT_ZONEチェーンは enp0s3 インターフェイスからのInboundへの通信については IN_trustedチェーンを参照する。
また、enp0s3 インターフェイス以外からのInboundへの通信についてもIN_trustedチェーンを参照する。
default zone が public のときは、INPUT_ZONES チェーンは IN_public チェーンを参照する設定となっていたが、trusted に変更した場合は INPUT_ZONES チェーンは IN_trusted チェーンを参照せよとなったのだ。

続きを見てみよう。
IN_trusted チェーンは3つのチェーンと1つのターゲットを参照する。チェーンとしては、IN_trusted_log, IN_trusted_deny, In_trusted_allow チェーンだが、これらのチェーンの定義はない。最後に ACCEPT のターゲットが入っていることで、結局はすべての通信が許可となる。


この記事の背景は、そもそも firewalld と iptables ってどこが違うの？ってことを考えていて、ポリシーの設定のしやすさ、敷居の低さということが言われていて、それはわかるけれども iptables と firewalld とはどういう連携をしているのかわからないということでさらに調べていました。