作業環境
- Red Hat Enterprise Linux 7.3
Red Hat における Firewall サービスについて
Red Hat Enterprise Linux においてファイアウォール機能を提供しているサービスは firewalld
です。
firewalld のインストール
yum -y install firewalld
firewalld サービスの起動と有効化
sytemctl start firewalld
sytemctl enable firewalld
設定の確認
以下コマンドで firewalld の設定を確認できます。
firewall-cmd --list-all
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
表示されているサービス、ポート等のみ通信が許可されます。
ゾーンについて
- firewalld ではゾーンという概念がある
- ゾーンとは、どの通信を許可するのかということの定義のこと
- 複数のゾーンを作成することができる
- ゾーンに対してインターフェースを対応付けることで、そのインターフェースに適用するファイアウォール設定を決定する
- デフォルトでは
public
ゾーンに全てのインターフェースが対応付けられている - public ゾーンのデフォルト設定は前項のコマンド出力例の通り
interfaces: ens33
という内容から、インターフェース ens33 が public ゾーンに対応付けられていることがわかる
ゾーンのサービス許可設定
- サービス許可設定では、あらかじめ定義されたサービスを指定します
- デフォルトで定義されているサービスがあるため基本的にはそれを使用します
- サービスの定義は xml ファイルとして作成されています
- 格納場所は
/usr/lib/firewalld/services/
- 格納場所は
サービスの定義について
サービスの定義の中身は、プロトコル(TCP、UDP など)とポート番号の組み合わせのリストになっています。/usr/lib/firewalld/services/
内のファイルを確認することでサービスの定義を確認できます。
# cat ssh.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="22"/>
許可サービスの追加
firewall-cmd --zone=ゾーン名 --add-service=サービス名 [--permanent]
--permanent
オプションを付けると次の意味になる- サービス再起動後も設定変更を維持する
- 設定変更は即時反映されず、反映のためには
firewall-cmd --reload
コマンドを実行する必要がある
--permanent
オプションを付けない場合は次の意味になる- 設定変更は即時反映される
- サービス再起動後は設定が元に戻る
例:public ゾーンについて telnet サービスを許可する場合
# firewall-cmd --zone=public --add-service=telnet --permanent
success
許可サービスの削除
firewall-cmd --zone=ゾーン名 --remove-service=サービス名 [--permanent]
--permanent
オプションの意味はサービス追加時と同様
例:public ゾーンについて telnet サービスを削除する場合
# firewall-cmd --zone=public --remove-service=telnet --permanent
success
ゾーンのポート許可設定
許可ポートの追加
firewall-cmd --zone=ゾーン名 --add-port=ポート番号/プロトコル [--permanent]
--permanent
オプションの意味はサービス追加時と同様
例:public ゾーンについてポート 3000/tcp を許可する場合
# firewall-cmd --zone=public --add-port=3000/tcp --permanent
success
許可ポートの削除
firewall-cmd --zone=ゾーン名 --remove-port=ポート番号/プロトコル [--permanent]
--permanent
オプションの意味はサービス追加時と同様
例:public ゾーンについてポート 3000/tcp を削除する場合
# firewall-cmd --zone=public --remove-port=3000/tcp --permanent
success
設定変更の反映
--permanent
オプションを使用して設定変更した場合は設定変更反映のために以下コマンドを実行する。
firewall-cmd --reload
# firewall-cmd --reload
success
リッチルールについて
リッチルールとは、より細かい条件で通信制御を実施できる機能のことで、例えば以下のような設定ができます。
- 送信元 IP アドレス を限定して、特定サービスまたは特定ポートの通信を許可
- 宛先 IP アドレスを限定して、特定サービスまたは特定ポートの通信を許可
リッチルールの追加
firewall-cmd --zone=ゾーン名 --add-rich-rule='ルール内容' [--permanent]
「ルール内容」部分の書式は以下の通り。
- 特定送信元 IP からの特定サービスの通信を許可したい場合
rule family="ipv4" source address="送信元IP/マスク" service name="サービス名" accept
- 特定送信元 IP からの特定ポートの通信を許可したい場合
rule family="ipv4" source address="送信元IP/マスク" port port="ポート番号" protocol="tcpまたはudpなど" accept
- 特定宛先 IP への特定サービスの通信を許可したい場合
rule family="ipv4" destination address="送信元IP/マスク" service name="サービス名" accept
例:送信元 IP アドレスが 192.168.139.0/24 からのみ SSH を許可する場合
# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.139.0/24" service name="ssh" accept' --permanent
success
# firewall-cmd --reload
success
リッチルールの確認
firewall-cmd --zone=ゾーン名 --list-rich-rules
# firewall-cmd --zone=public --list-rich-rules
rule family="ipv4" source address="192.168.139.0/24" service name="ssh" accept
リッチルールの削除
firewall-cmd --zone=ゾーン名 --remove-rich-rule='対象リッチルールの内容' [--permanent]
- 対象リッチルールの内容部分には、
firewall-cmd --zone=ゾーン名 --list-rich-rules
コマンドで表示される内容をコピー&ペーストする
- 対象リッチルールの内容部分には、
# firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.139.0/24" service name="ssh" accept' --permanent
success
#
# firewall-cmd --reload
#
# firewall-cmd --zone=public --list-rich-rules
#
―――――――――――――