| トップ | Solaris | FreeBSD | Gentoo | CentOS | Fedora | Windows | Tips | 自宅サーバの動作確認 | サイト内検索(Namazu) | サイト内検索(HE) |
「IP Filter」を利用してパケットフィルタリングを行う。
ここでは通信のみの制御で、ルータとしての機能は行わない事とする。
当然の事ながら、ここでの設定はあくまで一例なので、この通りに行えば良い、という訳ではなく各自の環境に合わせて設定する。
なお、「Swatch」を利用してログを監視し、アクセス制限を行う場合はこちらを参照。
有効化するインタフェースの設定
Solaris10では「IP Filter」がインストールされるが、デフォルトでは無効である為有効にする。
まず、/etc/ipf/pfil.apファイルから設定したいインタフェースのコメントを解除する。
ここではelxlの行のコメントを解除しているが、それぞれ環境に合わせて設定する。
Solaris# vi /etc/ipf/pfil.ap <= 設定ファイルの編集 #elxl -1 0 pfil ↓ elxl -1 0 pfil <= コメント解除 |
設定の反映
pfilを再起動させ、上記の設定を反映させる。
Solaris# svcadm restart pfil |
モジュールの組込み
システムを再起動し、モジュールを組み込む
Solaris# sync;sync;sync Solaris# shutdown -y -i6 -g0 <= システムの再起動 |
システムの再起動後、以下のようにインタフェースに組み込まれているモジュールを確認する。
Solaris# ifconfig elxl0 modlist 0 arp 1 ip 2 pfil <= 確認 3 elxl |
「IP Filter」のフィルタリングの設定ファイルは/etc/ipf/ipf.confになり、基本的な構文は以下の通り。
action [in|out] option keyword |
ここでは、上記のそれぞれについて主要なものだけ記述する。
action
actionでは許可するものは pass、破棄するものは block を指定する。
[in|out]
[in|out]は入力の場合、in を、出力の場合は out を指定する。
option
optionで指定出来る主なものは以下の通り。
なお、複数のoptionを指定する場合、上に記述しているものから指定する。
| option | 説明 |
|---|---|
| log | ログに残す |
| quick | 該当する場合、以降のルールをチェックせず適用 |
| on interface | インタフェース |
keyword
keywordで指定出来る主なものは以下の通り。
なお、複数のkeywordを指定する場合、上に記述しているものから指定する。
| keyword | 説明 |
|---|---|
| proto プロトコル | プロトコル(tcp,udp,icmp等) |
| from,to/all/ IPアドレス | from:発信元IPアドレス to:宛先IPアドレス IPアドレスにanyを指定すると全てに一致する。 なお、allを指定するとfrom any to anyになる。 |
| port = ポート番号 | ポート番号。 この設定はprot tcpにした場合のみ指定出来る。 |
| with | パケットに関連する指定された属性に対して一致をとる。 オプションがない場合にパケットを一致させるには、キーワードの前に not または no と記述する。 |
| flags flags | TCPのフラグを指定。 以下の左のように指定する。右はフラグの内容。 F:FIN(終了:送信終了) S:SYN(同期:接続要求) R:RST(リセット:強制切断要求) P:PSH(プッシュ:バッファリングせず、すぐアプリケーションに届けるよう要求) A:ACK(肯定:パケットを受け付けた) U:URG(緊急:緊急で扱うべきデータであることを示す) フラグは、flags フラグ/フラグマスク と記述する。 フラグマスクを指定しないと全て指定したことになる。 例:flags S/SA 拒否:SYN+ACK 許可:SYN+RST、SYN+FIN、SYN+URG、SYN+PSH |
| keep keep-options | 保存しておくパケットの情報を決定する。 keep-optionsでは一致したパケットをアクセス制御リストのチェックなしで通過させる。 以下が使用可能な主なkeep-options。 state:セッションに関する情報を、TCP、UDP、ICMPパケットで保存する。 frags:パケットのフラグメントに関する情報を保存し、後のフラグメントにその情報を適用する。 |
| head number | numberで指定されるフィルタリングルールに対して、新しいグループを作成する。 |
| group number | numberで指定されるグループに対してフィルタリングルールを追加する。 |
「IP Filter」の設定
基本的なルールの記述方法の為に簡単なものを記述する。
Solaris# vi /etc/ipf/ipf.conf <= 設定ファイルの編集 ################################### # デフォルトルール # ################################### # 怪しげなパケットはログを取って破棄 block in log quick all with opt rr block in log quick all with opt ts block in log quick all with opt lsrr block in log quick all with opt ssrr block in log quick all with ipopts block in log quick proto tcp all with short # 断片化されたパケット block return-icmp-as-dest(host-unr) in log quick all with frag # ループバックの許可 pass in quick on lo0 from 127.0.0.0/8 to 127.0.0.0/8 pass out quick on lo0 from 127.0.0.0/8 to 127.0.0.0/8 ################################### # INPUT # ################################### # 基本破棄 block in on elxl0 all head 100 # 送信元のおかしなものはログを取って破棄 block in log quick from 127.0.0.0/8 to any group 100 block in log quick from 10.0.0.0/8 to any group 100 block in log quick from 169.254.0.0/16 to any group 100 block in log quick from 172.16.0.0/12 to any group 100 # ping(内部ネットワークのみ許可) pass in quick proto icmp from 192.168.0.0/24 to any icmp-type 0 group 100 pass in quick proto icmp from 192.168.0.0/24 to any icmp-type 8 group 100 # SSH pass in quick proto tcp from any to any port = 22 flags S/SA keep state group 100 # DNS pass in quick proto tcp/udp from 192.168.0.0/24 to any port = 53 keep state group 100 # IDENT block return-rst in quick proto tcp from any to any port = 113 group 100 ################################### # OUTPUT # ################################### # 基本許可 pass out on elxl0 all head 200 # Samba pass out quick proto tcp/udp from any to 192.168.0.0/24 port = 136 >< 140 keep state group 200 block out quick proto tcp/udp from any to any port = 136 >< 140 group 200 pass out quick proto tcp/udp from any to 192.168.0.0/24 port = 445 keep state group 200 block out quick proto tcp/udp from any to any port = 445 group 200 # ping(内部ネットワークのみ許可) pass out quick proto icmp from any to 192.168.0.0/24 icmp-type 0 group 200 pass out quick proto icmp from any to 192.168.0.0/24 icmp-type 8 group 200 block out quick proto icmp all group 200 |
「IP Filter」の有効化
Solaris# svcadm enable ipfilter <= 「IP Filter」の有効化 |
ルールの確認
Solaris# ipfstat -ionh -i:インプット -o:アウトプット -n:ルール番号 -h:カウント |
ルール更新後の反映
「IP Filter」のルールを初期化した後、設定ファイルを読み込む。
Solaris# ipf -Fa <= ルールの初期化 Solaris# ipf -f /etc/ipf/ipf.conf <= 設定ファイルの読み込み Solaris# ipf -Fa -f /etc/ipf/ipf.conf <= 上記のコマンドを1回で行う場合 |
「IP Filter」の動的設定
不正アクセス対策等で動的にルールを追加・削除する場合、以下のようにする。
なお、「IPFilter」は基本的にラストマッチを採用しており、普通に追加すると最後に追加される。
その為、それ以前のルールで許可しておりquick指定があると追加したルールが適用されない。
そこで、最初に適用されるよう@1を指定する。
もしquick指定を設定していない場合、@1は不要。
なお、ここでは192.168.0.2からのアクセスを対象としている。
ルールの追加
Solaris# echo "@1 block in quick from 192.168.0.2 to any" | /usr/sbin/ipf -f - |
ルールの削除
上記で追加したルールを削除する場合、以下のようにする。
Solaris# echo "block in quick from 192.168.0.2 to any" | /usr/sbin/ipf -r -f - |
国別IPアドレスリスト破棄の設定
拒否したい国がある場合、以下のようなスクリプトを作成してアクセス拒否の設定をする。
Solaris# vi drop_country.sh <= 拒否スクリプトファイル作成
#!/sbin/sh
IPF="/usr/sbin/ipf"
WGET="/usr/sfw/bin/wget"
RM="/usr/bin/rm"
# 国別IPアドレスリスト取得
$WGET -q http://ftp.apnic.net/stats/apnic/delegated-apnic-latest # APNIC
$WGET -q ftp://ftp.arin.net/pub/stats/arin/delegated-arin-latest # ARIN
# 指定した国からのアクセスを破棄
DROP_COUNTRY(){
for IP in `cat $1 | grep "$2|$3|ipv4|"`
do
ADDR=`echo $IP |cut -d "|" -f 4`
TEMP=`echo $IP |cut -d "|" -f 5`
CIDR=32
while [ $TEMP -ne 1 ];
do
TEMP=`expr "$TEMP" / 2`
CIDR=`expr "$CIDR" - 1`
done
echo "@1 block in quick from $ADDR/$CIDR to any" | $IPF -f -
done
}
# 中国
DROP_COUNTRY delegated-apnic-latest apnic CN
DROP_COUNTRY delegated-arin-latest arin CN
# 韓国
DROP_COUNTRY delegated-apnic-latest apnic KR
DROP_COUNTRY delegated-arin-latest arin KR
# 北朝鮮
DROP_COUNTRY delegated-apnic-latest apnic KP
DROP_COUNTRY delegated-arin-latest arin KP
# 台湾
DROP_COUNTRY delegated-apnic-latest apnic TW
DROP_COUNTRY delegated-arin-latest arin TW
# 国別IPアドレスリスト削除
$RM delegated-apnic-latest
$RM delegated-arin-latest
Solaris# chmod 700 drop_country.sh <= 作成したスクリプトに実行権限付加
|
設定の保存
ルールを設定しても再起動すると元に戻ってしまうので、ルールを保存する。
Solaris# ipfstat -io > /etc/ipf/ipf.conf <= 現在の設定をファイルに書き込む |
一時的にIPFilterを無効にする場合
Solaris# ipf -Fa <= ルールの初期化 Solaris# svcadm disable ipfilter <= 「IP Filter」の無効化 |
永続的に無効にする場合は、はじめに編集した/etc/ipf/pfil.ap も元に戻し、システムを再起動する。