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 &#39;{print $6}&#39; > 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 FilterPF: Tables を参照のこと。


後は手元の SL-C760 から AIR EDGE 経由でこのサーバに入ってみて、確認してみたり。
上手くいってるみたいです。> 誰となく
まぁただ、あくまでAPNICの国別割り当てリストに載ってる範囲しか許可されてない訳ですが。


# うぉ。diff の - やら + が list に置き換わってた(汗