iptablesによるファイアウォールの設定

Use the 8% OFF coupon "GBvalentine", Grab the Best Valentine’s Day Gifts Best Deals from Just $25 @GearBest! Ends: 1/23/2017.
鍵

前回ServersMan@VPSのOSをDebian 6.0(squeeze)からDebian 7.0(wheezy)にアップグレードしました。

今回はiptablesという機能を用いてファイアウォールの設置を行います。iptablesは特にServersMan@VPS専用ではないので、今回はタイトルからServersMan@VPSは外しました。

本来はiptablesの設定はVPSの設置直後に行う必要があるのですが、Debian 6.0とDebian 7.0でちょっと設定ファイルが異なる(Debina 7.0ではip6tablesが使える)ので、今回まで紹介を持ち越していました。

ファイアウォールの方針

私がServersMan@VPSのスタンダードプランを使っていてIPアドレスを1個追加しているので、合計2個のIPv4アドレスが使えます。また、IPv6も2個使えることになります。

今回は次のような方針でファイアウォールの設定をすることにしました。なお、SSHで使用しているポートをNとします。

  • ループバック(127.0.0.1)
    • どんな通信してもOK
  • IPv4アドレス
    • 内側から外側への通信はなんでもOK
    • 外側から内側への通信は下記通信のみOK
      • 内側から開始したTCPコネクションに関係するパケット
      • TCPの80版ポート (HTTP)
      • TCPの443版ポート (HTTPS)
      • TCPのN版ポート (SSH)
      • PING (ICMP)
    • 1分間に5回以上の不正なアクセスを検出した場合はログに残す
  • IPv6アドレス
    • 内側から外側への通信はなんでもOK
    • 外側から内側への通信は下記通信のみOK
      • 内側から開始したTCPコネクションに関係するパケット

追加パッケージのインストール

iptablesはコマンドラインで設定できるのですが、リブートしたりするときれいさっぱり忘れてしまいます。

Debianのiptables-persistentというパッケージを使うと、起動時に自動的にiptablesの設定を復帰してくれるようになるので、インストールしておきます。

apt-get install iptables-persistent

設定ファイルの用意

ここが重要です。IPv4用とIPv6用に設定ファイルを用意します。

IPv4用の設定ファイル

下記のような内容のファイルを/etc/iptablesにrules.v4という名前で作成します。

ここではこのブログのIPv4アドレスを<a.b.c.d>, 追加したもう一つのIPv4アドレスを<e.f.g.h>とします。また、SSHで使用しているポート<n>をと記します。ここはご自分の環境に合わせて書き換えてください(書き換えの際<>は不要です)。SSHのポート番号は絶対に間違えないようにしてください。これを間違えると、iptablesを有効にした瞬間に操作できなくなってしまいます。

*filter

# ループバック(lo0)はすべて許可する。ループバック以外の127.0.0.0/8に関する通信はすべて禁止する。
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

# 確立したコネクションに関する内側への通信はすべて許可する。
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 外部への通信はすべて許可する。
-A OUTPUT -j ACCEPT

# HTTPとHTTPSの通信はすべて許可する。
-A INPUT -p tcp –d <a.b.c.d> --dport 80 -j ACCEPT
-A INPUT -p tcp –d <a.b.c.d> --dport 443 -j ACCEPT
-A INPUT -p tcp –d <e.f.g.h> --dport 80 -j ACCEPT
-A INPUT -p tcp –d <e.f.g.h> --dport 443 -j ACCEPT

# SSH接続をすべて許可する。
-A INPUT -p tcp -m state --state NEW –dport <N> -j ACCEPT

# PINGはすべて許可する
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

# 頻繁な不正アクセスはログに残す
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

# その他の通信はすべて禁止する。
-A INPUT -j REJECT
-A FORWARD -j REJECT

COMMIT

IPv6用の設定ファイル

下記のような内容のファイルを/etc/iptablesにrules.v6という名前で作成します。

注意していただきたいのが4~6行目です。IPv6と同様に-stateでマッチングをかけたかった(4行目)のですが、IPv6ではサポートされておらず行うことができません。そこで、TCPのフラグを見て判別しています。といっても、これはどこかのWebに書いてあったのを丸写ししています。

また、12行目のログもうまくいかないのでとりあえずコメントアウトしてあります。

*filter

# 確立したコネクションに関する内側への通信はすべて許可する。
#-A INPUT -m state -state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
-A INPUT -p tcp --tcp-flags FIN,SYN,RST,ACK SYN,ACK -j ACCEPT

# 外部への通信はすべて許可する。
-A OUTPUT -j ACCEPT

# 頻繁な不正アクセスはログに残す
# -A INPUT -m limit --limit 5/min -j LOG --log-prefix "ip6tables denied: " --log-level 7

# その他の通信はすべて禁止する。
-A INPUT -j REJECT
-A FORWARD -j REJECT

COMMIT

設定の有効化

rules.v4とrules.v6の用意ができたら次のコマンドで設定を有効にしてみましょう。

sudo  service iptables-persistent restart 
[ ok ] Loading iptables rules... IPv4... IPv6...done.

このように「ok」となれば成功です。「FAIL」となる場合は何かを書き間違えていますのでチェックしなおしてください。

まとめ

今回はiptablesコマンドを使ってファイアフォールの設定を行いました。

ファイアフォールのログ(dmesgコマンドか/var/log/debug)を見てみればわかりますが、不正アクセスの試みはかなりの頻度で発生します。このサイトの場合は1日あたり500回から1000回発生しています。

どんな目的であれVPSを利用する場合はiptableの設定は行って行っておいた方がよいでしょう。

次回はバックアップしておいたWordPressのデータを復帰させます。