[Edit][Create New]
[ IndexPage / インストール / qmail ]

qmail

この階層のドキュメント一覧


FreeBSD2.2.xにqmailをインストールする。

ポリシー

sendmail運用中にインストールするので、なるべくメール不配達が起こらないように したい。

ダウンロード

こんだけ落とした。どっかのサイト見て書いてある通りに落としただけ。 前設定した時、ずいぶん面倒だった記憶があるが、確かに面倒だ。が、幸い なことに全てmake & make setupでうまく行った。

パッチを落して当てる

 # cd qmail-1.03

 # wget http://www.ckdhr.com/ckd/qmail-103.patch

 # wget http://www.ckdhr.com/ckd/qmail-103.patch

 # wget http://www.qmail.org/qmail-smtpd-relay-reject

 # patch < qmail-date-localtime.patch

 # patch < qmail-103.patch

 # patch < qmail-smtpd-relay-reject

ディレクトリ・ユーザーを作る

INSTALL/INSTALL.idsを見ながら作成。

 # mkdir /var/qmail

 # pw groupadd nofiles

 # pw useradd alias -g nofiles -d /var/qmail/alias -s /nonexistent

 # pw useradd qmaild -g nofiles -d /var/qmail -s /nonexistent

 # pw useradd qmaill -g nofiles -d /var/qmail -s /nonexistent

 # pw useradd qmailp -g nofiles -d /var/qmail -s /nonexistent

 # pw groupadd qmail

 # pw useradd qmailq -g qmail -d /var/qmail -s /nonexistent

 # pw useradd qmailr -g qmail -d /var/qmail -s /nonexistent

 # pw useradd qmails -g qmail -d /var/qmail -s /nonexistent

コンパイル

スーパーユーザーじゃないと上手く行かない。

 # make setup check

 % ./configure

postmasterのエイリアス等を作る

 # (cd ~alias; touch .qmail-postmaster .qmail-mailer-daemon .qmail-root)

 # chmod 644 ~alias/.qmail*

inetd.confを書きかえる。pop3の行をコメントアウト

 # vi /etc/inetd.conf

 # kill -HUP 119(ps -ax | grep inetd で調べたinetdのプロセス番号)

checkpassword

/etc/tcp.smtpを作る。

 # vi /etc/tcp.smtp

 # tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp

 # cp ./checkpassword /usr/local/bin/checkpassword

alias

 /var/qmail/bin/newaliases

を実行。/etc/aliases.cdb を更新する。結構エラーが出る。遊びで作った

 ....@kaede.to

が動かない。確かにRFC的には間違ってる。なるほど。

で、そのままほっといたら/etc/aliasesと/etc/aliases.dbの不整合でエラーが出てた。 すぐさま

 /usr/sbin/newaliases

を実行。こんどはコメントアウト「#」が行頭にないのでエラー。/etc/aliasesって そんな規則あったっけ。

fastforward を動かすためには、 /var/qmail/alias/.qmail-defaultに、

 | fastforward -d /etc/aliases.cdb

をいれる。これで完了

/usr/sbin/sendmailの入れ替え

/usr/sbin/sendmailをqmail用の物と差し替えてみる。 今思うと馬鹿なことをした。qmail用のスプールに溜まるんだから、届くわけない。

慌てて元に戻す。が、うまく送れない。ログを見ると、

 Cannot create "qfPAA19943" in "/var/spool/mqueue" (euid=1000): Permission denied

ってなってる。

 ls -l /var/spool/mqueue

を見ると、

 drwxr-xr-x  2 root  daemon  512 Nov 10 09:57 /var/spool/mqueue/

あれ?ここってどうなってたっけ?Stickyビット?だとしたら、何故外れてるんだ? と混乱したが、しばらく考え直してみて、原因は

 ls -l /usr/sbin/sendmail

 -rwxr-xr-x  5 root  kmem  290816 Apr 24  1999 /usr/sbin/sendmail*

こっちだよな普通。リネームしたときにパーミッションがクリアされてたらしい。

 -r-s--x--x  5 root  kmem  290816 Apr 24  1999 /usr/sbin/sendmail*

これでよし。危ない危ない。というか、不必要な手間を取ってしまった。

popの試験

スプールをどうするか悩んでたんだが、mbox2maildirというのがあるらしい。検索 すれば多分出てくる。Perlスクリプトだ。なんか

 require 'stat.pl';

という行でエラーがでるんだが、使ってないようなのでコメントアウトしたら動いた。 ~/Maildirを作ってガリガリ変換してくれる。

で、/var/qmail/rcから、

 /usr/local/bin/tcpserver 0 pop3 /var/qmail/bin/qmail-popup  /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir &

の部分だけ取り出して実行。が、popすると$USER/Maildirがない、と怒られる。 いや、あるぞと思っていろいろ調べてみたら、

 /usr/local/bin/tcpserver 0 pop3 /var/qmail/bin/qmail-popup ns.kaede.to /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir &

なぜかHOST名の部分が欠けてた。qmail自動設定シェルスクリプトから適当な 部分を切り張りして実行させてたから、ここに$HOSTかなんか書いてあったんだろう。

これでうまくいった。あとは、popper止めて、他のユーザのMaildirも作ってやるだけだ。

TODO

インストール

上の手順で、大体合ってたんだけど、各Home Directoryに.qmailを入れるのを 忘れていた&その所有者設定に気付かなかったため、しばらくサービスを止めてしまう。

あとは大体OKのように見えた。しかし……。

ハマる。

canada-mlへの送信ができない。canada-mlは、canada-mへ転送になっている。UNIX アカウント名が8文字しか認められていないためだ。

~alias/.qmail-canada-mlを設定しているのにちっとも動かない。/var/qmail/bin/newaliases を使ってみたり、いろいろ手を尽くしたが全滅。

2時間くらいハマったあと、待てよ……と思い、~canada/.qmail-mlを設定。

……動いた。

要するに、[既存のユーザ名]-xxというエイリアスは作れないってことね。 Mboxが存在しなくても、~alias/.qmail-*は探しに行ってくれないと。

あー時間食った。

POP before SMTP

あと、送信ができない。これは分かる。踏み台にされない為でしょ。前i-3のサーバ 立てたときどうしたっけなー、と思い起こす。あ、POP before SMTP入れて解決した んだけっけか。あーめんどくせ。

 relay-ctrl-3.1.1.tar.gz

とりあえずこれをダウンロードしてきてコンパイル・インストール。

 # cd relay-ctrl-3.1.1

 # make && ./installer

 # mkdir /var/spool/relay-ctrl/allow

 # mkdir /var/spool/relay-ctrl/

 # mkdir /var/spool/relay-ctrl/allow

 # chmod 700 /var/spool/relay-ctrl/

 # chmod 777 /var/spool/relay-ctrl/allow/

 # mkdir /etc/relay-ctrl

 # vi RELAY_CTRL_DIR

envdirが無かったが、 よく説明読むとenvで代用できる範囲なのでenvに書き換える。

とりあえず、/var/qmail/rcを書き直して、daemonを全部killして再起動。なんとか うまく行く。

(あ、あとsmtpdよりも先にpopdを立ち上げておかないとうまくいかないようだ:2003/05/19補遺)

とたんにエラー頻発。spamの踏み台にされてたようだ……。しばし落ち込む。

Open Relay Listからの削除

踏み台にされてるって事は…。

http://openrbl.org/ip/210/248/74/50.htm

やっぱり。Open Relay List(踏み台可能なSMTPサーバのリスト)に登録されてる。 しかし、今までこれで跳ねられた事なかったから、あまり利用してる人はいないのかな?

とにかく、片っ端から削除依頼を出しておく。

spam対策

以下のものを追加。本文のチェックもするようにした。 日本語だと、[ -~]とタブとエスケープ文字だけで大丈夫だろうか?

「未承諾広告」については、shがEUCを通してくれない(8bitの文字を落としてしまう) ので、JISのエスケープシーケンス抜きのものを使用。この方が移植性(?)も高い気が。

nkfの古いバージョン(nkf1.5等)の-mオプションは、「iso-2022-jp」のように小文字の MIME名を通さないので注意。nkf1.9なら大丈夫。

 # 韓国語のものを切る

 |bouncesaying 'Error: KM' grep -i 'charset="*euc-kr' > /dev/null

 |bouncesaying 'Error: KM' grep -i 'charset="*KS_C_5601-1987' > /dev/null

 ####

 # textパートすら持たないHTMLメールは蹴る

 |bouncesaying 'Error: HM' sh -c "822field Content-Type | grep -i 'text/html'" > /dev/null

 ####

 # 未承諾広告は蹴る( 未承諾広告 = 'L$>5Bz9-9p' )

 |bouncesaying 'Error: MK' sh -c "822field | nkf -jm | grep 'L$>5Bz9-9p'" > /dev/null

 ####

 # サブジェクトにバイナリが入ってるのも蹴る

 #|bouncesaying 'Error: BH' sh -c "822field | grep '[^ -~]'" > /dev/null

 ####

 # ヘッダ、ボディともバイナリが入ってるのは全部蹴る

 # エスケープ文字は許可しないと、ISO-2022-JPが通らない。[TAB]と[ESC]はviから直打ち。

 |bouncesaying 'error BHT' grep '[^[TAB][ESC] -~]' > /dev/null

 ####

 # フォワード処理(sky.pl)

 | dot-forward .forward

 ####

 # 配信

 ./Maildir/

RBLを使う

変なエラーメールが頻発。存在しないkaede.toアドレスからのメールが、User Unknownで 大量に返ってきている。kaede.toがOpen Relayだったせいだろうと思っていたが、どうやら、 他のOpen Relay(しかもFrom/To両方同時に偽装できるやつ)経由でkaede.toを騙っている らしい。こうなったらRBL入れるしかない。

で、ucspi-tcpには、rblsmtpdなるものが入っているので、これが使えると思って いたのだが、これはDNSのTXTレコードを引くタイプのもので、現行のAレコードを 引く方法だとうまく動かない。ので、

http://work-rss.mail-abuse.org/rss/qmail/ucspi-rss.diff

からパッチを拾ってきて patch -p2 < ucspi-rss.diffでパッチを当てる。

 make && make setup

これでよし。デフォルトのDNSも死んでるようなので-rオプションで追加する。

テストは、

 env TCPREMOTEIP=[SPAMMERS_IP_ADDRESS] rblsmtpd cat

で行った。Open RelayじゃないIPでもチェックすること。spamじゃないIPの時だけ STDINからSTDOUTに流れていればOK。

で、起動rcを、

 # SMTPdの起動

 env RELAY_CTRL_DIR="/var/spool/relay-ctrl/allow" /usr/local/bin/relay-ctrl-chdir \

    /usr/local/bin/tcpserver -R -H -x /etc/tcp.smtp.cdb -v -u 3004 -g 1003 0 smtp \

    /usr/local/bin/rblsmtpd -r list.dsbl.org -r unconfirmed.dsbl.org \

    /usr/local/bin/relay-ctrl-check \

    /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &

のように書き換える。

http://w3.itoh.net/qmail.html