netqmailによるSMTPサーバの作成 on CentOS7

自分の作業記録として。

qmailを使って自分とこのメール配信サービスを構築した手順です。さすがにqmail自体が現在のシステムに合わない部分があるので、パッチ当ててみたりその他のシステム(特にsystemd)と連携させたりとか思ったよりも大変だった…

今回の目的は

  • MTAとしてはqmailを(あえて)使う。postfixとかは使わない!
  • supervise(daemontools)は使わない
  • SMTP-AUTHおよびSTARTTLSに対応させる。その際にはLet’s Encrypt証明書を利用する。
  • あわせてSPF、DMARCの設定も行う(DKIMもやりたいけど、もう少し調べてから)

を達成すること。

環境準備、ビルドに必要なパッケージのインストール

ソースからビルドするので、必要なツールやライブラリを事前にインストールしておく。

mkdir ~/src
yum -y install make patch gcc gcc-cpp openssl-devel pam-devel

インストール

libdomainkeys

cd ~/src
wget http://notes.sagredo.eu/files/qmail/tar/libdomainkeys-0.69.tar.gz
tar xzf libdomainkeys-0.69.tar.gz
wget http://notes.sagredo.eu/files/qmail/patches/libdomainkeys-0.69.diff
ln -s libdomainkeys-0.69 libdomainkeys
cd libdomainkeys
chown -R root.root .
patch < ../libdomainkeys-0.69.diff
make
sudo cp libdomainkeys.a /usr/lib

libsrs2

cd ~/src
wget http://www.libsrs2.org/srs/libsrs2-1.0.18.tar.gz
tar xzf libsrs2-1.0.18.tar.gz
cd libsrs2-1.0.18
./configure
make
sudo make install
sudo ldconfig -v | grep srs

入ってない。

$ sudo ldconfig -v | grep srs
ldconfig: /libx32 の情報取得 (stat) ができません: そのようなファイルやディレクトリはありません
ldconfig: パス `/usr/lib' が二回以上与えられました
ldconfig: パス `/usr/lib64' が二回以上与えられました
ldconfig: /usr/libx32 の情報取得 (stat) ができません: そのようなファイルやディレクトリはありません
$ ls /usr/local/lib
libsrs2.a  libsrs2.la  libsrs2.so  libsrs2.so.0  libsrs2.so.0.0.0

/usr/local/libになってるのでld.so.confに/usr/local/libを追加してやり直し。

$ echo /usr/local/lib | sudo tee /etc/ld.so.conf.d/local-libs.conf
/usr/local/lib
$ cat /etc/ld.so.conf.d/local-libs.conf
/usr/local/lib
$ sudo ldconfig -v | grep srs
ldconfig: /libx32 の情報取得 (stat) ができません: そのようなファイルやディレクトリはありません
ldconfig: パス `/usr/lib' が二回以上与えられました
ldconfig: パス `/usr/lib64' が二回以上与えられました
ldconfig: /usr/libx32 の情報取得 (stat) ができません: そのようなファイルやディレクトリはありません
    libsrs2.so.0 -> libsrs2.so.0.0.0

vpopmail

netqmailに適用するパッチに含まれるchkuserがvpopmailのユーザチェック機能を使用するので、vpopmail自体は使わないけどインストール

ソースはsourceforgeにあるのでそこからとってくる。
vpopmail – virtual domains for qmail – Browse Files at SourceForge.net

sudo groupadd vchkpw
sudo useradd -g vchkpw -d /home/vpopmail vpopmail
sudo mkdir -p /var/qmail/bin
sudo touch /var/qmail/bin/qmail-inject
sudo touch /var/qmail/bin/qmail-newu
sudo touch /var/qmail/bin/qmail-newmhr
cd ~/src
tar xzf vpopmail-5.4.33.tar.gz
cd vpopmail-5.4.33
sudo ./configure
sudo make install-strip

netqmailインストール環境準備

必要な設定ファイルを /etc 配下にまとめる目的で、qmailの制御ファイル格納ディレクトリ /var/qmail/control/etc/qmail のシンボリックリンクとしておく。

sudo mkdir /etc/qmail
sudo ln -s /etc/qmail /var/qmail/control

netqmail + patch

qmailにいろいろパッチ当ててあるnetqmailへ、更にいろいろな追加機能のパッチを適用。

cd ~/src
wget http://www.qmail.org/netqmail-1.06.tar.gz
tar xzf netqmail-1.06.tar.gz
wget http://notes.sagredo.eu/files/qmail/patches/roberto-netqmail-1.06.patch-latest.gz
cd netqmail-1.06
gunzip -c ../roberto-netqmail-1.06.patch-latest.gz | patch

INSTALL.ids より、ユーザ作成。シェルにしてroot権限で実行するのが楽(というか手順ではそれを推奨している)

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

んで、ビルド。

sudo make setup check
sudo ./config-fast {FQDN}

設定された内容の確認は /var/qmail/bin/qmail-showctl を使う。その他のパラメータいじりたい場合は /var/qmail/control 配下に設定ファイルを作成する。

これぐらいはやっとけ

/var/qmail/control/locals にローカル配送の対象となる宛先ドメイン名を書いておく。自分の場合は以下の通り。

localhost
infrastudy.com
mail.infrastudy.com

エイリアス

よくある宛先(rootとかpostmasterとか)へのメールを特定のユーザ宛に転送するようにエイリアス設定する

echo "ユーザ名" | sudo tee -a /var/qmail/alias/.qmail-root
sudo ln -s /var/qmail/alias/.qmail-root /var/qmail/alias/.qmail-postmaster
sudo ln -s /var/qmail/alias/.qmail-root /var/qmail/alias/.qmail-mailer-daemon

STARTTLS用の作業

証明書を作成する。

$ sudo make cert
Generating a 2048 bit RSA private key
........+++
................................................+++
writing new private key to '/var/qmail/control/servercert.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Japan
Locality Name (eg, city) [Default City]:Somewhere
Organization Name (eg, company) [Default Company Ltd]:infrastudy.com
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:mail.infrastudy.com
Email Address []:postmaster@infrastudy.com
$ sudo make tmprsadh
echo "Creating new temporary RSA and DH parameters"
Creating new temporary RSA and DH parameters
./update_tmprsadh
Generating RSA private key, 2048 bit long modulus
...............................................+++
................................................+++
e is 65537 (0x10001)
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
....................................+.....................................................
(略)
.......................+...+.........+....................................................................................................................................................................................+......................................................+..............+................................+........++*++*
$ sudo chown vpopmail.vchkpw /var/qmail/control/*.pem

日次でRSADHの更新を行うようにcrontabにエントリ追加。

# crontab -e
03 05 * * * /var/qmail/bin/update_tmprsadh > /dev/null 2>&1

Let’s Encryptの証明書を /var/qmail/control/servercert.pem にまとめる。

DOMAIN=infrastudy.com cat /etc/letsencrypt/live/${DOMAIN}/privkey.pem /etc/letsencrypt/live/${DOMAIN}/fullchain.pem > /var/qmail/control/servercert.pem

おまけ:dovecotでのSSL定義( /etc/dovecot/conf.d/10-ssl.conf

ssl_cert = </etc/letsencrypt/live/yourdomain.tld/fullchain.pem
ssl_key = </etc/letsencrypt/live/yourdomain.tld/privkey.pem

SMTP-AUTH用にcheckpasswordのインストール

どっちかを選ぶ
– checkpasswordの本体を入手して、sourceforgeからのパッチを適用
– PAM対応済みパッケージをsourceforge から入手

sourceforgeからとってくるのは checkpassword-pam download | SourceForge.net から。

cd ~/src
tar xzf checkpassword-pam-0.99.tar.gz
./configure
make
sudo make install

systemdとの連携

以下の内容で /etc/systemd/system/qmail.service を作成し、ローカル配送などのために必要なqmailのサービスを動作させる。

[Unit]
Description=Qmail mail delivery daemons
After=network.target

[Service]
ExecStart=/var/qmail/bin/qmail-start ./Maildir/ splogger qmail
Environment=PATH=/var/qmail/bin:${PATH}
Restart=always

[Install]
WantedBy=multi-user.target

ポート25で待受するサービス。待ち受けるための.socketとそこから呼び出すテンプレートサービスが必要。
ハマりどころだったのが、.serviceの StandardError=journal 。これがないと標準エラー出力までも qmail-smtpd からの応答として相手に出力してしまうため、SMTPとしてのシーケンスが崩れてしまいメールの配信に失敗してしまう。

/etc/systemd/system/qmail-smtpd.socket

[Unit]
Description=SMTP Socket

[Socket]
ListenStream=0.0.0.0:25
Accept=yes

[Install]
WantedBy=sockets.target

/etc/systemd/system/qmail-smtpd@.service

[Unit]
Description=qmail SMTPd Service

[Service]
EnvironmentFile=/etc/qmail/env-smtpauth
ExecStart=/var/qmail/bin/qmail-smtpd /usr/local/bin/checkpassword-pam /usr/bin/true
Restart=no
Type=simple
User=qmaild
StandardInput=socket
StandardError=journal

[Install]
WantedBy=multi-user.target

クライアントから接続するサブミッションポート(587/tcp)用のソケットも追加する。

/etc/systemd/system/qmail-smtpd-auth.socket

[Unit]
Description=SMTP Submission Socket

[Socket]
ListenStream=0.0.0.0:587
Accept=yes

[Install]
WantedBy=sockets.target

/etc/systemd/system/qmail-smtpd-auth@.service

[Unit]
Description=qmail SMTPd Submission-port Service

[Service]
EnvironmentFile=/etc/qmail/env-smtpauth
ExecStart=/var/qmail/bin/qmail-smtpd /usr/local/bin/checkpassword-pam /usr/bin/true
Restart=no
Type=simple
User=qmaild
StandardInput=socket
StandardError=journal

[Install]
WantedBy=multi-user.target

これらを有効化+起動。

sudo systemctl enable qmail
sudo systemctl enable qmail-smtpd.socket
sudo systemctl enable qmail-smtpd-auth.socket
sudo systemctl start qmail
sudo systemctl start qmail-smtpd.socket
sudo systemctl start qmail-smtpd-auth.socket

firewall-cmd での穴あけも忘れずに

sudo firewall-cmd --add-service=smtp --permanent --zone=public
sudo firewall-cmd --add-service=smtp-submission --permanent --zone=public
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

最後に、.serviceから参照してる EnvironmentFile ( /etc/qmail/env-smtpauth )を作成する。ここでSMTP-Authの挙動だとか、 qmail-smtpd にわたす環境変数を定義する。今回はSTARTTLS後にSMTP-AUTHするので、AUTH PLAINが使えるようにだけしておく。

SMTPAUTH=''

SPF、DKIM、DMARC

自ドメインのTXTレコードに登録。以下は私の環境でのtinydns-dataファイルから関連するものだけを抜粋。

@infrastudy.com::mail.infrastudy.com:10
=mail.infrastudy.com:150.95.213.161

### for DMARC
'_dmarc.infrastudy.com:v=DMARC1;\040p=quarantine;\040rua=mailto\072postmaster@infrastudy.com;\040ruf=mailto\072postmaster@infrastudy.com

### for SPF
'infrastudy.com:v=spf1 ip4\072150.95.213.161 -all

SPAM避け(2018/10/30追記)

SPFチェック有効化

SPFパッチの提供元を確認する。

qmail SPF (Sender Policy Framework) patch

上記サイトではパラメータについて以下のように記述されている。

spfbehavior
Use this to turn on SPF checking. The default value is 0 (off).
You can specify a value between 0 and 6:
0: Never do SPF lookups, don’t create Received-SPF headers
1: Only create Received-SPF headers, never block
2: Use temporary errors when you have DNS lookup problems
3: Reject mails when SPF resolves to fail (deny)
4: Reject mails when SPF resolves to softfail
5: Reject mails when SPF resolves to neutral
6: Reject mails when SPF does not resolve to pass
Values bigger than 3 are strongly discouraged, you probably want to go with 2 or 3.
Important: This setting can be overridden using the environment variable SPFBEHAVIOR, e.g. from tcpserver rules.
Note: If RELAYCLIENT is set, SPF checks won’t run at all.
(This also includes SMTP-AUTH and similar patches)

ブロックすることが目的なので、とりあえず echo 2 > /var/qmail/control/spfbehavior とする。

参考

Patching qmail
よろずな情報屋

コメント

タイトルとURLをコピーしました