ファイアウォール(iptables)を設定

サーバーを運用するにあたり、セキュリティ設定が必要になります。今回は、ファイアウォール(iptables)の設定をおこなったので紹介します。

そもそも、ファイアウォール(iptables)で何をやっているかというと、プロトコルやポート番号を元にパケットの受信、転送、送信の可否を制御しています。

TCPwrapper(hosts.allowやhosts.denyでアクセス制限を行う)でも同じように(厳密には違いますが)サービスごとに制限をかけることができます。この2つを併用することにより二重でアクセス制御ができ、よりセキュリティを強化することができます。sshなどの重要なサービスは、iptablesで許可した後に、TCPwrapperで接続できるホストに制限をかけておくと安心ですね。

ややこしいですが、簡単に説明するとiptablesとTCPwrapperは、ネットワークの階層で考えた場合に、動作する階層が異なっています。iptablesはパケットレベルのフィルタであるのに対して、TCPwrapperはサービスソフトウェア側での実装です。TCPwrapperに対応したソフトでないと設定しても反映されません。sshはTCPwrapperに対応しているので設定したフィルタの設定が反映されます。(SSHのパケットを通過させて、sshを使う場合に接続元のホストに制限をかけるなどの組み合わせが可能)また、TCPwrapperの設定は、サービスの再起動は不要で、書き換えた後に新しい設定が参照されます。TCPwrapperの設定を書き換える場合は、十分に注意する必要があります。(書き換え後,すぐに接続できなくなったりします…)

ネットワーク階層とファイアウォールの関係
簡単に説明すると、下の階層がハード側で、上の階層がソフト側に近いイメージです。

ちょっとわき道にそれましたが、本題のファイアウォール(iptable)設定に入ります。

ファイアウォール(iptable)設定には、INPUT、OUTPUT、FORWORDという3つのポリシー(方針)があります。INPUTは受信パケットのポリシー、OUTPUTは送信パケットのポリシー、FORWARDは転送パケットのポリシーです。各ポリシーに対して、”DROP”(拒否)、”ACCEPT”(許可)などの基本ポリシーを設定します。

今回は、各ポリシーに対して、以下の考え方で設定を行いました。

  • INPUT:受信パケットに関する基本ポリシーをDROPにして、許可するポートを個別にACCEPT
  • OUTPUT:サーバーから出ていく方なので、ACCEPT
  • FORWARD:他のサーバへの転送設定で、特に転送するサーバーはないのでDROP

では、さっそくファイアウォール(iptables)の設定を行います。

  • まずは、iptableをインストールします。
$ sudo apt-get install iptables-persistent
  • 現在の設定を確認(以下のように何も制限されていない状態になっているはず)
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
  • iptableのルールを設定

今回は、SSH(SFTP)、HTTP、HTTPSのポートを許可して、他の通信は拒否するように設定します。

fireWallのイメージ図(許可したサービスのみ許可してそれ以外のサービスは拒否)

ファイアウォール(iptables)のルールファイル「rules.v4」を作成します。

$ sudo vi /etc/iptables/rules.v4

rules.v4の中身

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
#ループバックを許可
-A INPUT -i lo -j ACCEPT
#確立された全ての受信接続を許可
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
#DNSを許可
-A INPUT -p udp --sport 53 -j ACCEPT
#SSH(SSHに割り付けたポート番号xxxx)の新たな接続を許可
-A INPUT -p tcp -m state --state NEW --dport xxxx -j ACCEPT
#HTTP(80)/HTTPS(443)の許可
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
#SAMBAの許可
-A INPUT -p tcp --dport 139 -j ACCEPT
-A INPUT -p udp --dport 137 -j ACCEPT
-A INPUT -p udp --dport 138 -j ACCEPT
-A INPUT -p tcp --dport 445 -j ACCEPT
COMMIT
【よく使うコマンド、パラメータについて補足】

-A ルールの追加

INPUT 入ってくるパケット
OUTPUT 出ていくパケット
FORWARD 転送するパケット

-p ルールの対象となるプロトコルの種類を指定
   tcp:TCPプロトコル
   udp:UDPプロトコル
   icmp:ICMPプロトコル

-m state –state :
 ・NEW 新しい接続
 ・ESTABLEISHED すでに許可されている接続
 ・RELATED 新しくかつ許可された接続
 ・NVALID 無効な接続


--sport 送信側のポート指定
--dport 受信側のポート指定

ACCEPT パケットを許可
DROP パケットを拒否
REJECT パケットを拒否して制御メッセージを送信
  • 新しいルールを適用する
$ sudo iptables-apply /etc/iptables/rules.v4
Applying new iptables rules from '/etc/iptables/rules.v4'… done.
Can you establish NEW connections to the machine? (y/N) y
… then my job is done. See you next time.
  • 設定が適用されたか確認
$sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT udp -- anywhere anywhere udp spt:domain
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:xxxx
ACCEPT tcp -- anywhere anywhere tcp dpt:http
ACCEPT tcp -- anywhere anywhere tcp dpt:https
ACCEPT tcp -- anywhere anywhere tcp dpt:netbios-ssn
ACCEPT udp -- anywhere anywhere udp dpt:netbios-ns
ACCEPT udp -- anywhere anywhere udp dpt:netbios-dgm
ACCEPT tcp -- anywhere anywhere tcp dpt:microsoft-ds
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination

意図した設定が有効になっていればOKです。

以下は、設定時に調査した内容(メモ)です。

iptableの設定について

  • 代表的なサービスのプロトコルとポート番号
サービス名プロトコルとポート番号
httpサーバー(HTTP)TCP 80
httpサーバー(SSL)TCP 443
メールサーバー(POP3)TCP 110
メールサーバー(IMAP)TCP 143
メールサーバー(SMTP)TCP 25
メールサーバー(submission port)TCP 587
FTPTCP 20, 21
SSH、SFTPTCP 22
よく使われるサービスのポート番号は、ウェルノウンポート番号(WELL KNOWN PORT NUMBERS)といって 0〜1023までのポート番号のどこかに割り当てられている。

iptableの基本的な考え方

iptablesには、INPUT、OUTPUT、FORWORDという3つのポリシーがあります。それぞれの通信の基本ポリシーを”DROP”(拒否)、”ACCEPT”(許可)のどちらかに設定できます。

INPUTは、サーバーに入ってくる通信のポリシーです。ここでは基本ポリシーを”DROP”にして、あとで個別のポートに対して許可する設定にします。
OUTPUTは、サーバーから出て行く通信のポリシーです。基本ポリシーは”ACCEPT“にします。
FORWARDは、受信したデータを他のサーバーへ転送する際に適用される設定です。ここでは、特に転送するサーバーは無いので”DROP”にします。

iptableの3つのポリシー(INPUT,OUTPUT,FORWARD)

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA