FreeBSDでメールサーバー構築(qmail+VPopMail+SMTP AUTH他)

20年以上バージョンアップ無しという枯れきったMTA「qmail」の代替をここ数ヶ月暇さえあれば探してきましたが、qmailに骨をうずめようという考えに至りました。

ただ最近のメール事情に合わせるとなると数多くのパッチが必要ですが、それらのパッチも長い歳月の間に配布元が閉鎖してしまっていたりして、入手が困難なものも存在します。

また本体及び関連プログラムをコンパイルする環境も変わり、makeでエラーが出たりすることも珍しくない状況です。

qmailのライセンスがパブリックドメインになったことにより派生版なども出ていますが、将来的に不安な部分も多かったため、以下のようなポリシーでインストールスクリプトを組みました。

QMAIL103PKGポリシー

  • オリジナルのqmail1.03を使用
  • なるべくファイル書き換えには古くからあるオリジナルパッチを使用
  • 派生版は消滅の可能性が高いので使わない
  • pkg等は使わずにコンパイルすることでブラックボックス化を防ぐ
  • 冗長的であっても処理の分かりやすさを優先

このスクリプトで構築される環境は以下のような感じです。

  • cdb + tcpserver + qmail + SMTP AUTH + VPopMail
  • ポート587でSMTP AUTHのみ受け付ける

セットアップされるqmail関連プログラム

必須qmail-1.03.tar.gz(qmail本体)
Download 配布元 ミラー(このサイト)
任意qmail-date-localtime.patch(日本時間対応パッチ)
Download 配布元 ミラー(このサイト)
任意qmail-smtpd-relay-reject.patch(不正中継拒否)
Download 配布元 ミラー(このサイト)
任意qmail-0.0.0.0.patch(IPアドレス0.0.0.0への対応)
Download 配布元 ミラー(このサイト)
任意qmail-1.03.errno.patch(最近のglib対応)
Download 配布元 ミラー(このサイト)
任意sendmail-flagf.patch(sendmailの-fオプションに対応)
Download 配布元 ミラー(このサイト)
任意qmail-103.patch(DNSから512byte超えのDNSSEC対応)
Download 配布元 ミラー(このサイト)
必須ucspi-tcp-0.88.tar.gz(tcpserver)
Download 配布元 ミラー(このサイト)
必須cdb-0.75.tar.gz(高速データベース)
Download 配布元 ミラー(このサイト)
任意checkpassword-0.90.tar.gz(vpopmailを使わない環境でのPOP認証用)
Download 配布元 ミラー(このサイト)
必須vpopmail-5.4.33.tar.gz(バーチャルドメイン)
Download 配布元 ミラー(このサイト)
任意ucspi-rss.diff(rblsmtpdをAレコードに対応)
Download 配布元 ミラー(このサイト)
必須qmail-smtpd-auth-0.31.tar.gz(SMTP AUTH実装)
Download 配布元 ミラー(このサイト)
必須qmail-smtpd-auth-close3.patch(qmail-smtpd-auth-0.31のバグ修正)
Download 配布元 ミラー(このサイト)
任意qmail-remote-auth.patch(外部SMTPのSMTP AUTH実装)
Download 配布元 ミラー(このサイト)
任意qmail-extra-patch-utmpx.patch(utmp.hからutmpx.hに変わったFreeBSD 9.0以降では必須)
Download 配布元 ミラー(このサイト)
任意qmail-amd64.patch(amd64環境でのバグ対策)
Download 配布元 ミラー(このサイト)
任意vpopmail-vchkpw-c.patch(CRAM-MD5処理のバグ修正)
Download 配布元 ミラー(このサイト)
任意ucspi-conf-cc.patch(gccが入っていない環境でccを使う)
Download 配布元(このサイト)
任意ucspi-conf-ld.patch(gccが入っていない環境でccを使う)
Download 配布元(このサイト)
任意cdb-conf-cc.patch(gccが入っていない環境でccを使う)
Download 配布元(このサイト)
任意cdb-conf-ld.patch(gccが入っていない環境でccを使う)
Download 配布元(このサイト)
任意checkpassword-conf-cc.patch(gccが入っていない環境でccを使う)
Download 配布元(このサイト)
任意checkpassword-conf-ld.patch(gccが入っていない環境でccを使う)
Download 配布元(このサイト)

qmail自動インストールスクリプト

必須QMAIL103PKG.sh(qmail関連自動セットアップ)
Download 配布元(このサイト)
#!/bin/sh

# =====================================================
#   QMAIL103PKG, Copyright 2018 IISYS sio(^^)
#   https://www.ii-sys.jp/
#   GNU GPL https://www.gnu.org/licenses/gpl.txt
#   改良してぜひ公開してください!
# =====================================================
# [FreeBSD専用]
# 
# [概要]
#   オリジナルのqmail(1.03)を使用して以下の環境を構築するためのスクリプトです。
#   ・cdb + tcpserver + qmail + SMTP AUTH + VPopMail
#   ・ポート587でSMTP AUTHのみ受け付ける
# 
# [ポリシー]
#   ・なるべくファイル書き換えには古くからあるオリジナルパッチを使用
#   ・派生版は消滅の可能性が高いので使わない
#   ・pkg等は使わずにコンパイルすることでブラックボックス化を防ぐ
#   ・冗長的であっても処理の分かりやすさを優先
# 
# ==== 履歴 ===========================================
# 2018.06.17 公開
# 
# ==== 準備 ===========================================
# ■ 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)に下記を配置
#   ◎このスクリプト ------------------ 必須
#   ◎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環境でのバグ対策)
#   ・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
#   sh ./qmail103pkg.sh ARG1
# ARG1にはFQDN(ホスト名.ドメイン名)
#   例)
#   sh ./qmail103pkg.sh hostname.example.com
# 
# ==== 設定 =========================================
# 「=」の前後にスペースを入れないように
# 
# カレントディレクトリ
current_dir="/usr/local/src"

# SMTP AUTH ポート番号
smtp_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_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 /usr/local/etc/rc.d/qmail.sh ] ; then
  /bin/rm /usr/local/etc/rc.d/qmail.sh
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_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_extra_patch_utmpx" ] ; then
  patch -s -p1 < ../"$souce_qmail_extra_patch_utmpx"
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

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のインストール ======================
if [ -f "$souce_ucspi_tcp" ] ; then
  cd "$current_dir"
  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インストール ==============================
if [ -f "$souce_cdb" ] ; then
  cd "$current_dir"
  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 ================================
if [ -f "$souce_checkpassword" ] ; then
  cd "$current_dir"
  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インストール =========================
if [ -f "$souce_vpopmail" ] ; then
  cd "$current_dir"
  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 'case "$1" in' >> rc
echo 'start)' >> 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 0 pop3 /var/qmail/bin/qmail-popup $1 /home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir &" >> rc

echo ';;' >> rc
echo ' ' >> rc
echo 'stop)' >> rc
echo ';;' >> rc
echo ' ' >> rc
echo '*)' >> rc
echo ';;' >> rc
echo ' ' >> rc
echo 'esac' >> rc
echo ' ' >> rc
echo 'exit 0' >> rc
echo ' ' >> rc

ln -s /var/qmail/rc /usr/local/etc/rc.d/qmail.sh

# ==== 起動 =========================================
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 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 ""

QMAIL103PKG 使い方

  1. qmail103pkg.shおよびqmail-1.03.tar.gzと関連プログラムを任意のディレクトリに置きます。
    (例として/usr/local/src)
  2. rootになり以下のコマンドを実行します。
    cd /usr/local/src
    sh ./qmail103pkg.sh hostname.example.com

    hostname.example.comにはFQDN(ホスト名.ドメイン名)を指定します。

QMAIL103PKG(qmail関連プログラムアーカイブ)

それぞれの環境によって必要なプログラムを吟味していくのが良いと思いますが、上記で紹介した全てのプログラム(qmail本体およびqmail103pkg.shを含む)のアーカイブです。

QMAIL103PKG.zip(qmail関連自動セットアップ詰め合わせ)
Download 配布元(このサイト)

 

投稿者: iisys

この投稿に関する情報やご意見をお待ちしています。

メールアドレスは公開されません。