firewall-cmdは、CentOS7から採用されているホスト型のファイアウォールです。CentOSと同じように無償で利用が可能です。CentOS6まではiptablesを使っていたのですが、慣れないfirewalldを使うよりほとんど無効化してしまうことが多いと思います。
組織では各サーバにファイアウォールを設定するより独立させて一元管理するアプライアンス型を使う方が多いです。
本記事ではファイアウォールをどこに置くかではなく、安全にCentOSをサーバとして公開できるよう最低限ファイアウォールの設定をまとめておきたいと思います。

firewall-cmdはWindowsファイアウォールと同じでホスト型のファイアウォールです。外部からの通信で許可したいものを許可します。
CentOSをサーバ公開するにあたり、最低限のファイアウォールを設定する方法を以下3点でまとめます。
- 公開用のポートを許可する
- 許可していたポートを拒否する
- 変更を一時的から恒久的に反映する
firewall-cmdを使った現在の設定確認
firewall-cmdはファイアウォールを提供しているfirewalldの状態を確認したり、設定変更できるコマンドです。ここでは現在の設定を確認します。
まずはfirewalldが動作しているか確認します。systemctl status firewalldと入力します。

上の図のように、①systemctl status firewalld でファイアウォールの有効か無効かを確認します。②firewalldのサービスがenabled(自動起動する状態)であることがわかります。③今の状態がactive(running)で起動していることを表示しています。
ファイアウォールが無効な状態であればまずは起動します。systemctl start firewalldで起動できます。起動時に自動的にファイアウォールを有効にするにはsystemctl enable firewalldで設定できます。
ファイアウォールが有効なことがわかりました。これでfirewall-cmdで設定を表示したりできます。現在の設定は、現在有効な設定だけを表示する firewall-cmdにlist-allオプション または、全ての登録している設定を表示する list-all-zonesオプションがあります。

上の図のように、①firewall-cmdにlist-allオプション付与で現在有効な設定を表示します。publicというゾーンがデフォルトとして設定されているため、そのゾーン情報が表示されています。②には許可するサービス名が設定されています。cockpitとdhcpv6-clientとsshです。
firewall-cmdのオプションをlist-allオプションからlist-all-zoneオプションに変更すると、全てのゾーンの情報を表示します。
許可しているサービスの情報を見るにはfirewall-cmdに「info-service=サービス名」オプションとしてます。

上の図のように、許可されているサービスを確認します。①cockpitは②TCPの9090番のポートを利用します。cockpitは管理用のWebGUIのポートで、詳細はRedHatのLINUXホストへのCOCKPITのインストールを参照してください。
上の図で③はdhcpv6のクライアントサービスで、④UDPの546番ポートを使います。⑤SSHサービスは⑥TCPの22番のポートを使います。
firewall-cmdを使って変更する
Webサーバのアクセスを許可
WebサーバはHTTPとHTTPSを許可する必要があります。HTTPSが必要な理由は常時SSL化という時代の要請から必須になりました。
HTTPはTCPの80番ポートを使います。HTTPSはTCPの443番ポートを使います。サービスが定義されているか確認します。

上の図から、httpとhttpsサービスは定義済みであることがわかります。httpはTCPの80番ポートを、HTTPSはTCPの443番ポートを使うように指定されています。
今の設定を確認します。firewall-cmdにlist-allオプションを付けて実行します。

上の図のようにサービスはcockpitとdhcpv6-clientとsshのサービスが許可されています。
上の状態でhttpとhttpsを許可します。許可した後でどのように変わったかを確認します。

上の図のように、①で現在の設定を確認します。②にはhtpとhttpsは許可されていません。③httpとhttpsのサービスを許可します。④もう一度設定を確認します。⑤httpとhttpsが追加されています。
この状態であれば、Webサイトを構築して公開することが可能になりました。ただし再起動すると設定がリセットされて戻ってしまいます。これは次の項目で説明する変更を保存して恒久反映する手順が必要です。
DNSサーバのアクセスを許可
複数のポートを使うサービスを許可してみます。DNSサーバはTCPの53番ポートとUDPの53番ポートを使います。それではdnsサービスを確認します。

上の図のように、①dnsサービスの詳細をfirewall-cmdで表示すると、②dnsサービスにはTCPの53番ポートとUDPの53番ポートの2つが含まれています。
同じように firewall-cmdにadd-service=dnsオプションを付けてコマンドを実行するとDNSサーバのポートを許可します。
許可したサービスを拒否する場合
add-serviceオプションで許可したので、remove-serviceオプションで許可したサービスを拒否します。具体的にdnsサービスを許可している状態からdnsサービスを拒否するコマンドの流れを見てみます。

上の図のように、①現状のファイアウォール設定を表示すると、②http,https,dnsの3つのサービスを追加で許可していることがわかります。③dnsサービスの許可を取り消して拒否します。④もう一度ファイアウォール設定を表示すると、⑤httpとhttpsは許可していますがdnsは消えました。
firewall-cmdの変更を保存して恒久反映
firewall-cmdで許可するサービスを追加したり、削除することで設定できるようになりました。ですが、設定を保存しないと再起動した際には変更が消えてしまいます。ファイアウォールを設定変更して、問題ないことが確認できたらすぐに保存しましょう。
具体的コマンドはfirewall-cmdにruntime-to-permanentオプションを付けると今の設定を/etc/firewalld/ディレクトリ以下に保存します。

上の図のように、successと表示されれば保存は成功しています。次の再起動時にも同じファイアウォールの設定が有効になります。
ファイアウォールを無効にしたい場合
セキュリティレベルが低下することから、おすすめはしませんが、ファイアウォールを無効にしたい場合には、以下の順で停止します。
- ファイアウォールの機能を停止する
- ファイアウォールが自動指導しないように設定する
まずは、現在の状態を確認します。systemctlコマンドで確認します。

上の図のように、①systemctl status firewalldでfirewallの自動起動の設定と起動状態を表示します。②自動起動はenabledなので、有効です。③起動状態はrunningなので起動中です。
ファイアウォールの機能を停止
ファイアウォールの起動を停止して、全ての通信が受信できるようにします。systemctl stop firewalldで停止します。

上の図のように、①firewalldの機能を停止して、全てのデータを送受信できるようにします。②自動起動と今の起動状態をもう一度表示します。③起動状態はdeadなので停止中です。
ファイアウォールの自動起動を停止
次は自動起動を停止します。systemctl disable firewalldでファイアウォールが自動で起動しないように抑制します。

上の図のように、①firewalldが起動時に自動で起動しないよう無効化します。②もう一度自動起動と起動状態を確認します。③自動起動がdisabledで無効化されていることを確認できました。
まとめ
ホスト型のファイアウォールは細かい設定は不要と思います。細かい設定がファイアウォールに必要な場合は、アプライアンス製品のファイアウォールを導入した方が管理は楽になると考えられるためです。
簡単でしたが、firewall-cmdの基本的な使い方を説明しました。もっと高度なこともできますが、ホスト型のファイアウォールとは役割が違うので専用のアプライアンスを使った方が良いと思います。