ファイアウォール機能は現在リリースされているどのOSでも標準で搭載されているといえます。
Linuxにも当然、ファイアウォール機能が搭載されていますが、CentOS 7、RHEL 7から仕組みが大きく変わりました。

CentOS 6やRHEL 6まではiptablesという機構が使われていましたが、CentOS 7、RHEL 7からはfirewalldが追加されました。

iptablesも引き続き提供されますが、デフォルトはfirewalldであり、これからはfirewalldが標準になっていくと思われます。

iptablesとは

iptablesは、Linux 2.4の時代から使われてきたファイアウォールの仕組みです。実際にはLinuxのカーネルの中にある「Netfilter」がパケットフィルタリング処理を行っており、iptablesはその処理を設定します。(firewalldもNetfilterを使ってパケットフィルタリング処理を行っています。)

iptablesでは「チェーン」に対して、パケットを通過させたり拒否したりするルールを定義してフィルタリングします。チェーンには、パケットの受信に対する「INPUT」チェーン、パケットの送信に対する「OUTPUT」チェーン、ネットワークインターフェースの間でのパケット転送に対する「FORWARD」チェーンの3つが用意されています。
これらのチェーンに対してフィルタリングルールを定義していくことで、ファイアウォールとして機能させます。
いわゆる古典的なACL(Access Control List)型のファイアウォールといえます。

具体的には、最初に基本ポリシーとしてDROP(基本無視)やREJECT(基本拒否)、ACCEPT(基本通過)を定義します。その上で、対象ごとに細かいフィルタリングルールを定義していきます。
それぞれのフィルタリングルールは通常、TCPやUDPのポート番号か、単一ホストのIPアドレスまたはネットワークアドレス、あるいはその両者を対象として定義します。
他にも、hashlimitオプションを使用することで回数による接続制限をかけるなどといったスパム対策を取ることもできます。(例:同じIPアドレスから5分間の間に10回接続要求があった場合は、それ以降、新しい接続を5分間拒否する。)

iptablesを有効にする

CentOS 7ではデフォルトではiptablesは無効になっています。iptablesを使用したい場合は、事前に設定が必要です。
また、iptablesはfirewalldと同時に起動することはできません。
そのため、まずデフォルトで動いているfirewalldサービスを停止します。

# systemctl stop firewalld.service

停止したことも念のため確認しましょう。

# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since 日 2018-12-30 04:09:53 JST; 2min 18s ago
 Main PID: 839 (code=exited, status=0/SUCCESS)

inactiveになっており、無事で停止できていることが確認できます。

続いて、iptablesサービスを開始します

# systemctl start iptables.service

もし、「Failed to start iptables.service: Unit iptables.service failed to load: No such file or directory.」メッセージが表示され、エラーとなった場合、iptablesがインストールされていませんので、yumコマンドでインストールします。

# yum -y install iptables-services

iptablesのルールの見方

iptablesのルール定義は、/etc/sysconfig/iptablesというファイルに保存されています。

# cat /etc/sysconfig/iptables
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [21:3500]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

まず、INPUTとFORWARD、OUTPUTの3つのチェーンについて、デフォルトはACCEPTという基本ポリシーになっています。
INPUTは、サーバーに入ってくる通信、OUTPUTは、サーバーから出て行く通信、FORWARDは、受信しデータを他のサーバーへ転送する際に適用されるポリシーです。

その上で、INPUTチェーンとFORWARDチェーンでは、途中ではACCEPTと明記したもの意外は最後でREJECTしています。

INPUTチェーンでは、リプライパケット、ICMPパケット、loインターフェースのパケット、SSHのポート22に対するパケット、FTP(制御系)のポート21に対するパケット、DNS(TCP、UDP)に対するパケットを許可しています。

設定を変更した場合は、ルールを再読み込みします。

# systemctl reload iptables.services

設定が意図どおり正しく反映されたかどうか、次のコマンドで確認します。

# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:21
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:53
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

iptablesを無効にする

最後にiptablsを無効にして、firewalldを有効にします。

# systemctl stop iptables.services
# systemctl start firewalld.services

iptablesの使い方の概要を見てきましたが、他にもたくさんの機能を備えており、機能的には、iptablesを使用してもまったく問題ありません。では、なぜfirewalldなのでしょうか。その点については次ページから見ていきます。