ここから、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
# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
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」を作ってみましょう。
# cp /usr/lib/firewalld/zones/public.xml /etc/firewalld/zones/custom.xml
# firewall-cmd --reload
# 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.