最低限知っておきたいfirewalldの使い方

 ツイート 0  シェア 0  Hatena 0

firewalld

CentOS7 で firewalld を使う機会があり、調べたことの備忘録。zone の説明と、firewall-cmd のよくある使い方を解説します。

目次

  1. firewalld とは
  2. firewalld の起動・停止
  3. zone を理解する
  4. 特定の service の通信を許可する
  5. よく使う firewall-cmd コマンド

firewalld とは

CentOS7では、ファイアウォールの設定に firewalld を使います。Web サーバなら HTTP や HTTPS など、提供したいサービスの通信プロトコルを許可し、それ以外の通信を拒否するのがファイアウォールの仕事です。

firewalld の起動・停止

firewalld の起動・停止は systemctl から行います。ちなみに .service は省略できます。

起動確認
systemctl status firewalld.service
起動
systemctl start firewalld.service
終了
systemctl stop firewalld.service

起動しているかの判断は以下のように systemctl status firewalld.service コマンドを実行して Active: active (running) と表示されていれば起動しています。


# systemctl status firewalld.service

firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2019-09-27 02:11:25 UTC; 21min ago
Docs: man:firewalld(1)
Main PID: 2674 (firewalld)
CGroup: /system.slice/firewalld.service
└─2674 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

firewalld は通常は自動起動させると思いますので、自動起動させるコマンドもセットで覚えておきましょう。

自動起動の状態確認
systemctl is-enabled firewalld.service
自動起動
systemctl enable firewalld.service
自動起動停止
systemctl disable firewalld.service

zone を理解する

firewalld を理解するには zone を理解しておく必要があります。zone とはファイアウォールの設定をネットワークの信頼度ごとにグループ分けして管理する仕組みです。zone に 各種サービスの許可・拒否設定を登録し、設定された zone を NIC や SIDR ブロックに関連付けて利用します。

具体例を見てみましょう。zone の設定は firewall-cmd --list-all コマンドで確認することができます。


# firewall-cmd --list-all

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

コマンドの結果の一番上の行に表示されている public が zone です。services: の行で、ssh と dhcpv6-client の通信が許可されているのが確認できます。interfaces: の行で、ネットワークカード eth0 に 関連付けられていることが確認できます。

zone には他にもいくつか事前定義されていて、public がデフォルトになっています。他の zone の設定は firewall-cmd --list-all-zones コマンドで確認できます。


# 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:

...

いろんな zone が定義されていますが、ほとんどの場合はデフォルトの public のみの利用で事足りますので、まずは public の zone をきちんと扱えるようになりましょう。

特定の service の通信を許可する

これまでの説明で、firewalld の public の zone が eth0 のネットワークカードに関連付けられていて、ssh と dhcpv6-client のサービスが許可されていることが分かりました。この状態から目的のサービスの firewall を許可していきます。

例として http のサービスを許可する場合は firewall-cmd --add-service=http --permanent のコマンドを利用します。--permanent オプションは、再起動しても設定が消えないようにするオプションで、毎回つけるようにするのが安全です。


# firewall-cmd --add-service=http --permanent

success

firewall-cmd --reload コマンドで反映します。


# firewall-cmd --reload

success

firewall-cmd --list-all コマンドで確認すると、services: の行に http が追加されていることが分かります。


# firewall-cmd --list-all

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh http
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

さきほど firewall-cmd --add-service=http コマンドのオプションで指定した http のサービス名はどうやって調べたら良いのでしょうか。指定できるサービス名は firewall-cmd --get-services コマンドで調べられます。


# firewall-cmd --get-services

... http https imap imaps ...

さらに、サービスの詳細情報は firewall-cmd --info-service=http コマンドで確認ができます。


# firewall-cmd --info-service=http

http
  ports: 80/tcp
  protocols:
  source-ports:
  modules:
  destination:

よく使う firewall-cmd コマンド

以上の概念を理解しておけば、firewalld は最低限使えるようになると思います。

後は、私がよく使うコマンドをメモしておきます。詳細は man firewall-cmd コマンドで確認ができます。

起動確認
firewall-cmd --state
zone の状態を確認(zone オプションを省略するとデフォルトの public になる)
firewall-cmd --list-all --zone=public
すべての zone の状態を確認
firewall-cmd --list-all-zones
定義されているサービスの一覧を表示
firewall-cmd --get-services
定義されているサービスの詳細を確認する
firewall-cmd --info-service=http
サービスを許可する
firewall-cmd --add-service=http --permanent
サービスの許可を削除する
firewall-cmd --remove-service=http --permanent
ポート番号を許可する
firewall-cmd --add-port=3000/tcp
ポート番号を許可を削除する
firewall-cmd --remove-port=3000/tcp
特定のIPとポートの通信を許可する
firewall-cmd --add-rich-rule="rule family="ipv4" source address="XXX.XXX.XXX.XXX" port protocol="tcp" port="22" accept --permanent
設定の反映
firewall-cmd --reload
 ツイート 0  シェア 0  Hatena 0