検索
連載

ハマる前に理解する「Firewalld」の設定方法、「iptables」との違いCentOS 7で始める最新Linux管理入門(4)(3/4 ページ)

システム管理に関する部分が前バージョンから大きく変更された「CentOS 7」は、Linuxに慣れていても「ハマる落とし穴」が幾つかあります。今回は、CentOS 7で採用されたパケットフィルタリングのための新たな仕組みである「Firewalld」の基礎と運用方法を解説します。

Share
Tweet
LINE
Hatena

「firewall-cmd」を用いたパケットフィルタリングの設定方法

 ここから、Firewalldのルール設定のための代表的なコマンドとその出力結果例を解説していきます。ルールの設定は、「firewall-cmd」コマンドで行います。

 ちなみに、「firewall-cmd --get-services」以外のコマンドに共通するコマンドの作法として、「--zone」オプションを省略すると、初期設定ではpublicゾーンが対象になります。また、起動時に設定対象とするゾーンを変更するには「--permanent」オプションを追加します。

 では、「public」ゾーンへルールを設定してみます。

定義されているサービスの一覧を表示する

# firewall-cmd --get-services
# firewall-cmd --get-services
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imaps ipp ipp-client ipsec iscsi-target kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind rsyncd samba samba-client smtp ssh telnet tftp tftp-client transmission-client vdsm vnc-server wbem-https
表示例

 このように登録済みのサービス一覧が表示されます。上記は、CentOS 7.2を新規インストールしたときにあらかじめ設定されているサービスの一覧です。

許可されているサービスを表示する

# firewall-cmd --list-services --zone=public
# firewall-cmd --list-services --zone=public
dhcpv6-client ssh
表示例

 「public」ゾーンのINPUT通信は、「dhcpv6-client」と「ssh」の二つが許可されていることが分かります。

許可するサービスを追加する

# firewall-cmd --add-service=http --zone=public
# firewall-cmd --add-service=http --zone=public
success
表示例

 上記は「public」ゾーンへ、「http」サービスを追加した例です。設定に成功すると「success」と表示されます。

 参考までに、同じ作業をiptablesで行うコマンドと比べてみましょう。ここでは、差異が分かりやすいよう「ssh接続を許可する」例を挙げます。

# firewall-cmd --add-service=ssh --zone=public
Firewalldの場合
# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
iptablesの場合

 Firewalldでは、許可したいサービスを、どのゾーンに追加するか、という自然言語に近い記述で済みます。一方のiptablesのコマンドは、慣れていなければ、何を記述したのかも理解できないと思います。セッションの処理やプロトコル、ポート番号を把握した上で、具体的に記述する必要があるからです。「TCP/IPの仕組みを理解していないと難しい」「コマンドオプションが複雑」といったiptablesの幾つかの課題は、Firewalldで解消されることが分かります。

指定のサービスが許可されたかを確認する

# firewall-cmd --query-service=http --zone=public
# firewall-cmd --query-service=http --zone=public
yes
表示例

 先ほど追加した「http」が正しく許可ルールに設定されたかを、このコマンドで確認できます。許可されていたならば、「yes」と表示されます。

許可するサービスを削除する

# firewall-cmd --remove-service=http --zone=public
# firewall-cmd --remove-service=http --zone=public
success 
表示例

 「http」を「public」ゾーンの許可ルールから削除しました。設定に成功すると「success」と表示されます。

インタフェースの「ゾーン」を変更して設定する

 「public」ゾーン以外のゾーンを指定して設定することもできます。

# nmcli con mod [インタフェース名] connection.zone [ゾーン名]

 例えば、NIC「enp3s0」を「internal」ゾーンに設定する場合は、以下のように記述します。

# nmcli con mod enp3s0 connection.zone internal
(何も表示されない)
表示例

 コマンドを実行して正常終了した場合は、特に何も表示されません。このため、設定が正しく反映されたか下記のコマンドで確認します。

# firewall-cmd --get-zone-of-interface=enp3s0
internal
表示例

 enp3s0は「Internal」ゾーンに変更されていることが確認できました。

ワンポイント

 ゾーンはfirewall-cmdコマンドでも変更できますが、ゾーンの変更に関してのみ、前述した--permanentオプションを付与しても永続的な設定になりません。そのため、永続的な設定にするには、nmcliコマンドを用いて変更します。


個別に「ゾーン」を作成する

 先述した通り、Firewalldにはあらかじめ9種類のゾーンが用意されていますが、個別にゾーンを作成して、そこへ定義することも可能です。

 例えば、「個別に接続元IPアドレスを制限したい」といった場合に有効です。既にあるゾーンを対象に設定を変更しても構いませんが、別のゾーンを用意することで、システム管理者がカスタマイズしたことを明示できます。今後の管理がしやすくなると思います。

 では、追加ゾーン「custom」を作ってみましょう。

(1)publicゾーンの内容をコピーして、「custom」ゾーンとして使うためのひな型を作成する

# cp /usr/lib/firewalld/zones/public.xml /etc/firewalld/zones/custom.xml

(2)作成したゾーンファイルをコマンドで扱えるようにするために、リロードする

# firewall-cmd --reload

(3)新設した「custom」ゾーンへ、特定のIPアドレスにだけ「http」を許可するようルールを追加する

# firewall-cmd --permanent --add-source=192.168.0.0/24 --zone=custom
# firewall-cmd --permanent --add-service=http --zone=custom
# firewall-cmd --reload

 ゾーンとインタフェースの定義は、前述の通りnmcliコマンドで行います。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る