ギゾネット 2001.12.21更新

qmailのIPv6化


sendmailよりも設定が簡単なqmailを使います。
qmailのIPv6パッチが出ていますので、qmailをIPv4/IPv6のデュアルスタックにしてみましょう。
今回はFreeBSD4.4-RELEASEを使用しました。

このページで扱っていること
SMTP認証とかPopBeforeSMTPとかの話題はこのページには書いてありません。
LAN内にあるパソコンからインターネット上の他サーバー宛てに(もちろんLAN内のアドレス宛にも)、 IPv4/IPv6でメールを送受信する方法です。
独自ドメインでIPv4/IPv6のDNS設定(AレコードとAAAAレコードとMXレコード)が済んでいることを前提条件に書いていきます。
DNSの設定はたかのさんのページに詳しく載っているので参照してください

ソースとパッチの取得
まず、ftp://ftp.jp.qmail.org/qmail/からqmailのソースを持ってきます。
次に、fujiwaraさんのページからIPv6パッチ(qmail-1.03-v6-20001010.diff)を取ってきます。
他にパッチが必要なら適宜持ってきます。ウチの場合は、ftp://ftp.nlc.net.au/pub/unix/mail/qmail/からlocaltimeのパッチを取ってきました。
(qmailは送信日時のヘッダ部分ががGMTで記録されます。JSTにしたいときはこのパッチをあてます)

インストール
ソースとパッチがそろったら、インストールしましょう。
始めにqmailのグループとユーザーを作成します。

#pw groupadd nofiles
#pw useradd alias -g nofiles -d /var/qmail/alias -s /nonexistent
#pw useradd qmaild -g nofiles -d /var/qmail/qmail -s /nonexistent
#pw useradd qmaill -g nofiles -d /var/qmail/qmail -s /nonexistent
#pw useradd qmailp -g nofiles -d /var/qmail/qmail -s /nonexistent
#pw groupadd qmail
#pw useradd qmailq -g qmail -d /var/qmail/qmail -s /nonexistent
#pw useradd qmailr -g qmail -d /var/qmail/qmail -s /nonexistent
#pw useradd qmails -g qmail -d /var/qmail/qmail -s /nonexistent

取ってきたソースとパッチを置いてあるディレクトリで、次のコマンドを実行します。
%tar zxvf qmail-1.03.tar.gz
%cd qmail-1.03
%patch -p1 < ../qmail-date-localtime.patch
%patch -p1 < ../qmail-1.03-v6-20001010.diff
%make
%make man
%su(rootになって) #make setup
#make check

DNSで自分のホスト名が参照できる状態にあれば
#./config
とすれば、/var/qmail/controlに自ドメイン名などが書かれたファイルが作成されます。

もしDNSで自ホスト名が参照できていない状態の時には
#./config-fast gw.gizo.net
などのようにサーバーのホスト名とドメイン名を明示します。

次にエイリアスの設定をします
#cd ~alias
#touch .qmail-postmaster
#touch .qmail-mailer-daemon
#touch .qmail-root

作成した.qmail-postmaster .qmail-mailer-daemon .qmail-rootの3つのファイルの中にはそれぞれメールの受け取り手を記述します。(この作業は必須ではありません)
例えば、/var/qmail/alias/.qmail-rootの中に
&taro@gizo.net
と書いておけば、root@gizo.net宛てのメールは、ユーザーtaro(仮名;-)に配送されます。
root宛てのメールは毎日システム情報として届くと思いますので管理者であるtaroに配送させたほうが便利かと思います。
(まあ、これは管理者の都合のいいようにしてください。メール転送させない場合は、/var/qmail/alias/Mailboxに配送されます。)
また、/var/qmail/alias/.qmail-webmasterというファイルを作って、そこにも配送先を書いておけば、webmaster@gizo.net宛てのメールはtaroに配送させるということも可能です。

qmailによって配送されるメールは、各ユーザーの~/Mailboxというmbox形式のファイルに配送されます。
Mailboxファイルが存在しないときは、初めて配送されたときに作成されます。

qmailデーモンの起動スクリプトをコピーします
#cp /var/qmail/boot/home /var/qmail/rc

この段階で、qmailはとりあえず使える状態になっています。

配送テスト
一応ここで、配送テストをしてみます。
#/var/qmail/rc &
を実行するとqmailがデーモンで動き出します。
psコマンドで見てみましょう。
# ps -ax | grep qmail
2797 p0 I 0:00.06 qmail-send
2798 p0 I 0:00.01 splogger qmail
2799 p0 I 0:00.01 qmail-lspawn ./Mailbox
2800 p0 I 0:00.01 qmail-rspawn
2801 p0 I 0:00.01 qmail-clean
というようにいくつかのqmail関係のデーモンが起動しているはずです。

qmailの送信コマンドqmail-injectでローカル送信テストをしてみます。
%/var/qmail/bin/qmail-inject(Enterキー)
To: ユーザー名@ドメイン名(Enterキー)
Subject: test(Enterキー)
This mail is the test mail.(Enterキー)
(Ctrl+Dキー)
%(メールが送信されて、プロンプトが戻ってきます)

送ったユーザーの~/を見てください。
%cd
%ls
Mailbox

Mailboxファイルが出来上がっていれば
%cat Mailbox
で中身を見ると、今送った内容が書いてあるはずです。
これで、送信できることがわかりました。

ちなみに、実在しないユーザーに送った場合は、qmailが「そんなユーザーはいないよ」と返送してきます。
外部のメールサーバーにも送ることができます。もし、プロバイダなどに自分のメールアドレスをもっているようでしたら、そこにメールを出してみて到着しているか確認してみてください。

qmailの自動起動の準備
サーバーを起動したときにqmailも自動的に起動するように設定しましょう。
/etc/rc.confの中に以下の記述をします
sendmail_enable="NO"
qmail_enable="YES"
さらに/etc/rcにqmailの起動命令を書き加えることでサーバー起動時にsendmailのかわりにqmailが起動します。(書き換え方は後述します。)

既にインストールされているsendmailを無効にします。
#/usr/sbin/sendmail -q
を実行して、queueを空にします。

/usr/sbin/sendmailを実行権限を無くして、別名で保存しておきます。
そして、sendmailの代わりにqmailが実行されるようにリンクを張ります。
#chmod 0 /usr/sbin/sendmail
#mv /usr/sbin/sendmail /usr/sbin/sendmail.bak
#ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail


tcpserverのインストール
tcpserverをインストールします
今までの設定だと、qmailをインストールしたマシン(サーバー)からしかメールを送信できません。
LAN内の他のパソコンからもメールを外部に送信することができるようにします。そのためにtcpserverを使うことにします。

tcpserverのソースを取ってきます。ucspi-tcp-0.88というパッケージの中にtcpserverはあります。
それから、tcpserverのIPv6パッチを取ってきます。
最新はucspi-tcp-0.88-ipv6.diff10.bz2というのがありますが、これを試したところdietlibcというものがないとmakeできないので、dietlibcをインストールしようとしたところ、これもエラーがでてコンパイルできない状態でした。
そこで、一つ前のバージョンucspi-tcp-0.88-ipv6.diff9.bz2を使うことにします。
(これより前のバージョンは後述のcdbのIPv6化に未対応らしいので避けたほうがいいでしょう)


まずパッチを展開します。
%bzip2 -d ucspi-tcp-0.88-ipv6.diff9.bz2
続いてucspi-tcp-0.88.tar.gzを展開します
%tar zxvf ucspi-tcp-0.88.tar.gz
パッチを当てます
%cd ucspi-tcp-0.88
%patch -p1 < ../ucspi-tcp-0.88-ipv6.diff9

そこからはインストールマニュアルどおり
%make
#make setup check
でエラーが出なければ、インストール完了です。

cdbのインストール
次に、tcpserverがメール配信のリレー制御をするためのデータベースを作成します。
データベースを作成するためのツールが、cdbというものです。
cdbからソースを取ってきます。
cdb-0.75というのがありましたのでこれをもってきます。インストールマニュアルどおりに
%tar zxvf cdb-0.75.tar.gz
%cd cdb-0.75
%make
#make setup check
これでcdbのインストールは終了です

データベースの作成をします
ここでは、次のようなルールとして設定しています。
LAN内のパソコン(今作業しているサーバーを含む)からはどこへでもメールを送れる。
LAN内というのは192.168.2.0/24のIPv4アドレスを持っているマシン及び、2001:240:3e:1::/64のIPv6アドレスを持っているマシンを指します。
/etc/tcp.smtpというファイルを作成し、それにルールを書きます。
# vi /etc/tcp.smtp

2001:240:3e:1::allow,RELAYCLIENT=""
192.168.1.:allow,RELAYCLIENT=""
127.:allow,RELAYCLIENT=""
:allow

続いて、次のコマンドを実行して、データベースを作成します。
#tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp


/etc/rcの書き換え
nofilesのグループ番号と、qmaildのユーザー番号が必要になるので調べます。
%view /etc/group

nofiles:*:1002:
qmail:*:1003:

これでnofilesのグループIDは1002ということがわかります。
必ず1002になっているわけではありませんので、各人で調べてください。

同様にqmaildのユーザーIDは
%view /etc/passwd

qmaild:*:1003:1002:User &:/var/qmail/qmail:/nonexistent
これで、qmaildのユーザーIDは1002ということがわかります。(1003はグループID)

これらがわかったところで次の作業に移ります。
/etc/rcの中に
if [ -r /etc/mail/sendmail.cf ]; then
        case ${sendmail_enable} in
        [Yy][Ee][Ss])
                echo -n ' sendmail'
                /usr/sbin/sendmail ${sendmail_flags}
                ;;
        *)
                case ${sendmail_outbound_enable} in
                [Yy][Ee][Ss])
                        echo -n ' sendmail'
                        /usr/sbin/sendmail ${sendmail_outbound_flags}
                        ;;
                esac
                ;;
        esac
fi

というsendmailの起動に関する記述があります。
その下あたりに

case ${qmail_enable} in
[Yy][Ee][Ss])
        if [ -r /var/qmail/rc ]; then
                /usr/local/bin/tcpserver -x /etc/tcp.smtp.cdb -u 1003 -g 1002 0 smtp /var/qmail/bin/qmail-smtpd &
                echo -n ' qmail';       /var/qmail/rc &
        fi
        ;;
esac

と書き足します。
-u 1003 -g 1002の部分は-u (qmaildのユーザーID) -g (nofilesのグループID)ですから 先ほど調べた数字をいれてください。

これでシステムを再起動すれば、次からqmailがtcpserver経由で立ち上がり、さっき作ったメールのリレーのルールが適用されます。
qmailの配送状況は
%tail -f maillog (終了はCtrl+c)
で確認できます。

再起動したら、LAN内の他のパソコンから外部宛てに送信テストしてみます。
うまく送信できたらOKです。

/etc/tcp.smtpを違うIPに書き換えて、(例えば、
192.168.1.:allow,RELAYCLIENT=""の行を
192.168.2.:allow,RELAYCLIENT=""に書き換えて、再度
#tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp

を実行してみて、リレーできるか出来ないかいろいろ試してみてください。 (リレーできないはずです)
外部から自分のサーバーをSMTPサーバーとして、メールを他のドメインのアドレスに送れないようになっているかテストできる環境があれば試してみてください。
(これができたら大変です。設定を見直す必要があります)

qmailだけで結構長くなってしまったのでqpopperのIPv6化は別ページにします。