各種不具合を修整し、3分でメールサーバーが稼働できるように調整しました。
それにともない名称も「QMAIL103PKG」から「QMAIL2020」と改めました。(パッチの詰め合わせですが)
20年以上バージョンアップ無しという枯れきったMTA「qmail」の代替をここ数ヶ月暇さえあれば探してきましたが、qmailに骨をうずめようという考えに至りました。
ただ最近のメール事情に合わせるとなると数多くのパッチが必要ですが、それらのパッチも長い歳月の間に配布元が閉鎖してしまっていたりして、入手が困難なものも存在します。
また本体及び関連プログラムをコンパイルする環境も変わり、makeでエラーが出たりすることも珍しくない状況です。
qmailのライセンスがパブリックドメインになったことにより派生版なども出ていますが、将来的に不安な部分も多かったため、以下のようなポリシーでインストールスクリプトを組みました。
QMAIL2020ポリシー
- オリジナルのqmail1.03を使用
- なるべくファイル書き換えには古くからあるオリジナルパッチを使用
- 派生版は消滅の可能性が高いので使わない
- pkg等は使わずにコンパイルすることでブラックボックス化を防ぐ
- 冗長的であっても処理の分かりやすさを優先
このスクリプトで構築される環境は以下のような感じです。
- cdb + tcpserver + qmail + SMTP AUTH + VPopMail
- ポート25と587でSMTP AUTHを受け付ける
セットアップされるqmail関連プログラム
qmail自動インストールスクリプト
ソースはページ下部に載せておきます。
QMAIL2020 使い方
- groff(使用するのはnroff)とGCCをインストールしておきます。
- FreeBSD 11以降はnroffが廃止されたのでgroffをインストールします。
例)pkg install groff - FreeBSD 10以降はGCCが廃止されたのでインストールします。
例)pkg install gcc
- FreeBSD 11以降はnroffが廃止されたのでgroffをインストールします。
- qmail2020.shおよびqmail-1.03.tar.gzと関連プログラムを任意のディレクトリに置きます。
/usr/local/src/qmail2020以外に置く場合にはqmail2020.shの104行目付近current_dirを変更してください。
次項のアーカイブqmail2020.tar.gzをダウンロードして使う場合には以下のようになります。cd /usr/local/src fetch https://www.ii-sys.jp/wp-content/uploads/qmail/qmail2020.tar.gz tar zxvf qmail2020.tar.gz
fetchコマンドでエラーがでる場合にはfetchコマンドでエラーが表示されてダウンロードできない【on FreeBSD】をご覧ください。
- rootユーザーになり以下のコマンドを実行します。
cd /usr/local/src/qmail2020 sh ./qmail2020.sh hostname.example.com
hostname.example.comにはサーバーのFQDN(ホスト名.ドメイン名)を指定します。
- 1分もかからずにインストール・設定・起動・自動起動設定が完了して運用可能になります。
※実運用は細心の注意を払って自己責任で!
vpopmailでドメイン・ユーザーを追加して使えます。
QMAIL2020(qmail関連プログラムアーカイブ)
それぞれの環境によって必要なプログラムを吟味していくのが良いと思いますが、上記で紹介した全てのプログラム(qmail本体およびqmail2020.shを含む)のアーカイブです。
QMAIL2020ソースコード
#!/bin/sh
# =====================================================
# QMAIL2020, Copyright 2020 IISYS sio(^_^)
# https://www.ii-sys.jp/
# GNU GPL https://www.gnu.org/licenses/gpl.txt
# 改良してぜひ公開してください!
# =====================================================
# FreeBSD 12.1にて動作確認済み
#
# [概要]
# オリジナルのqmail(1.03)を使用して以下の環境を構築するためのスクリプトです。
# ・cdb + tcpserver + qmail + SMTP AUTH + VPopMail
# ・ポート25と587でSMTP AUTHのみ受け付ける
#
# [ポリシー]
# ・なるべくファイル書き換えには古くからあるオリジナルパッチを使用
# ・派生版は消滅の可能性が高いので使わない
# ・pkg等は使わずにコンパイルすることでブラックボックス化を防ぐ
# ・冗長的であっても処理の分かりやすさを優先
#
# ==== 履歴 ===========================================
# 2018.06.17 公開
# 2020.02.28 更新
# QMAIL103PKGからQMAIL2020へ名称変更
#
# ==== 準備 ===========================================
# ■ FreeBSD 11以降はnroffが廃止されたのでgroffを導入
# 例)
# pkg install groff
#
# ■ FreeBSD 10以降はGCCが廃止されたので導入
# 例)
# pkg install gcc
#
# ■ Sendmail停止
# 例1)完全にsendmailを止める
# vi /etc/rc.conf
# sendmail_enable="NO"
# sendmail_submit_enable="NO"
# sendmail_outbound_enable="NO"
# sendmail_msp_queue_enable="NO"
# 例2)外部からのsmtp接続だけを止める
# vi /etc/rc.conf
# sendmail_enable="NO" # (デフォルト)
#
# ■ パスワードファイルの確認
# vipw
# 以下の行があれば削除
# alias:~
# qmaild:~
# maill:~
# qmailp:~
# qmailq:~
# qmailr:~
# qmails:~
# vpopmail:~
# ■グループファイルの確認
# vi /etc/group
# 以下のグループがあれば削除
# nofiles:~
# qmail:~
# vchkpw:~
# ■作業ディレクトリ(例えば/usr/local/src/qmail2020)直下に配置
# ◎このスクリプト ------------------ 必須
# ◎qmail-1.03.tar.gz --------------- 必須
# ・qmail-date-localtime.patch ------ 任意(日本時間対応パッチ)
# ・qmail-smtpd-relay-reject.patch -- 任意(不正中継拒否)
# ・qmail-0.0.0.0.patch ------------- 任意(IPアドレス0.0.0.0への対応)
# ・qmail-1.03.errno.patch ---------- 任意(最近のglib対応)
# ・sendmail-flagf.patch ------------ 任意(sendmailの-fオプションに対応)
# ・qmail-103.patch ----------------- 任意(DNSから512byte超えのDNSSEC対応)
# ◎ucspi-tcp-0.88.tar.gz ----------- 必須(tcpserver)
# ◎cdb-0.75.tar.gz ----------------- 必須(高速データベース)
# ・checkpassword-0.90.tar.gz ------- 任意(vpopmailを使わない環境でのPOP認証用)
# ◎vpopmail-5.4.33.tar.gz ---------- 必須(バーチャルドメイン)
# ・ucspi-rss.diff ------------------ 任意(rblsmtpdをAレコードに対応)
# ◎qmail-smtpd-auth-0.31.tar.gz ---- 必須(SMTP AUTH実装)
# ◎qmail-smtpd-auth-close3.patch --- 必須(qmail-smtpd-auth-0.31のバグ修正)
# ・qmail-remote-auth.patch --------- 任意(外部SMTPのSMTP AUTH実装)
# ・qmail-extra-patch-utmpx.patch --- 任意(utmp.hからutmpx.hに変わったFreeBSD 9.0以降では必須)
# ・qmail-amd64.patch --------------- 任意(amd64環境でのバグ対策)
# ・qmail-local.patch --------------- 任意(qmail-local.cの条件分岐修正)
# ・vpopmail-vchkpw-c.patch --------- 任意(CRAM-MD5処理のバグ修正)
# ・ucspi-conf-cc.patch ------------- 任意(gccが入っていない環境でccを使う)
# ・ucspi-conf-ld.patch ------------- 任意(gccが入っていない環境でccを使う)
# ・cdb-conf-cc.patch --------------- 任意(gccが入っていない環境でccを使う)
# ・cdb-conf-ld.patch --------------- 任意(gccが入っていない環境でccを使う)
# ・checkpassword-conf-cc.patch ----- 任意(gccが入っていない環境でccを使う)
# ・checkpassword-conf-ld.patch ----- 任意(gccが入っていない環境でccを使う)
#
# ==== 実行方法 =====================================
# rootユーザーで下記コマンドを実行
# cd /usr/local/src/qmail2020
# sh ./qmail2020.sh ARG1
# ARG1にはFQDN(ホスト名.ドメイン名)
# 例)
# sh ./qmail2020.sh hostname.example.com
#
# ==== 設定 =========================================
# 「=」の前後にスペースを入れないように
#
# カレントディレクトリ
current_dir="/usr/local/src/qmail2020"
# SMTP AUTH ポート番号
smtp_port="25"
submission_port="587"
# ソースファイル定義
souce_qmail="qmail-1.03.tar.gz"
souce_qmail_date_localtime="qmail-date-localtime.patch"
souce_smtpd_relay_reject="qmail-smtpd-relay-reject.patch"
souce_qmail_0000="qmail-0.0.0.0.patch"
souce_qmail_103errno="qmail-1.03.errno.patch"
souce_sendmail_flagf="sendmail-flagf.patch"
souce_qmail_103="qmail-103.patch"
souce_ucspi_tcp="ucspi-tcp-0.88.tar.gz"
souce_cdb="cdb-0.75.tar.gz"
souce_checkpassword="checkpassword-0.90.tar.gz"
souce_vpopmail="vpopmail-5.4.33.tar.gz"
souce_ucspi_rss="ucspi-rss.diff"
souce_qmail_smtpd_auth="qmail-smtpd-auth-0.31.tar.gz"
souce_qmail_smtpd_auth_close3="qmail-smtpd-auth-close3.patch"
souce_qmail_remote_auth="qmail-remote-auth.patch"
souce_qmail_extra_patch_utmpx="qmail-extra-patch-utmpx.patch"
souce_vpopmail_vchkpw_c="vpopmail-vchkpw-c.patch"
souce_qmail_amd64="qmail-amd64.patch"
souce_qmail_local="qmail-local.patch"
souce_ucspi_conf_cc="ucspi-conf-cc.patch"
souce_ucspi_conf_ld="ucspi-conf-ld.patch"
souce_cdb_conf_cc="cdb-conf-cc.patch"
souce_cdb_conf_ld="cdb-conf-ld.patch"
souce_checkpassword_conf_cc="checkpassword-conf-cc.patch"
souce_checkpassword_conf_ld="checkpassword-conf-ld.patch"
# ==== 必須ファイルのチェック =======================
# 起動ファイルに記述される必須ファイルのみチェック。
# qmail本体(souce_qmail)以外は下記から削除してもこの
# スクリプトは走りますが、起動ファイルの修正が必要。
if [ ! -f "$souce_qmail" ] ; then
echo " $souce_qmail NOT FOUND! "
exit 0
fi
if [ ! -f "$souce_ucspi_tcp" ] ; then
echo " $souce_ucspi_tcp NOT FOUND! "
exit 0
fi
if [ ! -f "$souce_cdb" ] ; then
echo " $souce_cdb NOT FOUND! "
exit 0
fi
if [ ! -f "$souce_vpopmail" ] ; then
echo " $souce_vpopmail NOT FOUND! "
exit 0
fi
if [ ! -f "$souce_qmail_smtpd_auth" ] ; then
echo " $souce_qmail_smtpd_auth NOT FOUND! "
exit 0
fi
if [ ! -f "$souce_qmail_smtpd_auth_close3" ] ; then
echo " $souce_qmail_smtpd_auth_close3 NOT FOUND! "
exit 0
fi
# ==== qmailが既に存在する場合 ======================
if [ -f /etc/rc.d/qmail ] ; then
/bin/rm /etc/rc.d/qmail
fi
if [ -d /var/qmail ] ; then
/bin/mv /var/qmail /var/qmail.old
fi
if [ -d /usr/share/skel/Maildir ] ; then
/bin/rm -fr /usr/share/skel/Maildir
fi
# ==== ユーザ・グループの作成 =======================
mkdir /var/qmail
pw groupadd qmail -g 19090
pw groupadd nofiles -g 19091
pw useradd alias -u 9090 -g nofiles -d /var/qmail/alias -s /nonexistent
pw useradd qmaild -u 9091 -g nofiles -d /var/qmail -s /nonexistent
pw useradd qmaill -u 9092 -g nofiles -d /var/qmail -s /nonexistent
pw useradd qmailp -u 9093 -g nofiles -d /var/qmail -s /nonexistent
pw useradd qmailq -u 9094 -g qmail -d /var/qmail -s /nonexistent
pw useradd qmailr -u 9095 -g qmail -d /var/qmail -s /nonexistent
pw useradd qmails -u 9096 -g qmail -d /var/qmail -s /nonexistent
mkdir /home/vpopmail
mkdir /home/vpopmail/etc
pw groupadd vchkpw -g 89
pw useradd vpopmail -u 89 -g vchkpw -d /home/vpopmail -s /nonexistent
chown -R vpopmail:vchkpw /home/vpopmail
# ==== qmail本体パッチとインストール ================
cd "$current_dir"
if [ ! -f "$souce_qmail" ] ; then
echo " $souce_qmail NOT FOUND! "
exit 0
fi
tar zxvf "$souce_qmail"
cd "${souce_qmail%.tar.gz}"
if [ -f ../"$souce_qmail_extra_patch_utmpx" ] ; then
patch -s -p1 < ../"$souce_qmail_extra_patch_utmpx"
fi
if [ -f ../"$souce_qmail_date_localtime" ] ; then
patch -s -p1 < ../"$souce_qmail_date_localtime"
fi
if [ -f ../"$souce_smtpd_relay_reject" ] ; then
patch -s -p1 < ../"$souce_smtpd_relay_reject"
fi
if [ -f ../"$souce_qmail_0000" ] ; then
patch -s -p1 < ../"$souce_qmail_0000"
fi
if [ -f ../"$souce_qmail_103errno" ] ; then
patch -s -p1 < ../"$souce_qmail_103errno"
fi
if [ -f ../"$souce_sendmail_flagf" ] ; then
patch -s -p1 < ../"$souce_sendmail_flagf"
fi
if [ -f ../"$souce_qmail_103" ] ; then
patch -s -p1 < ../"$souce_qmail_103"
fi
if [ -f ../"$souce_qmail_remote_auth" ] ; then
patch -s -p1 < ../"$souce_qmail_remote_auth"
fi
if [ -f ../"$souce_qmail_smtpd_auth" ] ; then
tar zxvf ../"$souce_qmail_smtpd_auth" -C ../
cp -i ../"${souce_qmail_smtpd_auth%.tar.gz}"/base64.? ./
patch -s -p1 < ../"${souce_qmail_smtpd_auth%.tar.gz}"/auth.patch
fi
if [ -f ../"$souce_qmail_smtpd_auth" ] && [ -f ../"$souce_qmail_smtpd_auth_close3" ] ; then
patch -s -p1 < ../"$souce_qmail_smtpd_auth_close3"
fi
if [ -f ../"$souce_qmail_amd64" ] ; then
patch -s -p1 < ../"$souce_qmail_amd64"
fi
if [ -f ../"$souce_qmail_local" ] ; then
patch -s -p1 < ../"$souce_qmail_local" fi make make setup make check # /var/qmail/control/ 以下のファイル生成 # サーバーがDNSに正しく登録されているのであれば ./config (オプション無し)でOK ./config-fast "$1" # キュー最大滞在期間をデフォルトの7日から1時間に変更 # 変更は以下のコマンドで確認できる # /var/qmail/bin/qmail-showctl | grep queuelifetime cd /var/qmail/control touch queuelifetime echo "3600" > tcp.smtp
# .qmail-rootにroot宛メッセージの転送先を書くこと(例: &USER または &user@example.com)
cd /var/qmail/alias
touch .qmail-postmaster .qmail-mailer-daemon .qmail-root
chmod 644 .qmail*
# ==== tcpserverのインストール ======================
cd "$current_dir"
if [ -f "$souce_ucspi_tcp" ] ; then
tar zxvf "$souce_ucspi_tcp"
cd "${souce_ucspi_tcp%.tar.gz}"
# パッチ
if [ -f ../"$souce_ucspi_rss" ] ; then
patch -s -p1 < ../"$souce_ucspi_rss"
fi
if [ -f ../"$souce_ucspi_conf_cc" ] ; then
patch -s -p1 < ../"$souce_ucspi_conf_cc"
fi
if [ -f ../"$souce_ucspi_conf_ld" ] ; then
patch -s -p1 < ../"$souce_ucspi_conf_ld"
fi
make
make setup check
fi
# ==== cdbインストール ==============================
cd "$current_dir"
if [ -f "$souce_cdb" ] ; then
tar zxvf "$souce_cdb"
cd "${souce_cdb%.tar.gz}"
# パッチ
if [ -f ../"$souce_cdb_conf_cc" ] ; then
patch -s -p1 < ../"$souce_cdb_conf_cc"
fi
if [ -f ../"$souce_cdb_conf_ld" ] ; then
patch -s -p1 < ../"$souce_cdb_conf_ld"
fi
make
cp cdbget /usr/local/bin
cp cdbmake /usr/local/bin
cp cdbdump /usr/local/bin
cp cdbstats /usr/local/bin
cp cdbtest /usr/local/bin
fi
# ==== checkpassword ================================
cd "$current_dir"
if [ -f "$souce_checkpassword" ] ; then
tar zxvf "$souce_checkpassword"
cd "${souce_checkpassword%.tar.gz}"
# パッチ
if [ -f ../"$souce_checkpassword_conf_cc" ] ; then
patch -s -p1 < ../"$souce_checkpassword_conf_cc"
fi
if [ -f ../"$souce_checkpassword_conf_ld" ] ; then
patch -s -p1 < ../"$souce_checkpassword_conf_ld" fi make make setup make check fi # ==== 認証無しで許可するIPアドレス ================= cd /etc touch tcp.smtp chmod 600 tcp.smtp #echo "10.:allow,RELAYCLIENT=\"\"" > tcp.smtp
#echo "172.16.:allow,RELAYCLIENT=\"\"" >> tcp.smtp
#echo "192.168.:allow,RELAYCLIENT=\"\"" >> tcp.smtp
echo "127.:allow,RELAYCLIENT=\"\"" >> tcp.smtp
echo ":allow" >> tcp.smtp
tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
# ==== vpopmailインストール =========================
cd "$current_dir"
if [ -f "$souce_vpopmail" ] ; then
tar zxvf "$souce_vpopmail"
cd "${souce_vpopmail%.tar.gz}"
# パッチ
if [ -f ../"$souce_vpopmail_vchkpw_c" ] ; then
patch -s -p1 < ../"$souce_vpopmail_vchkpw_c" fi ./configure #./configure --enable-roaming-users=y # POP Before SMTPを有効にする場合 make clean make make install chown root /home/vpopmail/bin/vchkpw chmod 4755 /home/vpopmail/bin/vchkpw fi # ==== 起動スクリプト生成 =========================== cd /var/qmail touch rc chmod 755 rc echo '#!/bin/sh' > rc
echo 'exec env - PATH="/var/qmail/bin:$PATH" qmail-start ./Maildir/ splogger qmail &' >> rc
echo "/usr/local/bin/tcpserver -l0 -R -H -x /etc/tcp.smtp.cdb -v -u `id -u qmaild` -g `id -g qmaild` 0 $smtp_port /var/qmail/bin/qmail-smtpd $1 /home/vpopmail/bin/vchkpw /bin/true 2>&1 | /var/qmail/bin/splogger smtpd 3 &" >> rc
echo "/usr/local/bin/tcpserver -l0 -R -H -x /etc/tcp.smtp.cdb -v -u `id -u qmaild` -g `id -g qmaild` 0 $submission_port /var/qmail/bin/qmail-smtpd $1 /home/vpopmail/bin/vchkpw /bin/true 2>&1 | /var/qmail/bin/splogger smtpd 3 &" >> rc
echo "/usr/local/bin/tcpserver -l0 -R -H 0 pop3 /var/qmail/bin/qmail-popup $1 /home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir &" >> rc
ln -s /var/qmail/rc /etc/rc.d/qmail
# ==== 起動 =========================================
exec env - PATH="/var/qmail/bin:$PATH" qmail-start ./Maildir/ splogger qmail &
/usr/local/bin/tcpserver -l0 -R -H -x /etc/tcp.smtp.cdb -v -u `id -u qmaild` -g `id -g qmaild` 0 $smtp_port /var/qmail/bin/qmail-smtpd "$1" /home/vpopmail/bin/vchkpw /bin/true 2>&1 | /var/qmail/bin/splogger smtpd 3 &
/usr/local/bin/tcpserver -l0 -R -H -x /etc/tcp.smtp.cdb -v -u `id -u qmaild` -g `id -g qmaild` 0 $submission_port /var/qmail/bin/qmail-smtpd "$1" /home/vpopmail/bin/vchkpw /bin/true 2>&1 | /var/qmail/bin/splogger smtpd 3 &
/usr/local/bin/tcpserver -l0 -R -H 0 pop3 /var/qmail/bin/qmail-popup "$1" /home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir &
# ==== sendmailシンボリックリンク ===================
if [ -f /usr/sbin/sendmail ]; then
mv /usr/sbin/sendmail /usr/sbin/sendmail.old
chmod 0 /usr/sbin/sendmail.old
fi
ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail
# ==== ユーザ作成時にMaildirを自動で設置 ============
/var/qmail/bin/maildirmake /usr/share/skel/Maildir
# ==== 終了メッセージ ===============================
echo "----------------------------------------"
echo ""
echo " CONGRATS!"
echo " qmail Installation was Successful."
echo ""
echo "----------------------- From sio(^_^) --"
echo ""
CentOSでほぼ同構成+αで運用していますが、gmailからエイリアスメール送信の為にtcpserverのssl(tlsv1.2)化が必須なので、それもあると良いと思います。
パッチは下記で配布されています。
wget http://www.nrg4u.com/qmail/ucspi-tcp-ssl-20050405.patch.gz
その際、脆弱性のあるssl2、3、tls1、1_1も使用可能なので、
https://http2.try-and-test.net/qmail.html
の変更も適用されると良さそうです。
上記変更を適用する際、openssl-develのバージョンによっては
#ifdef SSL_OP_SAFARI_ECDHE_ECDSA_BUG
nOptions|=SSL_OP_SAFARI_ECDHE_ECDSA_BUG;
#endif
が必要かもしれません(CentOS6系では必要でした)
echo “3600” > queuelifetime とすべきところが tcp.smtp に書き込むようになっていますね.