サーバー内の設定だけでできるファイアウォール iptables の基本設定について書きます。
■ インターネットの脅威
インターネット上に公開されたサーバーはファイアウォールなしの場合、必ず(#ここ強調します。例外なく100%) クラッキング(ハッキング)やDoS攻撃などアタックされるものです。
サーバー運営初心者の方々は、はじめ結構なめてますが、アタックは必ず来ます。多ければ連日。
私もかつて初めてサーバーというものを自分で構築したとき、それは目立たないひっそりとした自宅サーバーなのに、まだろくにホームページも公開していないのに、たった数日でクラッキング(ハッキング)されて内部のプログラム/usr/binの中などがすり替えられました。
そのとき思ったものです。…. 怖い … インターネット怖い~。
アタックそのものが来ないようにする方法はありませんが、破られないように防ぐ方法はあります。
(家を建ててドアがあれば、コソ泥にドアノブを触らせないようにはできないけど鍵は掛けられます)
何か最低限のセキュリティ対策は必要です。
■ ファイアウォール
ファイアウォールとは、予め決めたIPアドレスとポートのみに接続を許すように制限することです。
専用機器を使ったファイアウォールのサービスは通常有料で金額も少々お高いです(毎月数千円~数万円)。
しかし専用機器を使ったファイアウォールがなくてもサーバーには iptables という機能が備わっており、自分でファイアウォールが立てられます。
無料でサーバー内の設定だけでできるファイアウォール、これはしておいて損は無いです。
少なくとも使わないポートは閉じて、必要に応じて SSH などの危険なものは数分間に数回しか許さない、などの対策もあればなおよいでしょう。
■ iptables
(1) インストール
普通はインストールされていますが、されていなければインストールします。
# yum install iptables
起動・終了・再起動
# service iptables start # service iptables stop # service iptables restart
自動起動設定
# chkconfig iptables on
(2) ファイル構成
設定ファイルはIPv4用2つ、IPv6用2つの計4つ。
うち2つは最初はファイルがありません。自分で作ります。
/etc/sysconfig/ iptables-config iptables ... 自分で作ります ip6tables-config ip6tables ... 自分で作ります
(3) 設定
基本の設定は以下の通り、そのまんまコピーでよいと思います。
制御ファイル(IPv4用)
/etc/sysconfig/iptables-config
# 設定変更はここだけ。※PASV FTP を可能にする IPTABLES_MODULES="ip_conntrack_ftp ip_nat_ftp" # 以下はデフォルトのまま 変更無し IPTABLES_MODULES_UNLOAD="yes" IPTABLES_SAVE_ON_STOP="no" IPTABLES_SAVE_ON_RESTART="no" IPTABLES_SAVE_COUNTER="no" IPTABLES_STATUS_NUMERIC="yes" IPTABLES_STATUS_VERBOSE="no" IPTABLES_STATUS_LINENUMBERS="yes"
※もし IPTABLES_MODULES に ip_nat_ftp を追加するとFTPがうまくいかない場合外す
※CentOS 5.7 / 5.8 kernel 2.6.18.xxx バグがある模様
http://bugs.centos.org/view.php?id=5135
IP/ポート制限の設定(IPv4用)
/etc/sysconfig/iptables
### ルール # 基本は、-A チェーン名 マッチング条件 -j ターゲット # -A チェーン名 : チェーンに新たなルールを追加 # -j(--jump) ターゲット : 条件したパケットをどうするか指定 # ターゲットには、ACCEPT(許可)/DROP(破棄)/REJECT(拒否)ユーザ定義チェーンなどなどを指定 # # マッチング条件の一部 # 頭に"!"をつけると、notという意味 # -i(--in-interface) 受信インタフェース : filterテーブルでは、INPUT/FORWARDチェーンで使用可能 # -o(--out-interface) 送信インタフェース : filterテーブルでは、OUTPUT/FORWARDチェーンで使用可能 # -p(--protocol) プロトコルまたはプロトコル番号 : 指定できるプロトコルは、tcp/udp/icmp/all # -s(--source、--src) 送信元アドレス : "192.168.0.1"、"192.168.0.0/24"、"192.168.0.0/255.255.255.0"のように指定 # -d(--destination、--dst) 送信先アドレス : "192.168.0.1"、"192.168.0.0/24"、"192.168.0.0/255.255.255.0"のように指定 # # 以下は拡張されたマッチングの一部 # 頭に"!"をつけると、notという意味 # -m tcp --sport(--source-port) TCP送信元ポート : "-p tcp"のとき使用可能、ポート範囲は"0:1023"のように指定 # -m tcp --dport(--destination-port) TCP送信先ポート : "-p tcp"のとき使用可能、ポート範囲は"0:1023"のように指定 # -m udp --sport(--source-port) UDP送信元ポート : "-p udp"のとき使用可能、ポート範囲は"0:1023"のように指定 # -m udp --dport(--destination-port) UDP送信先ポート : "-p udp"のとき使用可能、ポート範囲は"0:1023"のように指定 # -m state --state 接続状態 : 接続状態には、NEW(新規)/ESTABLISHED(接続中)/RELATED(既存の接続に関係?)/INVALID(その他)を指定 # --icmp-type ICMPタイプ : "-p icmp"のとき使用可能、指定できるICMPタイプは"iptables -p icmp -h"で確認 # # プロトコル -p 50 ... ipv6-crypt/ ESP(Encapsulating Security Payload) # プロトコル -p 51 ... ipv6-auth / AH(Authentication Header) ただし、Linux FreeS/WANではAHは使用しない # # ↓ここから設定 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :RH-Firewall-1-INPUT - [0:0] -A INPUT -j RH-Firewall-1-INPUT -A FORWARD -j RH-Firewall-1-INPUT -A RH-Firewall-1-INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset -A RH-Firewall-1-INPUT -i lo -j ACCEPT -A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT -A RH-Firewall-1-INPUT -p 50 -j ACCEPT -A RH-Firewall-1-INPUT -p 51 -j ACCEPT -A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # ここまでは、まずお約束、以下、必要に応じて # dns -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT # http -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT # ssh -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT # ftp -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT # mail -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 587 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 110 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 143 -j ACCEPT # proxy -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT # webmin / usermin -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10000 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 20000 -j ACCEPT # Reject -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited COMMIT
制御ファイル(IPv6用)
/etc/sysconfig/ip6tables-config
※特に変更無し
制御ファイル(IPv6用)
/etc/sysconfig/iptables-config
### ルール # 基本は、-A チェーン名 マッチング条件 -j ターゲット # -A チェーン名 : チェーンに新たなルールを追加 # -j(--jump) ターゲット : 条件したパケットをどうするか指定 # ターゲットには、ACCEPT(許可)/DROP(破棄)/REJECT(拒否)ユーザ定義チェーンなどなどを指定 # # プロトコル -p 50 ... ipv6-crypt/ ESP(Encapsulating Security Payload) # プロトコル -p 51 ... ipv6-auth / AH(Authentication Header) ただし、Linux FreeS/WANではAHは使用しない # *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :RH-Firewall-1-INPUT - [0:0] -A INPUT -j RH-Firewall-1-INPUT -A FORWARD -j RH-Firewall-1-INPUT -A RH-Firewall-1-INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset -A RH-Firewall-1-INPUT -i lo -j ACCEPT -A RH-Firewall-1-INPUT -p ipv6-icmp -j ACCEPT -A RH-Firewall-1-INPUT -p 50 -j ACCEPT #-A RH-Firewall-1-INPUT -p 51 -j ACCEPT -A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT -A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 今はIPv6の接続は主流でないので設定不要。 # IPv6時代が来たら考えましょう。 # Reject -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited COMMIT
今日はここまで。
その他もう少し進んだ設定はいずれ。