TCP Server

tcpwrapper を使って /etc/hosts.allow でアクセスをコントロールする他に、 DJB の tcpserver (ucspi-tcp)を使って データベースでアクセスをコントロールする方法があります。 生テキストの /etc/hosts.allow を使うよりも、データベース化している分速いです。

関連サイト


インストール

まずは tcpserver をインストールします。 ports では、/usr/ports/sysutils/ucspi-tcp です。

手動でインストールする場合は、ソースを持って来てコンパイルします。
% fetch http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
% tar zxvf ucspi-tcp-0.88.tar.gz
% cd ucspi-tcp-0.88
% make
% su
Password:
# make setup check

使い方

書式

tcpserver [ -1UXpPhHrRoOdDqQv ] [ -c limit ] [ -x rules.cdb ] [ -B banner ] [ -g gid ] [ -u uid ] [ -b backlog ] [ -l localname ] [ -t timeout ] host port program

オプション

オプション デフォルト 説明
-1 受信準備が完了した後に標準出力にローカルポート番号を出力する
-p ホスト名を調べた後、逆引きを問い合わせ、IPアドレスが一致しない場合、 $TCPREMOTEHOST を設定しない
-P ホスト名を調べた後、逆引きを問い合わせない
-h 接続元のホスト名をDNSに問い合わせて、結果を $TCPREMOTEHOST に格納する
-H 接続先のホストを DNS に問い合わせない
-r 接続元ホストから $TCPREMOTEINFO を取得する
-R 接続元ホストから $TCPREMOTEINFO を取得しない
-q エラーメッセージを出力しない
-Q エラーメッセージを出力する
-v エラーメッセージとステータスメッセージを出力する
-c 同時に接続できる数の上限
-x cdb ファイルに指定されたルールに従う
-B 接続時にバナーを出力する
-g ポートを受け付けるグループID
-u ポートを受け付けるユーザID
-b TCP SYNのバックログを許可する。SYN cookies をサポートしているシステムでは、バックログは無意味。
-l DNSでローカルホスト名を調べない。環境変数 $TCPLOCALHOST には localname を使用
-t 26(秒) 指定した秒後に、$TCPREMOTEINFO 接続を停止する

環境変数

PROTO 使用するプロトコル(デフォルトは TCP)
TCPLOCLIP ローカルホストの IP アドレス
TCPLOCALPORT ローカルホストの TCP ポート番号
TCPLOCALHOST ローカルホストのドメイン名。取得できない場合はセットされない。任意の文字列を含むことに注意
TCPREMOTEIP リモートホストの IP アドレス
TCPREMOTEPORT リモートホストの TCP ポート番号
TCPREMOTEHOST リモートホストのドメイン名。取得できない場合はセットされない。任意の文字列を含むことに注意
TCPREMOTEINFO IDENT によって取得されるリモートホストの情報。得られない場合は変数はセットされない

データベースによるアクセス制限

まずはアクセス制限のルールを書いたテキストファイルを用意します。 例えば、POP に関するルールを書いた次のようなファイルです(黒字部分のみ)。
123.45.67.89:allow (ホスト 123.45.67.89 からは許可)
111.:allow (111. から始まる IP を持つホスト全てから許可)
:deny (上記の他はすべて不許可)

メールの中継を制御するためには、環境変数 RELAYCLIENT を設定します

アクセス制限ファイルを、例えば /etc/tcp.pop として保存します。 これを tcprules(tcpserver と一緒にインストールされる)でデータベース化します。
# /usr/local/bin/tcprules /etc/tcp.pop.cdb /etc/tcp.pop.tmp < /etc/tcp.pop

-x オプションでデータベースを指定して tcpserver を起動します。 以下は、qmail (Maildir形式) + qmapop を使った例です。
# /usr/local/bin/tcpserver -x /etc/tcp.pop.cdb 0 pop3 qmail-popup (メールサーバ名) /var/qmail/bin/checkpassword qmail-pop3d Maildir & (1行で書く)

ファイアウォール外のサーバからファイアウォール内のホストに POP する場合、 無用な通信が発生しないように -HR のオプションを付けておくとよいでしょう。

参考サイト


FreeBSD の部屋


Last modified: Wed Apr 20 16:09:29 JST 2011