qmailでサブミッションポート587に対応
No:112 Time[2008-04-15 03:53:58]

最近送信メールサーバーに苦労する。
というのも、クライアントにメールがほしいと言われると従来はメールサーバーは受信だけ作って送信サーバーはプロバイダ支給の物を使っていたが、プロバイダによっては25番ポートからの発信自体を他のプロバイダに対して行わせないようになっているのである。図を見てわかるようにそもそも、メールサーバー間のやり取りに使われている25番ポートとメールサーバーユーザー間のやり取りに使われているポートが同じであったことが不幸の始まりで、性善説を元に作られたインターネットの歴史のような弱点でした、しかし、これでは不正利用者に簡単に勝手に利用されてしまうのです。
かといって25番ポートにパスワードを授けてしまうとサーバー間の通信が出来なくなります。そこで新たにユーザーとメールサーバー間は587番を使いそれにパスワードをつけて送信するときも利用者を制限するようになりました。又この仕組みと同時に多くのプロバイダがOutbound Port 25 Blockingを施し、他のプロバイダへ25番ポートを使ってメール送信できなくしました。本来メールサーバー側で25番ポートを開放しなければ
Outbound Port 25 Blockingは行わなくてもよかったのですが、中には安いプロバイダの回線を利用して一時的にメールサーバーをたて、大量のメール配信を行う者が出てきました。メールサーバー間は25番ポートを利用していますから、本来WEBの閲覧等を目的に安く提供しているプロバイダはたまったものでもなく又送られた側からの大量クレームもプロバイダに届くことになります。しかも送信のみが目的なので一時的にセッションを貼ることができれば、メールの受信はできないほうがかえって好都合なわけです。
そうした不正利用者は安いプロバイダをころころ変えて利用するのでいくら退会処理をしても一向に減ることがないため、そもそも一般ユーザーが利用することのないサーバー間のポート25を制限したのがOutbound Port 25 Blockingで、外に出ていく25番ポートをプロバイダ側でブロックするのですが、困ったことに外部のコンテンツプロバイダに独自ドメイン等の為にメールをもっているユーザーはこの処置が行われたとたん、メールの送信ができなくなります。そして利用者は独自ドメインのプロバイダにクレームをいうわけですが、この場合勝手にサービスを変えたわけですから、接続プロバイダ側が返信アドレスを独自ドメインとした場合でも送信できるメールサーバーを用意するべきなのですが、自社のメールアドレス以外だと送信させないサーバーしか用意していない所もあるようです。となると、接続プロバイダからは、コンテンツプロバイダに言ってくださいといいますね。コンテンツプロバイダで従来からのpop before smtpしか用意していない会社の場合はサービスはちゃんとしていますとは大概いいません。競争が厳しいこの業界では新たにザミッションポートに対応したサービスを用意するしかないわけですね。
そこで何を使って実現するかが問題になってきます。
私はqmailを使っています。
これはもうふるーーーいソフトですから、中にはそろそろ捨ててしまいなさいという人もいますが、今のところその安定性は尊敬に値すると思いますし、
今更めんどくさいというのも理由の一つです。
でどのように実現されるかですがipfilterとパスワード等の認証をqmailに追加すればできます。
ipfilterはnat機能を有しているので587番に届くパケットを25番に転送します。



以下のパッチを用意する。ただ、最近はみつからないですね。
qmail-date-localtime.patch
ということで困っていたらportsに組み込まれていました。



まずqmailを入れます
cd /usr/ports/mail/qmail-tls
make patch
make
make install clean

以下のようなのでたらチェックする。
何度かやると出てこなくなるけどworkを見る限り必要なのは入っていればok

x Options for qmail-tls 1.03.20021228_1 x
x lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x
x x[X] SMTP_AUTH_PATCH Provide SMTP Authentication x x
x x[ ] QMAILQUEUE_PATCH run a QMAILQUEUE program x x
x x[ ] BIG_TODO_PATCH enable big_todo qmail patch x x
x x[ ] BIG_CONCURRENCY_PATCH use a concurrency greater than 240 x x
x x[ ] OUTGOINGIP_PATCH set the IP address to send messages x x
x x[X] LOCALTIME_PATCH emit dates in the local timezone x x
x x[ ] QMTPC_PATCH send email using qmtp protocol x x
x x[ ] MAILDIRQUOTA_PATCH Maildir++ support x x
x x[ ] BLOCKEXEC_PATCH block many windows viruses/worms x x
x x[ ] DISCBOUNCES_PATCH discard double-bounces x x
x x[ ] SPF_PATCH Implement SPF checker x x
x x[ ] EXTTODO_PATCH extern high-perform. todo processing x x
x x[ ] TLS_DEBUG enable additional debug information x x
x x[ ] QEXTRA enable QUEUE_EXTRA copy feature x x
x x[X] RCDLINK create rc.d/qmail.sh x x
tqmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj


にチェックを入れてインストール








make certificate

Syntax error: end of file unexpected (expecting "fi")
*** Error code 2

う、エラーだ。うまくできてない。
ll /var/qmail/control/servercert.pem
ができてればいいわけだが
しゃーない手動で
/usr/bin/openssl req -new -x509 -nodes -out work/servercert.pem -days 3660 -keyout work/servercert.pem

でここでももし下記のようなエラーがでる人は

13598:error:02001002:system library:fopen:No such file or directory:/usr/src/secure/lib/libcrypto/../../../crypto/openssl/crypto/bio/bss_file.c:352:fopen('work/servercert.pem','w')
13598:error:20074002:BIO routines:FILE_CTRL:system lib:/usr/src/secure/lib/libcrypto/../../../crypto/openssl/crypto/bio/bss_file.c:354:

vi /etc/ssl/openssl.cnf
unique_subject = no
をコメントアウトしてから

Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Sinjyuku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:seo-diary.com
Organizational Unit Name (eg, section) []:suzuki
Common Name (eg, YOUR name) []:mail.seo-diary.com
Email Address []:

cp work/servercert.pem /var/qmail/control/servercert.pem
chmod 0640 /var/qmail/control/servercert.pem
chown qmaild:qmail /var/qmail/control/servercert.pem




vi /var/qmail/control/locals
seo-diary.com
vi /var/qmail/control/rcpthosts
seo-diary.com

何故かリンクされてるけどインストされてなかったので
ll /usr/local/etc/rc.d/
cp /var/qmail/boot/maildir /var/qmail/rc
ちゃんとインストされたかみてみる。
vi /var/qmail/rc
これは、便利にしたらしいけど、これで再起動すると止まるな。
まあ、ためしに
/var/qmail/rc start
動いているのか確認する。
ps -ax | more
おお、maildir形式で動いてるらしい。

55804 p0 I 0:00.01 qmail-send
55805 p0 I 0:00.00 splogger qmail
55806 p0 I 0:00.00 qmail-lspawn ./Maildir/
55807 p0 I 0:00.00 qmail-rspawn
55808 p0 I 0:00.00 qmail-clean

/var/qmail/rc stop

さて、このまま試しにサーバーを再起動すると、Starting local daemons:
で止まってかえってこなくなることになる。
まあ、よくあることだけど、起動と終了をオプションでできるようにしたら
サーバー自体の起動に安易につかっている部分と整合性がとれてなくていつまでもオプション要求まってるから
起動しなくなるという罠。

ll /usr/local/etc/rc.d/
rm /usr/local/etc/rc.d/qmail.sh


portsでインストするといらないのかもしれないけど、リンクされてないようならsendmailからqmailへの変更
これをしないとcgiからメールとかできない。

chmod 0 /usr/sbin/sendmail
mv /usr/sbin/sendmail /usr/sbin/sendmail.bak
ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail



pop側を入れる
checkpassword のインストール
cd /usr/ports/security/checkpassword
make install clean





smtpの認証を入れる

mkdir /usr/local/src/cmd5checkpw
cd /usr/local/src/cmd5checkpw
wget http://members.elysium.pl/brush/cmd5checkpw/dist/cmd5checkpw-0.22.tar.gz
tar xvfz cmd5checkpw-0.22.tar.gz
cd cmd5checkpw-0.22/
make
make install
すると
cp cmd5checkpw /bin/ ; cp cmd5checkpw.8 /usr/man/man8/
cp: directory /usr/man/man8 does not exist
ううう、これも古いのね、マニュアルをインストールしたあと他のものインストールしてたらいかんのでとりあえず、
フォルダを使ってごまかし、再度インストール
mkdir /usr/man
mkdir /usr/man/man8
make install
で本来の場所に
cp cmd5checkpw.8 /usr/share/man/man8/


実際のファイルは
# vi /etc/poppasswd
ユーザー1:パスワード
ユーザー2:パスワード
.....
みたく書いていきます。popで使うわけではないんだけど、本来popを/etc/passwdとわけるためのものらしい。


ファイルのパーミッションを修正します
chmod 400 /etc/poppasswd
chmod a+s /bin/cmd5checkpw



tcp serverを入れる
cd /usr/ports/sysutils/ucspi-tcp
make install clean


制御ファイルを作る
vi /etc/tcp.smtp
xxx.xxx.xxx.xxx:allow,RELAYCLIENT=""
127.0.0.:allow,RELAYCLIENT=""
=.seo-diary.com:allow,RELAYCLIENT=""
:allow
ハッシュ化する
tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp




次にrc.localでsmtpとpopが自動的に立ち上がるように設定。まあ、この時点でqmailて色々なものを使ってはじめて動くとわかる。
vi /etc/rc.local
/var/qmail/rc start &
/usr/local/bin/tcpserver -HR -u 82 -g 81 -x /etc/tcp.smtp.cdb 0 smtp /var/qmail/bin/qmail-smtpd mail.seo-diary.com /bin/cmd5checkpw /usr/bin/true 2>&1 | var/qmail/bin/splogger smtpsd &
/usr/local/bin/tcpserver -HR 0 110 /var/qmail/bin/qmail-popup mail.seo-diary.com /usr/local/bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir &


まあ、qmailでの送受信が何十秒もまつといやなので、tcpserverでホストの確認はしていません
この変でqmailは立ち上がるはずなので再起動。してみる
reboot
qmail自信はうまくうごくようになったが、qmail単体はいくらセキュリティ高くても、周りにいろいろつけないといかんから、ややこしくなって廃れていくのかなと思ってみる。でもqmailいいですよ。






次にipfilterを使うのでカーネルに下記を追加
cd /usr/src/sys/i386/conf
cp GENERIC SEO-DIARY
vi SEO-DIARY

options IPFILTER
options IPFILTER_LOG
options IPFILTER_DEFAULT_BLOCK

config SEO-DIARY
cd ../compile/SEO-DIARY
make cleandepend; make depend
make
make install

次にrc.confに下記をいれます。

vi /etc/rc.conf
ipfilter_enable="YES"
ipfilter_program="/sbin/ipf"
ipfilter_rules="/etc/ipf.rules"
ipmon_enable="YES"
ipmon_flags="-D /var/log/ipflog"
ipfilter_flags=""
ipnat_enable="YES"
ipnat_program="/sbin/ipnat"
ipnat_rules="/etc/ipnat.rules"
ipnat_flags=""


次に/etc/ipf.rulesを編集しますが、せっかくなので
http://www.seo-diary.com/p_111/index.html
を参考にしてセキュリティも強化することをお勧めしますが、うまくいかなければ
pass in all
pass out all
で何でも通すということになります。

次に/etc/ipnat.rulesにサブミッションポート587を25ポートにリダイレクトしてあげます。
vi /etc/ipnat.rules

rdr rl0 xxx.xxx.xxx.xxx/32 port 587 -> xxx.xxx.xxx.xxx port 25 tcp

さて、いよいよ、再起動してあとは、お祈りします。


これでtlsで認証しつつ、パスワード付smtpをqmailで構築しつつサブミッションポート587にも対応できました。
自分のメーラーソフトで確認してみてください。
ついでにnmapで変なポート開放してないかも確認して完了です。
後は、しいていえばvpopmailでも使ってセキュアなpopをすればいいのですが~
それをしてしまうと、じゃあqmailは何をしているのさということになるような。で、素直にパッチがでることを願いつつ。
まあそれにそのうち、アプリケーション層でがんばらなくても、セキュアになる時代が~ip4になれると面倒ですよね、使い始めたシステムってなかなか
変わらないものです。