RHEL 8でTCP Wrapperが廃止されたようで、RockyLinux9でも、廃止になっています。
いままでは、TCP Wrapperと共にFirewalldは利用していましたが、あまり理解せず、
ネット上情報を参考に設定していました。
今回、TCP Wrapperが使いえないとの事で、Firewalldを少し詳しく調べてみました。
ゾーン(ZONE)
ゾーンは、RedHat のドキュメントによると、
着信トラフィックをより透過的に管理する概念を表しています。
とあります。
なんか、よくわからないので、Google Bard に聞いてみました。
firewalld のゾーンとは、ファイアウォールのセキュリティポリシーを適用する範囲を定義するものです。
ゾーンは、インターフェイスやソースアドレスの範囲に割り当てることができます。
ゾーンを設定することで、同じ性質の通信をまとめて管理することができます。
例えば、インターネットからの通信をすべて許可する「public」ゾーンと、内部ネットワークからの通信のみ許可する「internal」ゾーンを作成すれば、インターフェイスごとにルールを設定する必要がなくなります。
雛形ゾーン
インストール時に、いくつかのゾーンが定義されています。
各ゾーンの内容は、こちらからに説明があります。
現在定義されている「ゾーン」は下記コマンドで確認できる。
# firewall-cmd --list-all-zones
アクティブゾーン
RockyLinux9 は、インストール直後は10個のゾーンが登録されていますが、
ゾーン名の横に(active)が付加されているのは、「public」だけです。
アクティブゾーンは「firewall-cmd –get-active-zones」で確認できます。
# firewall-cmd --get-active-zones
public
interfaces: eno1
firewalld では、アクセスルールが適応されるのは、「アクティブゾーン」だけです。
上記の例では、「public」のみとなります。
では、どうすれば「アクティブソーン」になるのか?
これは、「interfaces: 」か「sources:」が設定されると「active」になります。
ただし、どちらも、複数のゾーンに同じ設定はできません。
firewalldのデフォルト設定では、有線接続など、「Interface」がpublicゾーンも設定されています、
IPアドレスなどの「Source」はどのゾーンにも設定されていないので、
初期状態ではpublicゾーンのみがアクティブゾーンになっています。
target:
ゾーンの性質を決める、重要なパラメータです。
設定された、対象元をどうするのかが、決まります。
- default ⇒ 指定されたアクセス元と指定されたサービスのみ許可する。
- ACCEPT ⇒ 指定されたアクセス元に全てを許可する。
- DROP ⇒ 指定されたアクセス元は全て拒否し、何も返さない。
- REJECT ⇒ defaultと同等であるが、ICMP を返す。
interfaces:
ネットワークアダプタのシステム名
Source:
アクセス元のIPアドレス範囲です。
192.168.0.1 とか、192.168.0.1/24 のように指定します
services:
アクセス元に提供するサービスを定義します。
すでに用意されている、サービスはこちらから確認できます
# firewall-cmd --list-services
すごく沢山あります。
ポート番号など変更したい場合には、「 /usr/lib/firewalld/services/ 」のデフォルト設定ファイルを /etc/firewalld/services /」にコピーして編集します。
ports:
アクセス元に開放するポートを指令します。
定義は、firewall-cmd –add-port=[port-number]/[port-type] の形式になります
port-typeは、tcp
、udp
、sctp
、dccp
になります。
これは、firewalld で定義されていないサービスを許可する必要がある場合に便利です。
既存ゾーンで動作確認
定義済みのゾーンはこちらで確認できます。
# firewall-cmd --list-all-zones
ゾーンを編集し、動作を確認してみます。
public (active)
target: default
icmp-block-inversion: no
interfaces: eno1
sources:
services: cockpit dhcpv6-client ssh
ports:
・
・
この「public」ゾーンは「target: default」で、ネットワークアダプタ「eno1」に、
「cockpit」「dhcpv6-client」「ssh」サービスを許可します。
「services:」に指定がないサービスは許可されません。
ただしアクセス元の「sources:」IPアドレスには関係なく、「eno1」への要求元へサービス許可します。
trusted
target: ACCEPT
icmp-block-inversion: no
interfaces: 192.168.0.100
sources:
services:
ports:
・
・
この「trusted」ゾーンは「ACCEPT」で、アクセス元に「192.168.0.100」を定義してみました。
この場合「services:」には、なにも指定はありませんが、
「192.168.0.100」からは「ssh」が可能です。
「ACCEPT」では、「services:」の指定がなくても、可能になります。
drop (active)
target: DROP
icmp-block-inversion: no
interfaces:
sources: 172.16.0.100
services:
ports:
・
・
この「drop」ゾーンは「target: DROP」です。
例えば、「sources: 」に「172.16.0.100」を設定みます
「DROP」は指定された「sources: 172.16.0.100」からのアクセスを拒否します。
pingも拒否しますから、アクセス元からみると、起動状態も確認できません。
よく使うコマンド
アクティブゾーンの確認 firewall-cmd --get-active-zones 任意ゾーンの設定確認 firewall-cmd --list-all --zone=home すべてのゾーンの設定確認 firewall-cmd --list-all-zones 新しいゾーンの作成 firewall-cmd --new-zone=hogehoge --permanent ゾーンの削除 firewall-cmd --delete-zone=hogehoge --permanent ゾーンのターゲット変更 < default | ACCEPT | REJECT | DROP > firewall-cmd --set-target=ACCEPT --zone=hogehoge --permanent 許可IPアドレスの追加 firewall-cmd --add-source=192.168.0.0/24 --zone=public --permanent 許可IPアドレスの削除 firewall-cmd --remove-source=192.168.0.0/24 --zone=public --permanent 許可サービスの追加 firewall-cmd --add-service=ssh --zone=public --permanent 許可サービスの削除 firewall-cmd --remove-service=ssh --zone=public --permanent 許可ポート番号の追加 firewall-cmd --add-port=8080/tcp --zone=public --permanent 許可ポート番号の削除 firewall-cmd --remove-port=8080/tcp --zone=public --permanent 拒否IPアドレスの追加 firewall-cmd --add-source=172.16.0.100 --zone=drop --permanent 拒否IPアドレスの削除 firewall-cmd --remove-source=172.16.0.100 --zone=drop --permanent 設定変更後は設定の再読み込みで設定を反映 firewall-cmd --reload
管理ゾーン追加
デフォルトの「publicのゾーン」はインターフェイスに割り当てられているので、
個別のIPアドレス「sources:」で制限することができません。
ここでは管理用として新しいゾーン「admin」を作成して、
「ssh」サービスは接続元のIPアドレスで制限しようと思います。
まずは、今の「publicのゾーン」設定を確認してみます。
# firewall-cmd --list-all --zone=public
public (active)
target: default
icmp-block-inversion: no
interfaces: eno1
sources:
services: cockpit dhcpv6-client ssh
ports:
・
・
サービスとしては、「cockpit」「dhcpv6-client」「ssh」が設定されています。
インターフェイス全体に許可が掛かる設定になっているので、このサービスは、
どのIPアドレスからでもアクセスできるという設定になってしまいます。
「cockpit」と「ssh」は新規に作る管理ゾーンのみでIPアドレス制限しようと思います。
- まず、管理ゾーン「admin」を作成。
- 「target:」は「default」
- 「sources:」はLAN内の2か所「192.168.0.100」「192.168.0.101」
- 「adminゾーン」の「services:」に「dhcpv6-client」「cockpit」と「ssh」を追加
- 「publicのゾーン」からは「cockpit」と「ssh」を削除
- 再起動
- 設定の確認
このように設定してみたいと思います。
# firewall-cmd --new-zone=admin --permanent
# firewall-cmd --set-target=default --zone=admin --permanent
# firewall-cmd --add-source=192.168.0.100 --zone=admin --permanent
# firewall-cmd --add-source=192.168.0.101 --zone=admin --permanent
# firewall-cmd --add-service=dhcpv6-client --zone=admin --permanent
# firewall-cmd --add-service=cockpit --zone=admin --permanent
# firewall-cmd --add-service=ssh --zone=admin --permanent
# firewall-cmd --remove-service=cockpit --zone=public --permanent
# firewall-cmd --remove-service=ssh --zone=public --permanent
# firewall-cmd --reload
success
・
・
# firewall-cmd --list-all --zone=public
public (active)
target: default
icmp-block-inversion: no
interfaces: neo1
sources:
services: dhcpv6-client
ports:
・
・
# firewall-cmd --list-all --zone=admin
admin (active)
target: default
icmp-block-inversion: no
interfaces:
sources: 192.168.0.100 192.168.0.101
services: cockpit dhcpv6-client ssh
ports:
・
・
これで、「ssh」は、LAN内部の「192.168.0.100」と「192.168.0.101」からのみ、アクセス可能になりました。
「sources:」に、外部からのグローバルアドレスを追加すれば、外部からもアクセス可能となります。
ただし、外部から入ってくるには、入り口のルーターに「sshポート」への要求を、このサーバーへ転送する設定が必要になります。
コメント