firewalldについて理解しよう

初心者がVPS(Virtual Private Server)をWebサーバーとして構築し、WordPressのサイトを運用できるようになるまでの「ネコでもわかる!」連載の第7回目です。
最初から読みたい方はこちらからどうぞ。

前回(第6回目)では無料のSSL証明書である「Let’s Encrypt」を導入し、常時SSL環境を構築しました。

今回はfirewalld(ファイアウォールディー)というツールを使ってファイアウォールの設定を行います。
対象サーバーは、さくらのVPS CentOS7 x86_64です。

目次

  1. まず、ファイアウォールの基本を学ぼう
  2. ファイアウォールの具体的な使い方

まず、ファイアウォールの基本を学ぼう

VPSをセットアップしてWebサーバーを公開したら、Webコンテンツを全世界に発信できるようになります。しかし同時に悪意ある第三者の攻撃にさらされることにもなります。
HTTPなど、提供したいサービスの通信プロトコルはオープンにし、使わないサービスはブロックする」のがファイアウォールの役割です。
ファイアウォールは和訳すると「防火壁」です。不要な侵入口を塞ぐことで、サーバーに侵入される隙を無くしセキュリティを確保します。
Webサーバーを公開するならばぜひともファイアウォールは設定しておきたいところです。

firewalldは不要な通信を遮断してくれる

「使っているサービスの口はオープンにして、使ってないサービスの口はブロックする」のがファイアウォールですので、まずは
使っているサービス(ファイアウォールを通過させたいサービス)
使っていないサービス(ファイアウォールでブロックしたいサービス)
をはっきりさせましょう。

連載を第1回目からここまで手順にそって読み進めた場合、使っているサービスは以下になります。
逆に、これ以外のサービスは使っていないのでブロックしても良いことになります。
・サーバーでコマンド実行するためのsshサービス(ポート番号22)
・Webサイトを公開するためのhttpサービス(ポート番号80)
・常時SSLでWebサイトを公開するためのhttpsサービス(ポート番号443)

ssh,http,httpsは許可し、それ以外は遮断する

サービスは80とか443といったそれぞれ固有の「ポート番号」を使用しています。駅のホームの番線や、空港の搭乗口番号をイメージしてもらえれば分かりやすいと思います。1つの駅、空港からいろんな便が発着するので、番号を決めておかないと交通整理ができないのです。

サービスは80とか443といったそれぞれ固有の「ポート番号」を使用している

そして、使用する通信プロトコルとしてTCPUDPがあり、それぞれにポート番号の概念があります。「TCPのポート番号80」と「UDPのポート番号80」は別物ですので注意してください。
上述したssh、http、httpsのサービスはすべて”TCP“の通信プロトコルになります。一般的に、私達がよく使うサービスはTCPであることが多いです。
TCPとUDPの違いについて詳しくは割愛しますが、大まかに言うと
信頼性が求められる通信はTCP」
「信頼性よりも、大量のデータをやりとりしたい場合はUDP」
という風に使い分けられます。

詳しく知りたい方は以下のサイトが参考になります。
TCPとUDPの違い,深層の真相:教科書には載っていない ネットワークエンジニアの実践技術

代表的なサービスのプロトコルとポート番号は以下のようになっています。

サービス名 プロトコルとポート番号
http TCP 80
https TCP 443
pop3(メール受信) TCP 110
pop3s(暗号化通信によるメール受信) TCP 995
imap (メール受信などの操作) TCP 143
smtp(メール送信) TCP 25
smtps(暗号化通信によるメール送信) TCP 587
ssh、sftp TCP 22

これ以外にも、よく使われるサービスのポート番号はウェルノウンポート番号(WELL KNOWN PORT NUMBERS)といって 0〜1023までのポート番号のどこかに割り当てられています。
詳しくは、以下のページをご覧ください。
TCPやUDPにおけるポート番号の一覧 – Wikipedia

ファイアウォールの具体的な使い方

では、ファイアウォールの設定ができるように具体的にコマンドを紹介します。
CentOS7では、ファイアウォールの設定コマンドとしてfirewalldを使います。CentOS6までは”iptables“でしたが、CentOS7からはデフォルトのファイアウォールコマンドが変更になっています。
firewalldとiptablesは使い方がまったく異なります。”iptables”で検索してでてくるページは参考になりませんので注意してください。

ファイアウォールの設定といっても、実はさくらのVPSは、第三回「Apacheをインストールしよう」で説明したように、はじめからファイアウォール機能は有効になっています。
初期設定状態のVPSは、ファイアウォールがhttpやhttpsプロトコルでの通信を許可していないので、第三回のこの記事でファイアウォールの設定を見直したのでした。

したがって、ファイアウォールの設定はすでに完了しているので改めて何かするべきことは無いのですが、ここでは少し進んで設定方法を細かく学習しておきましょう。
もし、Webサーバー以外に新たに何かサービスを追加したくなったときや、sshの接続ポート番号を変更したくなったときなどに、役に立つと思います。

firewalldで使うコマンドはfirewall-cmdです。
まずは、ファイアウォールが起動中かどうかを確認するコマンドを実行してみましょう。
rootユーザーで操作してください。

# firewall-cmd --state

running の場合は起動中です。

running

not running の場合は停止中です。

not running

現在のファイアウォール設定を確認するには以下のコマンドです。
有効になっているサービス(ファイアウォールを通過できるサービス)が確認できます。

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client http https ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:

“services”の行が、現在有効になっているサービスです。http、https、sshが有効になっているのが分かります。
dhcpv6-clientは、IPv6用のDHCP clientサービスです。これはこのまま有効にしておけば良いです。

firewalldの起動・終了・再起動

起動・停止・再起動は以下のコマンドになります。
サーバー起動時にはfirewalldも同時に起動する設定にすでになっているので、これらのコマンドはあまり使うことはないと思います。
ただし、「サービスは起動しているはずなのにうまく通信できない」といったトラブルに見舞われたときに、ファイアウォールが原因で通信が遮断されていないかを確認したいことはあるでしょう。いったんファイアウォールを停止して通信ができるかどうか試してみたりすることは、原因解析手段として役に立ちますので覚えておいて損はないでしょう。

ファイアウォールの起動
※以降、それぞれのコマンドの実行後は何も反応が返ってこないですが、きちんと実行はされています。

# systemctl start firewalld

systemctl start firewalld

ファイアウォールの停止

# systemctl stop firewalld

ファイアウォールの再起動

# systemctl restart firewalld

firewalldに、許可するサービスを追加する

では次に、具体的に通信許可するサービスの設定をファイアウォールに追加してみましょう。
例えば、メール受信のサービスpop3を追加するには以下のコマンドを実行します。

# firewall-cmd --permanent --zone=public --add-service=pop3

–permanent は、変更を継続的に適用するためのオプションです。OS再起動後も設定内容は持続します。
–zone=public は、ゾーンとしてpublicを使う設定です。指定できるゾーンについてはdmzやexternalなど何種類かありますが、デフォルトのpublicだけでとりあえずは事足りますので、このまま決まったお約束のオプションだと思って差し支えないでしょう。
最後の –add-service=pop3 で、pop3サービスが追加されます。

このコマンドのあと、設定を反映するために以下のリロード命令を実行してください。

# firewall-cmd --reload

ここで改めて、設定状態を確認する
firewall-cmd –list-all
を実行すると、pop3のサービスが追加されています。

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client http https pop3 ssh
  ・・・

このようにpop3サービスを追加することができました。
しかし、firewall-cmdのオプションに指定するこのpop3というサービス名称はどこから得られるのでしょう?

firewall-cmdに指定できるサービス名称の一覧は、以下のコマンドで確認できます。
サービス名がスペース区切りでずらっと表示されます。httpやhttps、ssh、pop3など今までに出てきたサービス名も含まれていることが分かります。

# firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client ceph ceph-mon dhcp dhcpv6
dhcpv6-client dns docker-registry dropbox-lansync freeipa-ldap freeipa-ldaps freeipa-replication
ftp high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos
kpasswd ldap ldaps libvirt libvirt-tls mdns mosh mountd ms-wbt mysql nfs ntp openvpn pmcd
pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster
radius rpc-bind rsyncd samba samba-client sane smtp smtps snmp snmptrap squid ssh synergy syslog
syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https
xmpp-bosh xmpp-client xmpp-local xmpp-server

さきほど指定したpop3が使用するプロトコルとポート番号は、以下のコマンドで確認できます。
pop3は、TCPの110番ポートであることが分かります。

# firewall-cmd --info-service=pop3
pop3
  ports: 110/tcp
  protocols:
  source-ports:
  modules:
  destination:

これらのコマンドで得られる情報は、
/usr/lib/firewalld/services/
の下に保存されているxmlファイルでも確認できます。ファイルの中を見ると、サービス名がどのポートとプロトコルに割り当てられているのかが分かります。

逆に、設定を削除する場合は

# firewall-cmd --zone=public --remove-service=pop3

のようにします。削除の場合も同様に、firewall-cmd –reload で設定を反映してください。

プロトコルとポート番号を指定して許可するサービスを追加する

サービス名ではなく、プロトコルとポート番号を指定してファイアウォール設定を追加する場合は以下のようにします。
例えば、Webブラウザでサーバーの設定ができるWebminというツールがありますが、これはポート10000を使用します。また、sshの標準ポート番号22をセキュリティの観点から例えば10022といった番号に変更した場合は、この番号の通信を許可するようにファイアウォールの設定をする必要があります。
この例では、TCPの10000ポートを追加しています。

# firewall-cmd --add-port=10000/tcp --zone=public --permanent

設定を削除する場合は以下です。

# firewall-cmd --remove-port=10000/tcp --zone=public --permanent

いずれも、reloadオプションで設定を反映指定ください。

# firewall-cmd --reload

firewalldによるファイアウォールの解説は以上です。
紹介したのはfirewalldのほんの一部の機能です。詳しく知りたい方は以下のスライドが参考になります。
Linux女子部 firewalld徹底入門!

次回(第8回目)の記事の公開まで自分のサーバーを触る予定が無い方は、前回と同様、外部からの余計な攻撃にさらされないようにサーバーを停止しておきましょう。
サーバー停止コマンドは以下です。

# shutdown -h now

第7回目は以上です。第8回目をお楽しみに。

(イラスト:小川真孝(ブログ))