takashi kono's blog

コーヒーとキーボードと共に何かを記録していくブログ

Rocky Linux 8 で マルチゾーンファイヤウォール 設定してみる練習

マルチゾーンファイヤウォール設定をやってみたかった

環境

Rocky Linux 8

network

nic 1
con-mgmt-enp0s3
192.168.100.111/24
192.168.100.254 (GW)
8.8.8.8 (DNS)
ssh

nic 2
con-radius-enp0s8
natnetwork1
10.0.2.0/24
10.0.2.1
GW なし
DNS なし
radius

nic 3
con-mysql-enp0s9
natnetwork2
10.0.3.0/24
10.0.3.1
GW なし
DNS なし
mysql

hostname fwtest01.tk.net

ネットワーク部分ちゃんと書く

con name ip zone name service
con-mgmt-enp0s3 192.168.100.111/24 management ssh
con-radius-enp0s8 10.0.2.1/24 radius radius
con-mysql-enp0s9 10.0.3.1/24 mysql mysql

ゾーンの役割は、「名は体を表す」を地で行くことにする。

management zone だが、これは source ip (踏み台など) も指定するのが実際の使い方だと思うが出来るのだろうか
今度でやってみる(宿題)

まとめ

zone を増やす

sudo firewall-cmd --new-zone=<NEW ZONE NAME> --permanent
sudo firewall-cmd --reload

zone を active zone にする

interface を zone に割り当てることで active になる

sudo firewall-cmd --zone=<ZONE NAME> --change-interface=<INTERFACE DEVICE NAME>
sudo firewall-cmd --reload

zone name を変更する

見つからなかった
新しく作って、設定を行い、 change-interface で active にして削除

zone を削除する

sudo firewall-cmd --permanent --delete-zone=<ZONE NAME>
sudo firewall-cmd --reload

--permanent--delete-zone= より前にないと駄目

default zone を変更する

sudo firewall-cmd --set-default-zone=<ZONE NAME>
sudo firewall-cmd --runtime-to-permanent

もしかしたら、 --reload でも default zone の変更が出来るかもしれない

$ man -P cat firewall-cmd | grep -A 10 'set-default-zone'
       --set-default-zone=zone
           Set default zone for connections and interfaces where no zone has
           been selected. Setting the default zone changes the zone for the
           connections or interfaces, that are using the default zone.

           This is a runtime and permanent change.

       --get-active-zones
...
$

とあるので、 runtime-to-permanent の方が良いのかも

参考

qiita.com

qiita.com


いろいろ試す

ここから試していくよ

とりあえず、現状を確認する

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3 enp0s8 enp0s9
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
[op-kouno@fwtest01 ~]$
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --get-zones
block dmz drop external home internal nm-shared public trusted work
[op-kouno@fwtest01 ~]$
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --get-active-zones
public
  interfaces: enp0s3 enp0s8 enp0s9
[op-kouno@fwtest01 ~]$

cockpit, dhcpv6-client いらないので外すいつもの儀式

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --remove-service=cockpit --permanent
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --remove-service=dhcpv6-client --permanent
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --reload
success
[op-kouno@fwtest01 ~]$
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3 enp0s8 enp0s9
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
[op-kouno@fwtest01 ~]$

とりあえず、ゾーンを3つ作る

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --help | grep new-zone
  --new-zone=<zone>    Add a new zone [P only]
  --new-zone-from-file=<filename> [--name=<zone>]
[op-kouno@fwtest01 ~]$

ファイルからも zone を作れるっぽい
定義ファイルを作って流し込めるってことか?

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --new-zone=management
usage: see firewall-cmd man page
Option can be used only with --permanent.
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --permanent --new-zone=mamagement
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --permanent --new-zone=radius
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --permanent --new-zone=mysql
success
[op-kouno@fwtest01 ~]$
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --get-zones
block dmz drop external home internal nm-shared public trusted work
[op-kouno@fwtest01 ~]$

む?ない??? あー、 reload してないからかな?

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --reload
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --get-zones
block dmz drop external home internal mamagement mysql nm-shared public radius trusted work
[op-kouno@fwtest01 ~]$

できた あと、エラーメッセージでも分かるように、 --new-zone するときは、そのオプションよりも手前に --permanent が必須だと分かった

management ゾーンを作る

reload の前に必ずコンソールから入ったほうが良さそう
ssh 自動では切れないだろうから、firewall reload 後、別 terminal で ssh 接続できることを確認の上、切断するのが良さそう
やってみよう

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=management --add-service=ssh --permanent
Error: INVALID_ZONE: management
[op-kouno@fwtest01 ~]$

無効だと?

一度全部見てみる

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --list-all-zones
block
  target: %%REJECT%%
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

dmz
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

drop
  target: DROP
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

external
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: yes
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

home
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: cockpit dhcpv6-client mdns samba-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

internal
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: cockpit dhcpv6-client mdns samba-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

mamagement
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

mysql
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

nm-shared
  target: ACCEPT
  icmp-block-inversion: no
  interfaces:
  sources:
  services: dhcp dns ssh
  ports:
  protocols: icmp ipv6-icmp
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
        rule priority="32767" reject

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3 enp0s8 enp0s9
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

radius
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

trusted
  target: ACCEPT
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

work
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

[op-kouno@fwtest01 ~]$

あるよな。

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --get-active-zones
public
  interfaces: enp0s9 enp0s8 enp0s3
[op-kouno@fwtest01 ~]$

もしかして、 active zone に追加しないと、ずっと INVALID(無効) ???
手詰まり感ある

radius ゾーンに add-service する

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --permanent --zone=radius --add-service=radius
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --reload
success
[op-kouno@fwtest01 ~]$
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=radius --list-all
radius
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: radius
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
[op-kouno@fwtest01 ~]$

すんなり出来たな
適応を外す必要があるのか?
1つのインターフェースは複数の zone にまたがれるのか?

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=public --list-interfaces
enp0s9 enp0s8 enp0s3
[op-kouno@fwtest01 ~]$
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=radius --list-interfaces

[op-kouno@fwtest01 ~]$
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=radius --add-interface=enp0s8
Error: ZONE_CONFLICT: 'enp0s8' already bound to a zone
[op-kouno@fwtest01 ~]$

またげない

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=public --remove-interface=enp0s8 --permanent
The interface is under control of NetworkManager and already bound to the default zone
The interface is under control of NetworkManager, setting zone to default.
success
[op-kouno@fwtest01 ~]$

?? interface down させればいいのか?

[op-kouno@fwtest01 ~]$ sudo nmcli c down con-radius-enp0s8
接続 'con-radius-enp0s8' が正常に非アクティブ化されました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/2)
[op-kouno@fwtest01 ~]$
[op-kouno@fwtest01 ~]$ sudo nmcli c show
NAME               UUID                                  TYPE      DEVICE
con-mgmt-enp0s3    01d43bc4-7c24-4f1f-9f7b-ae849316a31e  ethernet  enp0s3
con-mysql-enp0s9   ee8e4547-9a6e-4af0-845e-764bde401522  ethernet  enp0s9
con-radius-enp0s8  70b8a7a0-3524-41ed-8b46-075e479d3213  ethernet  --
[op-kouno@fwtest01 ~]$


[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=public --remove-interface=enp0s8 --permanent
Warning: NOT_ENABLED: enp0s8
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --reload
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=public --list-interfaces
enp0s9 enp0s3
[op-kouno@fwtest01 ~]$

できた。 if down する必要があった
これ、本番環境でやるには、down が発生するってことだろう?
きちんと設定を終えてから可動させなきゃ駄目ってこと

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=radius --list-interfaces

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=radius --add-interface=enp0s8 --permanent
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --reload
success
[op-kouno@fwtest01 ~]$
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=radius --list-interfaces
enp0s8
[op-kouno@fwtest01 ~]$
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=radius --list-all
radius (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s8
  sources:
  services: radius
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
[op-kouno@fwtest01 ~]$

なるほど。できた
最後に、 if up

[op-kouno@fwtest01 ~]$ sudo nmcli c show
NAME               UUID                                  TYPE      DEVICE
con-mgmt-enp0s3    01d43bc4-7c24-4f1f-9f7b-ae849316a31e  ethernet  enp0s3
con-mysql-enp0s9   ee8e4547-9a6e-4af0-845e-764bde401522  ethernet  enp0s9
con-radius-enp0s8  70b8a7a0-3524-41ed-8b46-075e479d3213  ethernet  --
[op-kouno@fwtest01 ~]$
[op-kouno@fwtest01 ~]$ sudo nmcli c up con-radius-enp0s8
接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/4)
[op-kouno@fwtest01 ~]$ sudo nmcli c show
NAME               UUID                                  TYPE      DEVICE
con-mgmt-enp0s3    01d43bc4-7c24-4f1f-9f7b-ae849316a31e  ethernet  enp0s3
con-mysql-enp0s9   ee8e4547-9a6e-4af0-845e-764bde401522  ethernet  enp0s9
con-radius-enp0s8  70b8a7a0-3524-41ed-8b46-075e479d3213  ethernet  enp0s8
[op-kouno@fwtest01 ~]$

zone=management に ssh を追加する

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=mamagement --list-all
mamagement
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
[op-kouno@fwtest01 ~]$
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=mamagement --add-service=ssh --permanent
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --reload
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=mamagement --list-all
mamagement
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
[op-kouno@fwtest01 ~]$

?? なんで出来た ??

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --get-active-zones
public
  interfaces: enp0s8 enp0s9 enp0s3
[op-kouno@fwtest01 ~]$

???

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=radius --list-all
radius
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: radius
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
[op-kouno@fwtest01 ~]$

もどっている

change-interface をしてみる

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --get-active-zones
public
  interfaces: enp0s8 enp0s9 enp0s3
[op-kouno@fwtest01 ~]$
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=radius --change-interface=enp0s8 --permanent
The interface is under control of NetworkManager, setting zone to 'radius'.
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --reload
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --get-active-zones
public
  interfaces: enp0s9 enp0s3
radius
  interfaces: enp0s8
[op-kouno@fwtest01 ~]$

active zone が増えた。インターフェースが移った。しかも、 if down なし
こうやるのか

ref

qiita.com

引き続き、 change-interface

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=mysql --change-interface=enp0s9 --permanent
The interface is under control of NetworkManager, setting zone to 'mysql'.
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --reload
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --get-active-zones
mysql
  interfaces: enp0s9
public
  interfaces: enp0s3
radius
  interfaces: enp0s8
[op-kouno@fwtest01 ~]$
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=mamagement --change-interface=enp0s3 --permanent
The interface is under control of NetworkManager, setting zone to 'mamagement'.
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --reload
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --get-active-zones
mamagement
  interfaces: enp0s3
mysql
  interfaces: enp0s9
radius
  interfaces: enp0s8
[op-kouno@fwtest01 ~]$

zone name change

typo していることに気づかなかった
新しく作って、設定を移行して、消すしかないっぽい

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --permanent --new-zone=management
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --get-zones
block dmz drop external home internal mamagement mysql nm-shared public radius trusted work
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --reload
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --get-zones
block dmz drop external home internal mamagement management mysql nm-shared public radius trusted work
[op-kouno@fwtest01 ~]$

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=mamagement --list-all
mamagement (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3 management
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=management --list-all
management
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
[op-kouno@fwtest01 ~]$
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=management --change-interface=enp0s3 --permanent
The interface is under control of NetworkManager, setting zone to 'management'.
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=management --add-service=ssh --permanent
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --reload
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=management --list-all
management (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
[op-kouno@fwtest01 ~]$

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --permanent --delete-zone=mamagement
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --reload
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --get-zones
block dmz drop external home internal management mysql nm-shared public radius trusted work
[op-kouno@fwtest01 ~]$

rich rule とかあると面倒かも
名前は先に確認しよう
あと、短い名前にしよう(多分間違えにくい)

default zone change

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --set-default-zone=management --permanent
usage: see firewall-cmd man page
Can't use stand-alone options with other options.
[op-kouno@fwtest01 ~]$

ふむ

[op-kouno@fwtest01 ~]$ man -P cat firewall-cmd | grep -A 10  "set-default-zone"
       --set-default-zone=zone
           Set default zone for connections and interfaces where no zone has
           been selected. Setting the default zone changes the zone for the
           connections or interfaces, that are using the default zone.

           This is a runtime and permanent change.

       --get-active-zones
           Print currently active zones altogether with interfaces and sources
           used in these zones. Active zones are zones, that have a binding to
           an interface or source. The output format is:
[op-kouno@fwtest01 ~]$

うーん?

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --set-default-zone=management
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --runtime-to-permanent
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --get-default-zone
management
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --reload
success
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --get-default-zone
management
[op-kouno@fwtest01 ~]$

できた

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --zone=management --list-all
management (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
[op-kouno@fwtest01 ~]$
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --list-all
management (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
[op-kouno@fwtest01 ~]$

list-all だけで確認できる。なるほど

今どうなっているか

[op-kouno@fwtest01 ~]$ sudo firewall-cmd --get-active-zones
management
  interfaces: enp0s3
mysql
  interfaces: enp0s9
radius
  interfaces: enp0s8
[op-kouno@fwtest01 ~]$
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --get-default-zone
management
[op-kouno@fwtest01 ~]$
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --list-all
management (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
[op-kouno@fwtest01 ~]$
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --list-all --zone=radius
radius (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s8
  sources:
  services: radius
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
[op-kouno@fwtest01 ~]$
[op-kouno@fwtest01 ~]$ sudo firewall-cmd --list-all --zone=mysql
mysql (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s9
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
[op-kouno@fwtest01 ~]$