Pingに返答しなくするには?

 最近のサーバやルータは、Pingに返答しない設定になっていることが多い。
市販のルータ(ブロードバンド・ルータ)であれば簡単に設定できるが、
自分が利用するネットワークのサーバやルータは FreeBSDなのでそう簡単に設定できない。(実は知らないだけかも。(^_^;))
そこで "Ipfilter"を使って「Pingを返さない」ように設定してみました。


「Ipfilter」を設定する!

 当大学のネットワークは、ルータでセグメントごとにパケットがフィルタされており,
申請したプロトコル以外は通らないようになっている。
しかし,サーバー本体でも同様にパケットフィルタをかけて2重に設定すれば,
何らかの理由によってルータで穴が開いても,サーバ本体でブロックすることができる。
 FreeBSDでは,「ipfilter」を使った設定例が示されていたので,これを参考にした。
ちなみに 「ipfilter」は,「カーネルを再構築して組み込む方法」と
「カーネルにモジュールをロードする方法」の2種類があるようだ。


1,「Ipfilter」を有効にする

 どちらの方法を利用する場合も、 /etc/rc.conf (システム環境設定ファイル)に
以下を追記し、有効にしておく。

ipfilter_enable="YES"
ipfilter_rules="/etc/ipf.rules"
ipfilter_flags=""
ipmon_enable="YES"
ipmon_flags="-D /var/log/ipflog"


@,カーネルの再構築する方法

・カーネルソースを準備する
まず、カーネルソースがあるかどうかを確認し、 もし無い時は、
 # /stand/sysinstall
を実行してメニューの
 Configure -->Distribution --> src --> DES以外のkernel srcで
ソースをインストールする。
・カーネル設定用ファイルを作成する
新しいカーネルの設定用ファイルは、現在のカーネル設定用ファイルをベースにして作る。

# cd /usr/src/sys/i386/conf
# cp GENERIC NEWKERNEL ←(これから作るカーネルの名前)
・IPFILTERの設定を追加する
設定ファイル(NEWKERNEL)の最後に以下を追加する。

 options  IPFILTER
 options  IPFILTER_LOG
 options  IPFILTER_DEFAULT_BLOCK
・カーネルを make する

設定ファイルをコンフィグレーションする。

# config NEWKERNEL

成功すると次のような表示があるので、
カーネル構築のためのディレクトリに移動して、
コンパイルする。

Dont't forget to do a ``make depend''
kernel build directory is ../../compile/NEWKERNEL

# cd ../../compile/NEWKERNEL ←ディレクトリを移動
# make depend ; make ←コンパイル
・新しいカーネルをインストールする

# make install

新しいカーネルは、 /kernel にインストールされ、
一つ前のカーネルは、 /kernel.old にリネームされる。
・新しいカーネルを有効にする

新しいカーネルを有効にするにはリブートする必要がある。

#reboot


A,モジュールをロードする方法

・モジュールをカーネルに組み込む

rootから、カーネルにモジュールをロードして組み込む。

# kldstat ←カーネルの状態を表示
Id Refs Address Size Name
1 2 0xc0100000 204ffc kernel
2 1 0xc1314000 15000 linux.ko
# kldload ipl ←モジュールをカーネルにロード
# kldstat
Id Refs Address Size Name
1 3 0xc0100000 204ffc kernel
2 1 0xc1314000 15000 linux.ko
3 1 0xc196c000 18000 ipl.ko ← 追加されている 
これだけではリブートすると元に戻ってしまうので、ブート時に自動組込されるよう、/boot/loader.conf に下記を追記する。
ipl_load="YES"


2,ルールを設定する

・ルールを作成する
設定ファイル : /etc/ipf.rules にルールを記述します。
以下に設定例を記述します。
#
# The following routes should be configured, if not already:
# route add "aaa.bbb.ccc.ddd" localhost 0
#

# 不正なIPパケットをすべて拒否してログに記録
block in log quick from any to any with ipopts frag
block in log quick proto tcp from any to any with short

########################################################
# 外部(Internet)からの入力(グループ 100)
pass in quick on fxp0 all head 100

# アドレス偽装防止
block in from 127.0.0.0/8 to any group 100
block in from aaa.bbb.ccc.ddd/32 to any group 100

# UDP パケットもデフォルトで拒否
block in proto udp all group 100

# 接続が確立されたパケットの通過を許可
pass in quick proto tcp all flags A/A group 100

# 外部からの SSH接続を許可する
pass in quick proto tcp from any to any port = 22 flags S/SA group 100

# 外部からの SMTP接続を許可する
pass in quick proto tcp from any to any port = 25 flags S/SA group 100

# IDENT には答えない
block return-rst in quick proto tcp from any to any port = 113 group 100

# DNS サーバを立てている場合
pass in quick proto tcp from any to any port = 53 flags S/SA group 100
pass in quick proto udp from any to any port = 53 group 100

# WWW サーバを立てている場合
pass in quick proto tcp from any to any port = 80 flags S/SA group 100
pass in quick proto tcp from any to any port = 443 flags S/SA group 100

# NTP サーバを立てている場合
pass in quick proto tcp from any to any port = 123 flags S/SA group 100
pass in quick proto udp from any to any port = 123 group 100

# それ以外の外部からの TCP 接続を拒否し、ログに残す
block in log quick proto tcp all flags S/SA group 100

# 外部の DNS に問い合わせた帰りのパケット
pass in proto udp from any port = 53 to any group 100

# 外部NTPサーバからの帰りは許可
pass in proto udp from any port = 123 to any group 100

# 内部から外部への ping は許可
block in log quick proto icmp all group 100
pass in log quick proto icmp all icmp-type 0 group 100

# RFC2979
pass in proto icmp all icmp-type 3 group 100

########################################################
# 外部への出力(グループ 200)

pass out quick on fxp0 all head 200

# アドレス偽造防止
block out from 127.0.0.0/8 to any group 200
block out from any to 127.0.0.0/8 group 200
block out from any to aaa.bbb.ccc.ddd/32 group 200

# 接続された TCP パケットを許可
#pass out proto tcp all flags A/A group 200

# 内部から外部へ出ていくパケットを許可
pass out log quick proto icmp all keep state group 200
pass out log quick all

# 外部への接続開始を許可
pass out proto tcp all flags S/SA group 200

# 外部の NTP サーバへの問い合わせを許可
pass out proto udp from any to any port = 123 group 200

########################################################
# ループバックへのルール(グループ 0)
# (最後にあっても OK)
pass in quick on lo0 all
pass out quick on lo0 all


・ルールを反映する
記述したルールを反映します。
# ipf -Fa -Z -f /etc/ipf.rules (設定の反映)
input packets: blocked 2 passed 2 nomatch 0 counted 0
output packets: blocked 5 passed 2 nomatch 1 counted 0
input packets logged: blocked 2 passed 0
output packets logged: blocked 0 passed 0
packets logged: input 0-0 output 0-0

・ルールを確認する
ルールがちゃんと反映されているか確認します。

#ipfstat -i 入力側のルールの確認
#ipfstat -o 出力側のルールの確認