2014年8月4日月曜日

IP Filterの設定

IP FilterはFreeBSDに標準でインストールされているパケットフィルタリング機能。
その設定メモ。

パケットフィルタリング機能とはファイアウォール機能の1つで、ネットワークサーバへから送信されるパケットのヘッダの情報を参照して通過させるかどうか判断する。
IP Filterはフィルタリングルールをipf.rulesで設定できる。

iplモジュールをロードする

IP Filterを利用するにはカーネルを再構築する方法もある。
kldloadでipl.koファイルをロードすることで利用できるのでこちらの方法で実施した。

#kldload ipl⏎ ←iplモジュールをロードする
#kldstat⏎ ←ipl.koがあるかどうか確認する
#vi /boot/loader.conf⏎ ←起動時にipl.koをロードできるようにviでloader.confを開く
ipl_load="YES" ←保存して閉じる

rc.confを設定する

iplモジュールをロードした後に設定を有効にするにはrc.confにいくつか設定をする必要がある。

#vi /etc/rc.conf⏎ ←viでrc.confを開く
ipfilter_enable="YES" ←ipfilterを有効にする
ipfilter_rules="/etc/ipf.rules" ←ipfilterのフィルタリングルールのあるディレクトリの指定
ipfilter_flags="" ←IP Filterの実行時のオプションを追加する場合は入力するらしい
ipmon_enable="YES" ←IP Filterのログをとれるようにする
ipmon_flags="-D /var/log/ipflog" ←ログをとるときのオプションを指定するらしい

ここまで入力したら保存して閉じる

サンプルルールを作成する

perlを利用したサンプルルール作成スクリプトがあるのでサンプルルールを作成する。
保存場所はrc.confで指定したディレクトリ。

#perl /usr/share/examples/ipfilter/mkfilters | grep -v inet6 > /etc/ipf.rules.sample⏎ ←ipf.rules.sampleというファイル名で作成
#cat /etc/ipf.rules.sample#9166; ←ipf.rules.sampleの内容を確認する

ipf.rulesを編集する

ipf.rules.sampleを元にipf.rulesを編集する。

以下が詳しい。

manページ — IPF
インターネットサーバー設定・運用 -IP Filter-

#vi /etc/ipf.rules⏎ ←viでipf.rulesを開く
#
# The following routes should be configured, if not already:
#
# route add サーバのIPアドレス localhost 0
#
block in log quick from any to any with ipopts ←標準的ではない長さのヘッダ(IPオプション)を持つパケットをブロックする
block in log quick proto tcp from any to any with short ←短すぎるTCPポートからのパケットをブロックする
pass in on ネットワークインターフェース名 all head 100 ←内向きのパケットを100グループにし、許可する
block in from 127.0.0.0/8 to any group 100 ←ループバックアドレスからの内向きのパケットはすべてグループ100にしてブロックする
block in from サーバのIPアドレス/32 to any group 100 ←サーバのIPアドレスからの内向きのパケットはすべてグループ100にしてブロックする
block in proto udp all group 100 ←udpポートからのパケットをすべてグループを100にしてブロックする
pass in quick proto tcp all flags A/A group 100 ←接続が確立したtcpポートからの内向きのパケットをグループ100にして許可する
block return-rst in quick proto tcp from any to any port = 113 group 100 ←113番ポートからのtcpリセットのパケットをグループ100にしてブロックする
pass in quick proto tcp from any to any port = 20 flags S/SA keep state group 100 ←20番ポートのFTPのSYN-ACKの組のうち、SYNフラグのみが設定されている戻りのtcpパケットをグループ100にして許可する
pass in quick proto tcp from any to any port = 21 flags S/SA keep state group 100 ←21番ポートのFTPのSYN-ACKの組のうち、SYNフラグのみが設定されている戻りのtcpパケットをグループ100にして許可する
pass in quick proto tcp from any to any port = 22 flags S/SA group 100 ←22番ポートのSSHのSYN-ACKの組のうち、SYNフラグのみが設定されているtcpパケットをグループ100にして許可する
pass in quick proto tcp from any to any port = 25 flags S/SA group 100 ←25番ポートのSMTPのSYN-ACKの組のうち、SYNフラグのみが設定されているtcpパケットをグループ100にして許可する
#pass in quick proto tcp from any to any port = 53 flags S/SA group 100 ←53番ポート(DNS)のSYN-ACKの組のうち、SYNフラグのみが設定されているtcpパケットをグループ100にして許可する(今回はコメントアウト)
#pass in quick proto udp from any to any port = 53 group 100 ←53番ポート(DNS)のSYN-ACKの組のうち、SYNフラグのみが設定されているudpパケットをグループ100にして許可する(今回はコメントアウト)
pass in quick proto tcp from any to any port = 80 flags S/SA group 100 ←80番ポート(HTTP)のSYN-ACKの組のうち、SYNフラグのみが設定されているtcpパケットをグループ100にして許可する
pass in quick proto tcp from any to any port = 110 flags S/SA group 100 ←110番ポート(POP3)のSYN-ACKの組のうち、SYNフラグのみが設定されているtcpパケットをグループ100にして許可する
pass in quick proto tcp from any to any port = 143 flags S/SA group 100 ←143番ポート(IMAP)のSYN-ACKの組のうち、SYNフラグのみが設定されているtcpパケットをグループ100にして許可する
pass in quick proto tcp from any to any port = 443 flags S/SA group 100 ←443番ポート(HTTPS)のSYN-ACKの組のうち、SYNフラグのみが設定されているtcpパケットをグループ100にして許可する
pass in quick proto tcp from any to any port = 465 flags S/SA group 100 ←465番ポート(SMTPS)のSYN-ACKの組のうち、SYNフラグのみが設定されているtcpパケットをグループ100にして許可する
pass in quick proto tcp from any to any port = 993 flags S/SA group 100 ←993番ポート(POP3S)のSYN-ACKの組のうち、SYNフラグのみが設定されているtcpパケットをグループ100にして許可する
pass in quick proto tcp from any to any port = 995 flags S/SA group 100 ←995番ポート(IMAPS)のSYN-ACKの組のうち、SYNフラグのみが設定されているtcpパケットをグループ100にして許可する
pass in quick proto tcp from any to any port 4000 >< 4029 flags S/SA keep state group 100 ←4001~4028番ポート(FTP PASV)のSYN-ACKの組のうち、SYNフラグのみが設定されているtcpパケットをグループ100にして許可する
block in log quick proto tcp all flags S/SA group 100 ←上記以外の内向きのポートのtcpパケットをグループ100にしてブロックしてログに残す
pass in proto udp from any port = 53 to any group 100 ←53番ポート(DNS)問い合わせた帰りのudpパケットをグループ100にして許可する
pass in proto udp from any port = 123 to any group 100 ←123番ポート(NTP)問い合わせた帰りのudpパケットをグループ100にして許可する
block in log quick proto icmp all group 100 ←icmpポート(主にpingなどで利用)からの内向きのパケットをすべてブロックし、ログに残す
pass in log quick proto icmp all icmp-type 0 group 100 ←icmpポート(主にpingなどで利用)のうちtype0(Echo Reply)からの内向きのパケットをすべて許可し、ログに残す
pass in proto icmp all icmp-type 3 group 100 ←icmpポートのうちtype3(Destination Unreachable-宛先到達不可)からの内向きのパケットをすべて許可し、ログに残す
pass out on ネットワークインターフェース名 all head 150 ←サーバのネットワークインターフェースからの外向きのパケットを150グループにし、許可する
block out from 127.0.0.0/8 to any group 150 ←ループバックアドレスからの外向きのパケットはすべて150グループにしてブロックする
block out from any to 127.0.0.0/8 group 150 ←ループバックアドレスへのすべての外向きのパケットをグループ150にしてブロックする
block out from any to サーバのIPアドレス/32 group 150 ←サーバのIPアドレスへのすべての外向きのパケットをグループ150にしてブロックする
pass in quick on lo0 all ←ループバックアドレスの内向きのパケットはすべて許可する
pass out quick on lo0 all ←ループバックアドレスの外向きのパケットはすべて許可する;
#ipf -Fa -Z -f /etc/ipf.rules⏎ ←設定を反映する

#ipfstat -io⏎ ←ルールを確認する場合
#ipf -Fa⏎ ←ルールを削除する場合

0 件のコメント :

コメントを投稿

ご質問などあればこちらへどうぞ