pfで、APNICで日本に割り当てられているIPアドレス範囲からだけSSHを許可する
pf を使ってフィルタリングしている FreeBSD 5.3R なサーバに対して、「SSHでログインできる範囲を日本だけに絞りたいなぁ」と思ってやってみた。
が、参考文献。
さてまずは。APNICで日本に割り当てられているIPアドレスのリストを作ります。
楽をしたいので、ipfwとBINDによるNaverRobot対策フィルタ の krfilter.pl を落としてきて、名前だけ jpfilter.pl に直して。
vi でチョコチョコ直して、APNICから割り当てリストを落としてきて。
失礼ながら形だけ krfilter.pl の機能を利用させてもらって、さくっとリストを作ります。
○jpfilter.pl を実行可能にして、編集 $ chmod +x jpfilter.pl $ vi jpfilter.pl ○編集した内容 $ diff -U0 krfilter.pl jpfilter.pl --- krfilter.pl Fri Apr 29 21:13:52 2005 +++ jpfilter.pl Fri Apr 29 21:15:03 2005 @@ -1 +1 @@ -#!/usr/local/bin/perl +#!/usr/bin/perl @@ -12 +12 @@ -@country = ('KR'); +@country = ('JP'); @@ -47,0 +48 @@ ※Mac OS Xなので、/usr/local/bin/perl を /usr/bin/perl に直してます。 ※で、国名の KR を JP に置き換えてます。 ○APNICから割り当てIPアドレス一覧のリストを取得 $ curl -O http://ftp.apnic.net/stats/apnic/delegated-apnic-latest % Total % Received % Xferd Average Speed Time Curr. Dload Upload Total Current Left Speed 100 619k 100 619k 0 0 219k 0 0:00:02 0:00:02 0:00:00 247k ○krfilter.plの機能を(形だけ)利用しつつ、リスト作成 $ ./jpfilter.pl 1000 < delegated-apnic-latest | awk '{print $6}' > jp.list ○確認 $ head jp.list 58.0.0.0/15 58.3.0.0/17 58.4.0.0/15 58.12.0.0/15 58.70.0.0/16 58.80.0.0/15 58.84.0.0/18 58.85.0.0/16 58.88.0.0/13 58.98.0.0/16
な感じです。んで、この jp.list をサーバに送り込んで、/usr/local/etc/jp.list として配置。
/etc/pf.conf を編集して、pf を再起動させます。
○サーバに jp.list をコピーして、サーバにログイン $ scp ./jp.list hoge@hunya: $ ssh hoge@hunya ○ /usr/local/etc/jp.list として配置 $ sudo -s # mv /home/hunya/jp.list /usr/local/etc/ ○ /etc/pf.conf を編集 # cd /etc # cp -p pf.conf pf.conf.bak # vi pf.conf ○編集した内容 # diff -U0 pf.con.bak pf.conf --- pf.conf.bak Fri Apr 29 21:46:48 2005 +++ pf.conf Fri Apr 29 21:18:58 2005 @@ -20,0 +21,2 @@ +table <japan> persist file "/usr/local/etc/jp.list" + @@ -58 +60,2 @@ -pass in quick on $ext_if inet proto tcp from any to $ext_if port 22 keep state +#pass in quick on $ext_if inet proto tcp from any to $ext_if port 22 keep state +pass in quick on $ext_if inet proto tcp from <japan> to $ext_if port 22 keep state ※要は、jp.list を <japan> ってゆー table として読み込んで、 SSHをpassしてるルールに <japan> を入れてるだけです。 ○ pf を再起動 # /etc/rc.d/pf restart No ALTQ support in kernel ALTQ related functions disabled Disabling pf. No ALTQ support in kernel ALTQ related functions disabled pf disabled Enabling pf. No ALTQ support in kernel ALTQ related functions disabled No ALTQ support in kernel ALTQ related functions disabled No ALTQ support in kernel ALTQ related functions disabled pf enabled ○ pf のフィルタルールを確認 # pfctl -sr ○一応 pf の状況を全て再確認 # pfctl -sa
以上です。って、要は、<japan> ってゆー pf の table をファイルから読み込ませてるだけなんですが。
pf の table については、PF: The OpenBSD Packet Filter の PF: Tables を参照のこと。
後は手元の SL-C760 から AIR EDGE 経由でこのサーバに入ってみて、確認してみたり。
上手くいってるみたいです。> 誰となく
まぁただ、あくまでAPNICの国別割り当てリストに載ってる範囲しか許可されてない訳ですが。
# うぉ。diff の - やら + が list に置き換わってた(汗