Linux
 Computer >> コンピューター >  >> システム >> Linux

CentOS 8/7でFirewallDを使い始める方法|基本概念から実践的な設定手順まで徹底解説

CentOS 7では、トラフィックフィルタリングのルールを設定するためのツールとしてFirewallDが導入されました。iptablesのルールを管理するために推奨されるツールです。一方、CentOS 8では標準のiptablesパケットフィルタリングサービスの代わりにnftablesフレームワークが採用されており、firewalldでファイアウォールルールを設定すると、実際にはnftablesが設定されます。この記事では、Linux CentOS 8(およびCentOS 7)サーバーにfirewalldをインストール・設定する方法と、このファイアウォールの主要な概念について解説します。

Firewalldの基本概念:ゾーンとルール

firewalldのインストールと設定を行う前に、「ゾーン」について理解しておきましょう。ゾーンは、異なる接続に対する信頼レベルを決定するために使用されます。firewalldのゾーンごとに異なるフィルタリングルールを適用でき、事前定義されたサービス・プロトコル・ポートに対してアクティブなファイアウォールオプションを設定したり、ポートフォワーディングやリッチルールを利用したりできます。

Firewalldは、ゾーンに適用されたルールに基づいて受信トラフィックをフィルタリングします。送信元IPアドレスがあるゾーンのルールに一致すれば、パケットはそのゾーンを通じて処理されます。サーバーに設定されたどのゾーンにも一致しない場合は、デフォルトゾーンがパケットを処理します。firewalldインストール直後のデフォルトゾーンは「public」です。

Firewalldには、さまざまなサービス向けにあらかじめ権限が設定された複数のゾーンが用意されています。これらの設定をそのまま使うことも、独自のゾーンを作成することも可能です。以下は、firewalldのインストール時に作成されるデフォルトゾーンの一覧です(/usr/lib/firewalld/zones/ に格納されています)。

drop信頼レベルが最も低いゾーンです。すべての着信接続を応答なしでブロックし、発信接続のみ許可します。
block上記のdropと似ていますが、着信リクエストが拒否される際に、IPv4では icmp-host-prohibited メッセージ、IPv6では icmp6-adm-prohibited メッセージが返されます。
public公共の信頼されていないネットワーク向けのゾーンです。着信接続は個別に許可できます。
externalファイアウォールがゲートウェイとして使用される場合の外部ネットワーク向けゾーンです。NATマスカレードに使用され、内部ネットワークをプライベートに保ちながらアクセス可能にします。
internalexternalゾーンの対となるゾーンです。ホストは十分な信頼レベルを持ち、多くの追加サービスへアクセスできます。
dmz非武装地帯(DMZ)内のコンピュータ向けのゾーンです。ネットワークへのアクセス権を持たない隔離されたコンピュータが含まれ、選択された着信接続のみ許可されます。
work職場のコンピュータ向けのゾーンです(ネットワーク内のほとんどのコンピュータが信頼対象となります)。
homeホームネットワーク向けのゾーンです。他のコンピュータの大半を信頼できますが、着信接続は一部のみサポートされます。
trustedネットワーク内のすべてのコンピュータが信頼されます。最もオープンな設定のため、責任ある運用が求められます。

Firewalldは、永続的(permanent)なルールセットとランタイム(runtime)のルールセットという2種類のルールを使用します。ランタイムルールはサーバーの再起動まで有効です。デフォルトでは、firewalldに追加したルールはランタイムとして扱われます。永続的なルールを追加するには、--permanentフラグを使用する必要があります。永続ルールはサーバー再起動後に適用されます。

CentOSへのFirewallDのインストールと有効化

CentOS 7/8では、OSインストール時にfirewalldがデフォルトでインストールされます。もし削除済みの場合でも、標準のyum/dnfパッケージマネージャーを使って再インストールできます。

# yum install firewalld -y(CentOS 7の場合)
# dnf install firewalld -y(CentOS 8の場合)

firewalldデーモンを自動起動させるには、システムの起動時に登録します。

# systemctl enable firewalld

そして起動します。

# systemctl start firewalld

サービスの状態を確認します。

# systemctl status firewalld

● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running)
Docs: man:firewalld(1)
Main PID: 13646 (firewalld)
CGroup: /system.slice/firewalld.service
└─13646 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
systemd[1]: Starting firewalld - dynamic firewall daemon...

次のコマンドでも確認できます。

# firewall-cmd --state

firewall-cmdコマンドは、nftables/iptablesのフロントエンドとして機能するfirewalldのコマンドラインインターフェースです。

running

FirewallDのルール管理

デフォルトのFirewallDルール

firewalldのルールを設定する前に、まずデフォルトでどのゾーンが使用されているか確認しましょう。

# firewall-cmd --get-default-zone

firewalldをインストールしたばかりでまだ何も設定していないため、デフォルトゾーンはpublicになっています。

アクティブなゾーンも確認してみましょう。現時点ではpublicのみがアクティブです。

# firewall-cmd --get-active-zones

public
interfaces: eth0

ご覧のとおり、eth0インターフェースはpublicゾーンによって管理されています。

CentOSのネットワークインターフェース一覧は、次のコマンドで表示できます。

# ip link show
または
# nmcli device status

アクティブなゾーンのルールを表示するには、次のコマンドを使用します。

# firewall-cmd --list-all

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

この出力から、DHCPクライアントやSSHに関する一般的な操作がゾーンに追加されていることがわかります。

利用可能なゾーンの一覧

すべてのゾーンの一覧を表示するには、次のコマンドを実行します。

# firewall-cmd --get-zones

以下のようなリストが表示されます。

block dmz drop external home internal public trusted work

特定のゾーンのルールを確認するには、--zoneフラグを追加します。

# firewall-cmd --zone=home --list-all

home
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

すべてのゾーンのルールをまとめて表示することもできます。

# firewall-cmd --list-all-zones

デフォルトゾーンの変更方法

デフォルトでは、すべてのネットワークインターフェースはpublicゾーンに配置されていますが、次のコマンドで任意のゾーンに移動できます。

# firewall-cmd --zone=home --change-interface=eth0

--zone=パラメータの後に移動先のゾーン名を指定してください。

また、デフォルトゾーン自体をhomeに変更したい場合は、次のコマンドを実行します。

# firewall-cmd --set-default-zone=home

アプリケーションのルール追加方法

アプリケーション用にポートを開くには、そのサービスを例外として追加します。利用可能なサービスの一覧は次のコマンドで表示できます。

# firewall-cmd --get-services

出力には多数のサービスが含まれます。各サービスの詳細情報はXMLファイルに記載されており、/usr/lib/firewalld/servicesディレクトリに格納されています。

例を見てみましょう。

# cd /usr/lib/firewalld/services
# cat smtp.xml

<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Mail (SMTP)</short>
<description>This option allows incoming SMTP mail delivery...</description>
<port protocol="tcp" port="25"/>
</service>

XMLファイルには、サービスの説明、プロトコル、およびfirewalldで開放されるポート番号が記述されています。

ルールを追加する際は、--add-serviceパラメータを使用して、特定のサービスへのファイアウォール経由のアクセスを許可できます。

# firewall-cmd --zone=public --add-service=http
# firewall-cmd --zone=public --add-service=https

ルール追加後、指定したゾーンにサービスが登録されているか確認しましょう。

# firewall-cmd --zone=public --list-services

dhcpv6-client http https ssh

ルールを永続化したい場合は、追加時に--permanentパラメータを付けてください。

ゾーンからサービスを削除するには:

# firewall-cmd --permanent --zone=public --remove-service=http
# firewall-cmd --zone=public --permanent --list-services

dhcpv6-client https ssh test

独自のサービスを例外に追加したい場合は、自分でXMLファイルを作成して必要なデータを記述できます。既存のサービスの内容をコピーし、名前・説明・ポート番号を変更するだけで簡単に作成できます。

smtp.xmlをユーザーサービス用ディレクトリにコピーします。

# cp /usr/lib/firewalld/services/smtp.xml /etc/firewalld/services

ファイル内のサービス説明を編集します。

XMLファイルの名前も変更する必要があります(ここではtestという名前にしました)。その後、firewalldを再起動し、サービスが一覧に表示されていることを確認します。

# firewall-cmd --get-services

syslog-tls telnet test tftp

これで、このサービスを任意のゾーンに追加できるようになりました。

# firewall-cmd --zone=public --add-service=test --permanent
# firewall-cmd --zone=public --permanent --list-services

dhcpv6-client http https ssh test

目的のサービスが一覧に見つからない場合は、次のコマンドでfirewalldのポートを直接開放できます。

# firewall-cmd --zone=public --add-port=77/tcp — TCPポート77を開放
# firewall-cmd --zone=public --add-port=77/udp — UDPポート77を開放
# firewall-cmd --zone=public --add-port=77-88/udp — UDPポート範囲77〜88を開放
# firewall-cmd --zone=public --list-ports — 許可されたポートの一覧を表示

ICMPリクエストをブロック/許可するには:

# firewall-cmd --zone=public --add-icmp-block=echo-reply
# firewall-cmd --zone=public --remove-icmp-block=echo-reply

追加したポートを削除するには:
# firewall-cmd --zone=public --remove-port=77/udp — UDPポート77のランタイムルールを削除

# firewall-cmd --permanent --zone=public --remove-port=77/udp — 永続ルールを削除

新しいゾーンの作成方法

独自のゾーンを作成することもできます(ここではourという名前にします)。

# firewall-cmd --permanent --new-zone=our

新しいゾーンを作成した後は、サービスを作成した場合と同様に、firewalldの再起動が必要です。

# firewall-cmd --reload
# firewall-cmd --get-zones

block dmz drop external home internal our public trusted work

ourゾーンが利用可能になりました。このゾーンにサービスを追加したり、ポートを開放したりできます。

FirewalldでのIPアドレスブロックと例外設定

firewalldでは、信頼できるIPアドレスを例外として追加したり、不要なIPアドレスをブロックしたりすることができます。

例えば、IPアドレス(例:8.8.8.8)をサーバーの例外リストに追加するには、次のコマンドを実行します。

# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="8.8.8.8" accept'

ゾーンを確認し、IPアドレスがリッチルールの例外に追加されていることを確認しましょう。

# firewall-cmd --zone=public --list-all

public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client http https ssh test
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="8.8.8.8" accept

IPアドレスをブロックするには、acceptをrejectに置き換えます。

# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="8.8.4.4" reject'
# firewall-cmd --zone=public --list-all

public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client http https ssh test
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="8.8.8.8" accept
rule family="ipv4" source address="8.8.4.4" reject

特定のサービスに対して、特定のIPアドレスからのリクエストのみを受け入れるよう設定することもできます。

#firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="192.168.1.0/24" service name="https" accept'

サーバーへのすべてのリクエストを緊急時にすばやくブロックしたい場合は、panicコマンドを使用します。

# firewall-cmd --panic-on

パニックモードを解除するには、次のコマンドを実行します。

# firewall-cmd --panic-off

または、サーバーを再起動しても解除できます。

さらに、root権限を持つローカルサービスがあなたの作成したファイアウォールルールを変更できないように、firewalldの設定をロックダウンすることも可能です。

# firewall-cmd --lockdown-on

ロックダウンモードを無効化するには:

# firewall-cmd --lockdown-off

Firewalldによるポートフォワーディングの設定

firewalldでは、ポートフォワーディングのルールも作成できます。TCPポート443を9090に転送する場合:

# firewall-cmd --zone=public --add-forward-port=port=443:proto=tcp:toport=9090 --permanent

参考までに、Windows環境ではnetshを使って同様のポートフォワーディング設定が可能です。

ポートフォワーディングのルールを削除するには:

# firewall-cmd --zone=public --remove-forward-port=port=443:proto=tcp:toport=9090

  1. Clipchampの始め方|初心者向け動画編集の基本操作を徹底解説

    Clipchamp(クリップチャンプ)は、仕事用やSNS投稿用など、さまざまな目的の動画を誰でも手軽に作成できる動画編集ツールです。Microsoftが2021年に買収し、現在はWindows 10およびWindows 11ユーザー向けに無料で提供されています。当初はOffice 365への統合が予定されていましたが、方針が変更され、現在ではすべてのWindows 11デバイスに標準アプリとしてプリインストールされています。 Clipchampの特徴と料金プラン Clipchampは、ゼロからの動画制作に最適なツールです。チュートリアルやセールスプレゼンテーションといった長尺コンテンツの制作は

  2. Alexaスキルの作り方を徹底解説!Skill Blueprintsでオリジナルスキルを簡単に作成する方法

    Amazon Echoスマートスピーカーをお持ちなら、デジタルアシスタント「Alexa」はすでにおなじみのはず。Alexaは買い物リストの作成や音楽の再生、スマートホーム機器のコントロールだけでなく、実にさまざまなことができる優秀な音声アシスタントです。実は、想像以上に個人的なタスクまでサポートしてくれる頼もしい存在なんです。 さらに、「Amazon Skill Blueprints(スキルブループリント)」という機能を使えば、自分だけのAlexaスキルを作成することも可能。面白いジョークやクイズを作って、家族や友人との時間を盛り上げることができます。また、ToDoリストの作成や既存リストの編