Vyatta(VyOS)で、Zone Based Firewallを設定する方法をまとめます。Zoneを定義する事によって複数のインターフェースをまとめたりZoneからZoneへの通信ルールを定義したり、設定の管理が容易になります。単純なFirewallと実装可能な事は変わりませんが、管理負荷を下げる目的で使用されます。ほとんどのファイアウォール製品やルータで備わっている機能です。
設定まとめ
以下のようなコマンドでファイアウォールルールのデフォルト挙動を定義できます。drop, rejectならばホワイトリスト形式の運用で、acceptならばブラックリスト形式の運用になります。
set firewall name <ルール名> default-action {accept|reject|drop}
以下のようなコマンドで、どのインターフェースがどのゾーンに属すかを定義します。
set zone-policy zone <ゾーン名> dmz interface <インターフェース名>
各ゾーンへパケットが入った時のデフォルトの挙動を指定します。指定可能なのはrejectかdropのみで、acceptは指定できません(省略時はdropになる)。
set zone-policy zone <ゾーン名> default-action {reject|drop}
ゾーンからゾーンへパケットが転送されるときに、どのようなファイアウォールルールを適用するかを指定します。
set zone-policy zone <ゾーン名> from <ゾーン名> firewall name <ファイアウォールルール名>
動作確認
動作確認の構成
以下の環境で動作確認を行います。社内端末向けの環境を想定し、クライアント端末からプロキシサーバ(squid)を経由してWeb(apache)へ通信する要件を想定します。
+-----------------------+ | host010 | | apache (tcp80) | +-----------+-----------+ ens224 | .10 | | 192.168.10.0/24 | (擬似untrusted) | eth0 | .1 +-----------+-----------+ +-----------------------+ | vy001 | | host020 | | +-----------------| squid (tcp3128) | +-----------+-----------+ 192.168.20.0/24 +-----------------------+ eth1 | .1 (擬似DNZ) | | 192.168.30.0/24 | (擬似trusted) ens224 | .20 +-----------+-----------+ | host030 | | (client) | +-----------------------+
初期設定
初期設定はIPアドレスのみとします。
動作確認 Zone Based Firewallの設定
Zoneの定義
どのインターフェースがどのゾーンに属するかを定義します。
[vy001:VyOS1.4] set zone-policy zone untrust default-action 'reject' set zone-policy zone untrust interface 'eth0' set zone-policy zone dmz default-action 'reject' set zone-policy zone dmz interface 'eth1' set zone-policy zone trust default-action 'reject' set zone-policy zone trust interface 'eth2'
ファイアウォールルールの定義
trustからdmzへのプロキシサーバ(tcp3128)の疎通を許可するルールを作成します。
[vy001:VyOS1.4] set firewall name trust-dmz default-action 'reject' set firewall name trust-dmz rule 10 action 'accept' set firewall name trust-dmz rule 10 destination port '3128' set firewall name trust-dmz rule 10 log 'enable' set firewall name trust-dmz rule 10 protocol 'tcp'
dmzからuntrustへのWebサーバ(tcp80)の疎通を許可するルールを作成します。
[vy001:VyOS1.4] set firewall name dmz-untrust default-action 'reject' set firewall name dmz-untrust rule 10 action 'accept' set firewall name dmz-untrust rule 10 destination port '80' set firewall name dmz-untrust rule 10 log 'enable' set firewall name dmz-untrust rule 10 protocol 'tcp'
Vyatta(VyOS)は戻り方向の通信を自動的に許可しないstateless firewallです。戻り方向を明示的に許可するルールを作成します。
[vy001:VyOS1.4] set firewall name permit_return default-action 'reject' set firewall name permit_return rule 10 action 'accept' set firewall name permit_return rule 10 log 'enable' set firewall name permit_return rule 10 protocol 'tcp' set firewall name permit_return rule 10 state established 'enable'[/code]
ファイアウォールルールの適用
ゾーン間に対してファイアウォールルールを適用します。
[vy001:VyOS1.4] set zone-policy zone dmz from trust firewall name 'trust-dmz' set zone-policy zone dmz from untrust firewall name 'permit_return' set zone-policy zone untrust from dmz firewall name 'dmz-untrust' set zone-policy zone trust from dmz firewall name 'permit_return'
疎通確認
host030からプロキシサーバ(host020)を経由してWebサーバ(host010)へ疎通可能である事を確認します。
[host030:RockyLinux8.4] [root@host030 ~]# export http_proxy=http://192.168.20.20:3128/ [root@host030 ~]# curl -I http://192.168.10.10/ HTTP/1.1 200 OK Last-Modified: Tue, 28 Aug 2021 07:59:45 GMT Accept-Ranges: bytes Content-Length: 3 Content-Type: text/html; charset=UTF-8 Date: Tue, 28 Aug 2021 10:27:06 GMT Server: Apache/2.4.37 (rocky) ETag: "3-5cad655385366" Age: 510 X-Cache: HIT from host020.gokatei.go X-Cache-Lookup: HIT from host020.gokatei.go:3128 Via: 1.1 host020.gokatei.go (squid/4.11) Connection: keep-alive [root@host030 ~]#
想定通りのファイアウォールログが出力されている事を確認します。
[vy001:VyOS1.4] vyos@vy001:~$ tail -f /var/log/messages | grep '] IN' Aug 28 19:35:36 vy001 kernel: [ 3843.223030] [trust-dmz-10-A] IN=eth2 OUT=eth1 MAC=00:50:56:90:51:28:00:50:56:90:09:cc:08:00 SRC=192.168.30.30 DST=192.168.20.20 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=48532 DF PROTO=TCP SPT=33522 DPT=3128 WINDOW=29200 RES=0x00 SYN URGP=0 Aug 28 19:35:36 vy001 kernel: [ 3843.223591] [permit_return-10-A] IN=eth1 OUT=eth2 MAC=00:50:56:8e:3a:92:00:50:56:90:85:c3:08:00 SRC=192.168.20.20 DST=192.168.30.30 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=TCP SPT=3128 DPT=33522 WINDOW=28960 RES=0x00 ACK SYN URGP=0 Aug 28 19:35:36 vy001 kernel: [ 3843.223873] [trust-dmz-10-A] IN=eth2 OUT=eth1 MAC=00:50:56:90:51:28:00:50:56:90:09:cc:08:00 SRC=192.168.30.30 DST=192.168.20.20 LEN=52 TOS=0x00 PREC=0x00 TTL=63 ID=48533 DF PROTO=TCP SPT=33522 DPT=3128 WINDOW=229 RES=0x00 ACK URGP=0 Aug 28 19:35:36 vy001 kernel: [ 3843.224027] [trust-dmz-10-A] IN=eth2 OUT=eth1 MAC=00:50:56:90:51:28:00:50:56:90:09:cc:08:00 SRC=192.168.30.30 DST=192.168.20.20 LEN=180 TOS=0x00 PREC=0x00 TTL=63 ID=48534 DF PROTO=TCP SPT=33522 DPT=3128 WINDOW=229 RES=0x00 ACK PSH URGP=0 Aug 28 19:35:36 vy001 kernel: [ 3843.224240] [permit_return-10-A] IN=eth1 OUT=eth2 MAC=00:50:56:8e:3a:92:00:50:56:90:85:c3:08:00 SRC=192.168.20.20 DST=192.168.30.30 LEN=52 TOS=0x00 PREC=0x00 TTL=63 ID=31642 DF PROTO=TCP SPT=3128 DPT=33522 WINDOW=235 RES=0x00 ACK URGP=0 Aug 28 19:35:36 vy001 kernel: [ 3843.225085] [permit_return-10-A] IN=eth1 OUT=eth2 MAC=00:50:56:8e:3a:92:00:50:56:90:85:c3:08:00 SRC=192.168.20.20 DST=192.168.30.30 LEN=455 TOS=0x00 PREC=0x00 TTL=63 ID=31643 DF PROTO=TCP SPT=3128 DPT=33522 WINDOW=235 RES=0x00 ACK PSH URGP=0 Aug 28 19:35:36 vy001 kernel: [ 3843.225232] [trust-dmz-10-A] IN=eth2 OUT=eth1 MAC=00:50:56:90:51:28:00:50:56:90:09:cc:08:00 SRC=192.168.30.30 DST=192.168.20.20 LEN=52 TOS=0x00 PREC=0x00 TTL=63 ID=48535 DF PROTO=TCP SPT=33522 DPT=3128 WINDOW=237 RES=0x00 ACK URGP=0 Aug 28 19:35:36 vy001 kernel: [ 3843.225495] [trust-dmz-10-A] IN=eth2 OUT=eth1 MAC=00:50:56:90:51:28:00:50:56:90:09:cc:08:00 SRC=192.168.30.30 DST=192.168.20.20 LEN=52 TOS=0x00 PREC=0x00 TTL=63 ID=48536 DF PROTO=TCP SPT=33522 DPT=3128 WINDOW=237 RES=0x00 ACK FIN URGP=0 Aug 28 19:35:36 vy001 kernel: [ 3843.225863] [permit_return-10-A] IN=eth1 OUT=eth2 MAC=00:50:56:8e:3a:92:00:50:56:90:85:c3:08:00 SRC=192.168.20.20 DST=192.168.30.30 LEN=52 TOS=0x00 PREC=0x00 TTL=63 ID=31644 DF PROTO=TCP SPT=3128 DPT=33522 WINDOW=235 RES=0x00 ACK FIN URGP=0 Aug 28 19:35:36 vy001 kernel: [ 3843.226053] [trust-dmz-10-A] IN=eth2 OUT=eth1 MAC=00:50:56:90:51:28:00:50:56:90:09:cc:08:00 SRC=192.168.30.30 DST=192.168.20.20 LEN=52 TOS=0x00 PREC=0x00 TTL=63 ID=48537 DF PROTO=TCP SPT=33522 DPT=3128 WINDOW=237 RES=0x00 ACK URGP=0