ファイアウォールの設定をする - さくらのVPSを使ってみた

ファイアウォールとは

決められたルールに沿って、必要な通信は通して不要な通信は止める仕組みです。

不正アクセスからサーバーを保護する役割を持ちます。

IPアドレスとポート番号

インターネットではTCP/IPやUDP/IPという通信のプロトコルを使用していて、通信する相手をIPアドレスとポート番号という2つの値を使って識別しています。

サーバーの中にいくつかのサービスがあるわけですが、大雑把に言うとIPアドレスの指定がどのサーバーにアクセスするかの指定で、ポート番号の指定がどのサービスを利用するかの指定になります。例えば、Webブラウザーでhttp://www.example.comにアクセスする場合、Webブラウザーがwww.example.comに対応するIPアドレスのサーバーの80番ポートに対してアクセスをして、Webページを取得するということをやっています。

IPアドレスやポート番号に対する通信の許可/拒否を決めて、ファイアウォールに設定します。例えば自分のPCのIPアドレスが192.168.0.10だった場合、サーバーのファイアウォールの設定で「接続元IPアドレスが192.168.0.10の通信だけを許可する」とすれば、自分以外サーバーにアクセスすることができなくなります。

外から中、中から外

通信には「外から中」と「中から外」の2種類の方向があります。サーバーから見て外から中の通信は不正利用の可能性があるので各種制限を設けるのが一般的です。中から外の通信については、制限する場合もあればしない場合もあり、まちまちです。

例えば、サーバー上で不正にプログラムを実行されてデータを外部のサーバーに送信されてしまうというケースを考えると、中から外の通信も制限する方がよりセキュアになります。反面、よく分からないまま設定すると、なぜか通信できなくなるという事態が発生しますし、どの通信を許可するかを事前に洗い出さないといけなくなって、利便性が落ちる場合があります。

個人的には中から外の通信も制限する方が良いと思いますが、サーバーの利用用途などを踏まえて適切な設定にしてくださいとしか言えないところです。

iptables

ファイアウォールの機能はiptablesを利用して実現します。/etc/sysconfig/iptablesが設定ファイルになっているので、このファイルを編集します。

$ sudo vi /etc/sysconfig/iptables

設定を変更したらiptablesを再起動します。

$ sudo service iptables restart
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]

設定を確認します。

$ sudo iptables -L

設定を間違えるとリモートで接続できなくなってしまうのでちょっと怖い作業になります。さくらのVPSの場合ですと、リモートコンソール機能でシリアルコンソールが使えるので、設定を間違えてもどうにかなるようです。

設定例

参考として、私が使っている設定の抜粋を紹介します。アクセス元のIPアドレスが固定ではないので、ポート番号での制限が中心です。

設定内容はサーバーの利用用途によって変わりますので、自分の使い方に合わせて設定してください。

*filter
:INPUT    DROP    [0:0]
:FORWARD  DROP    [0:0]
:OUTPUT   DROP    [0:0]

# loopback
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

# incoming SSH(ポート番号を12345に変更した場合の例/普通はポート番号22)
-A INPUT  -p tcp --dport 12345 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp --sport 12345 -m state --state ESTABLISHED     -j ACCEPT

# incomming HTTP
-A INPUT  -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED     -j ACCEPT

# outgoing HTTP
-A OUTPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT  -p tcp --sport 80 -m state --state ESTABLISHED     -j ACCEPT

# outgoing HTTPS
-A OUTPUT -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT  -p tcp --sport 443 -m state --state ESTABLISHED     -j ACCEPT

# outgoing DNS
-A OUTPUT -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT  -p udp --sport 53 -m state --state ESTABLISHED     -j ACCEPT

# outgoing NTP
-A OUTPUT -p udp --dport 123 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT  -p udp --sport 123 -m state --state ESTABLISHED     -j ACCEPT

COMMIT

細かい設定(参考)

iptablesは高機能で、IPアドレスやポート番号による単純な通信制御だけではなく、より細かい制御も可能です。

例えば、同一IPアドレスからの連続した接続要求を拒否するには次のようにします。

# incoming SSH
-A INPUT  -p tcp --dport 12345 -m state --syn --state NEW -m hashlimit --hashlimit-name t_sshd --hashlimit 1/m --hashlimit-burst 5 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT
-A INPUT  -p tcp --dport 12345 -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp --sport 12345 -m state --state ESTABLISHED -j ACCEPT