CentOS 8 でファイアウォールを設定する方法

インフラサーバ

作業環境

  • CentOS 8.0

CentOS におけるファイアウォールサービスについて

CentOS においてファイアウォール機能を提供しているサービスは 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 アドレスを限定して、特定サービスまたは特定ポートの通信を許可

リッチルールについては以下の点に注意してください。

  • firewalld で以下の 2 つが設定されている場合、すべての送信元 IP からの SSH 通信が許可されます
    • サービス設定で SSH を許可
    • リッチルールで特定の送信元 IP アドレスについてのみ SSH を許可

上の状況でリッチルールの通り特定の送信元 IP アドレスについてのみ SSH 通信を許可したい場合は、サービス設定での SSH 許可設定は削除する必要があります。

リッチルールの追加

  • 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

#

―――――――――――――

CentOS 8 で IP アドレスを設定する方法(NetworkManager)

CentOS 8 でユーザおよびグループを作成する方法

タイトルとURLをコピーしました