フィルタは次のように動作させる必要があります。
認証済みの IP アドレスからの通信は許す(なんでも許す)
認証済みの IP アドレスからの HTTP (80/tcp) は認証 CGI へねじ曲げる。
有無をいわさず認証 CGI に誘導し、本人確認を行ないます。
上記以外の通信は許可しない。
ただし、例外があれば、それは適宜書いておく。 たとえば DHCP を許しておくといった具合に (たいていの PC は IP アドレスを自動設定するので、 DHCP を許可しておかないと事実上うごかない)。
OpenBSD PF (packet filter)を使う例です。
上で説明した動作を記述すると次のようになります。 なお、ここでは認証 CGI が自分自身(127.0.0.1)で動いています。 別のマシンでも OK です。
table <auth> persist file "/etc/nfsw/src_addrs.allow" rdr log on re0 proto tcp from !<auth> to any port 80 -> 127.0.0.1 port 30080 pass quick from <auth> to any block log all
[解説]
テーブル <auth> を定義します。 テーブル <auth> は認証済み IP アドレスのリストです。 テーブルの内容は、 PF 起動時にファイル /etc/nfsw/src_addrs.allow から読み込まれます。 よって、ファイルを書き換えた場合には、 PF の再起動もしくは設定ファイルのリロードが必要です。
table <auth> persist file "/etc/nfsw/src_addrs.allow"
! は NOT の意味です。 「認証済みでない」 IP アドレスからの HTTP (80/tcp) 通信を横取りし、 127.0.0.1 の 30080/tcp へねじ曲げます。 127.0.0.1 の 30080/tcp では認証 CGI が動いています。
rdr log on re0 proto tcp from !<auth> to any port 80 -> 127.0.0.1 port 30080
認証済みアドレスからの通信は何でも許します。 それら以外の通信は通しません。
pass quick from <auth> to any block log all
Copyright (C) 1993-2025 Ken'ichi Fukamachi mail:< fukachan at fml.org >