コンテンツにスキップ

PostfixとDovecotの設定(SMTP AUTHなし・TLSなし)

PostfixのTCP 25、DovecotのLMTPとIMAPを構成し、SMTP AUTHを使わずにローカルドメイン宛てのメールを送受信する。


項目 値
OS Debian 13.x
メールサーバー mail.example.com
IPアドレス 192.0.2.10
検証用クライアント 192.0.2.20
メールドメイン example.com
送信ユーザー alice / alice@example.com
受信ユーザー bob / bob@example.com
メールボックス ~/Maildir
SMTP TCP 25、SMTP AUTHなし
Submission 使用しない
IMAP TCP 143、PAM認証

SMTP AUTHを使わないのはPostfixへのメール送信である。DovecotのIMAPでは、利用者ごとのメールボックスを保護するためユーザー認証を行う。

DNSを使わず確認する場合は、サーバーとクライアントの/etc/hostsで192.0.2.10 mail.example.comを名前解決できるようにする。

ネットワーク動作は、mynetworksに含まれない検証用Debianクライアントから確認する。クライアントへ検証用コマンドをインストールする。

Terminal window
sudo apt update
sudo apt install swaks netcat-openbsd

区分 内容
必須 TCP 25の受信、第三者中継の拒否、Dovecot LMTP、Maildir、IMAP認証
任意 管理下のネットワークからの未認証中継、IPv6の待受

Terminal window
sudo hostnamectl set-hostname mail.example.com

/etc/hostsにホスト名を登録する。

/etc/hosts
127.0.0.1 localhost
127.0.1.1 mail.example.com mail
Terminal window
hostname --fqdn

mail.example.comが表示されることを確認する。


2. パッケージをインストールする

Section titled “2. パッケージをインストールする”
Terminal window
sudo apt update
sudo apt install postfix dovecot-core dovecot-imapd dovecot-lmtpd

Postfixの設定形式を聞かれた場合はInternet Site、System mail nameはexample.comを指定する。後の手順でmain.cfを完成形へ置き換える。

Terminal window
postconf mail_version
dovecot --version

Debian 13ではPostfix 3.10系とDovecot 2.4系が表示される。


Terminal window
sudo adduser alice
sudo adduser bob

各コマンドの対話入力で検証用パスワードを設定する。Linuxユーザー名がメールアドレスのローカル部に対応する。

Terminal window
getent passwd alice bob

aliceとbobのUID、GID、ホームディレクトリが表示されることを確認する。


/etc/postfix/main.cfを開き、既存の内容を次の設定へ置き換える。

Terminal window
sudoedit /etc/postfix/main.cf
/etc/postfix/main.cf
compatibility_level = 3.10
myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
inet_interfaces = all
inet_protocols = ipv4
mynetworks = 127.0.0.0/8
smtpd_relay_restrictions = permit_mynetworks, reject_unauth_destination
mailbox_transport = lmtp:unix:private/dovecot-lmtp
smtpd_sasl_auth_enable = no
smtpd_tls_security_level = none
smtp_tls_security_level = none

compatibility_level = 3.10はDebian 13のPostfix 3.10系の既定動作を使用する。

mydestinationにexample.comを含めることで、alice@example.comとbob@example.comをローカルユーザー宛てとして扱う。

alias_mapsはローカル配送時に参照するエイリアス、alias_databaseはnewaliasesで更新するエイリアスデータベースを/etc/aliasesへそろえる。

smtpd_relay_restrictionsにはpermit_sasl_authenticatedを含めない。mynetworksに含まれる接続元だけに外部ドメインへの中継を許可し、それ以外はreject_unauth_destinationで拒否する。mydestination宛てのメールは未認証でも受信する。

mailbox_transportはローカルユーザー宛ての最終配送をDovecot LMTPへ渡す。smtpd_sasl_auth_enable = noにより、TCP 25のEHLO応答へAUTHを追加しない。

smtpd_tls_security_levelは受信SMTP、smtp_tls_security_levelは送信SMTPのTLSを無効にする。

管理下のネットワークから未認証中継を許可する場合(任意)

Section titled “管理下のネットワークから未認証中継を許可する場合(任意)”

検証用クライアントを含む192.0.2.0/24から外部ドメインへの中継も許可する場合は、mynetworksを変更する。

mynetworks = 127.0.0.0/8, 192.0.2.0/24

mynetworksに含まれる端末はパスワードなしで任意の宛先へ中継できる。管理できない端末が接続するネットワークや、範囲の広いアドレスブロックは指定しない。

IPv4とIPv6の両方を使用する場合は、main.cfの2行を次のように変更する。

inet_protocols = all
mynetworks = 127.0.0.0/8, [::1]/128

信頼するIPv4ネットワークも使用する場合は、そのネットワークを同じmynetworksへ追加する。

設定値を確認する。

Terminal window
postconf -n

5. Submissionサービスが無効であることを確認する

Section titled “5. Submissionサービスが無効であることを確認する”

/etc/postfix/master.cfを開く。

Terminal window
sudoedit /etc/postfix/master.cf

submissionとsubmissionsで始まるサービス行と、その配下の-o行を有効化しない。

/etc/postfix/master.cf
#submission inet n - y - - smtpd
#submissions inet n - y - - smtpd

TCP 25のsmtpサービスは有効なままにする。TCP 587と465を起動しないため、メールクライアントはTCP 25へ接続する。


既存設定を保存する。

Terminal window
sudo cp -a /etc/dovecot/dovecot.conf \
/etc/dovecot/dovecot.conf.original

/etc/dovecot/dovecot.confを次の内容に置き換える。

Terminal window
sudoedit /etc/dovecot/dovecot.conf
/etc/dovecot/dovecot.conf
dovecot_config_version = 2.4.0
dovecot_storage_version = 2.4.0
protocols {
imap = yes
lmtp = yes
}
listen = 0.0.0.0
mail_driver = maildir
mail_path = ~/Maildir
first_valid_uid = 1000
namespace inbox {
inbox = yes
}
auth_mechanisms = plain login
auth_allow_cleartext = yes
auth_username_format = %{user | username}
passdb pam {
}
userdb passwd {
}
ssl = no
service imap-login {
inet_listener imap {
port = 143
}
}
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
user = postfix
group = postfix
mode = 0660
}
}
protocol lmtp {
postmaster_address = postmaster@example.com
}

mail_driverとmail_pathにより、LMTPの保存先とIMAPの参照先を~/Maildirへ統一する。auth_username_formatはbob@example.comからドメイン部分を除き、Linuxユーザーbobとして検索する。

service lmtpはPostfixから配送メッセージを受け取るソケットを作る。PostfixからSMTP AUTHを利用しないため、/var/spool/postfix/private/authへ認証ソケットを作成しない。Dovecot内部の認証処理はIMAPログインに使用する。

auth_allow_cleartext = yesはTLSなしのIMAPでPLAIN・LOGIN認証を許可する。IMAPのユーザー名、パスワード、メール本文は暗号化されずにネットワークを流れる。


/etc/pam.d/dovecotが存在しない場合は次の内容で作成する。

Terminal window
sudoedit /etc/pam.d/dovecot
/etc/pam.d/dovecot
auth required pam_unix.so
account required pam_unix.so

authはパスワードを検証し、accountはアカウントの有効期限や利用可否を確認する。


/etc/aliasesにpostmasterの転送先を設定する。既存のエイリアスは残す。

Terminal window
sudoedit /etc/aliases
/etc/aliases
postmaster: alice
Terminal window
sudo newaliases

Terminal window
sudo doveconf -n
sudo postfix check

エラーがなければ再起動する。

Terminal window
sudo systemctl restart dovecot
sudo systemctl restart postfix
sudo systemctl is-active dovecot postfix

両方がactiveになることを確認する。

Terminal window
sudo ss -lntp | grep -E ':(25|143|465|587|993)\b'

TCP 25と143が表示され、465、587、993が表示されないことを確認する。

Terminal window
sudo ls -l /var/spool/postfix/private/dovecot-lmtp
sudo test ! -S /var/spool/postfix/private/auth

LMTPソケットの所有者とグループがpostfix postfix、モードがsrw-rw----であり、Postfix向け認証ソケットが存在しないことを確認する。


10. Dovecotのユーザー検索とIMAP認証を確認する

Section titled “10. Dovecotのユーザー検索とIMAP認証を確認する”
Terminal window
sudo doveadm user alice
sudo doveadm user bob
sudo doveadm auth test bob
sudo doveadm auth test bob@example.com

UID、GID、homeがLinuxユーザーと一致し、bobとbob@example.comのどちらでもauth succeededになることを確認する。


11. SMTP AUTHなしでメールを送信する

Section titled “11. SMTP AUTHなしでメールを送信する”

検証用クライアントからTCP 25へ接続し、Bob宛てのメッセージを送信する。--authオプションは指定しない。

--from alice@example.comはSMTPのエンベロープ送信元を指定するだけで、Alice本人であることを証明しない。SMTP AUTHなしでは、接続元が任意の送信元アドレスを名乗れる。

Terminal window
swaks \
--server mail.example.com:25 \
--from alice@example.com \
--to bob@example.com \
--header 'Subject: no SMTP AUTH test' \
--body 'submitted without SMTP AUTH'

RCPT TO:<bob@example.com>とメッセージ受理に250が返ることを確認する。ローカルドメイン宛てであるため、接続元がmynetworksに含まれなくても受理される。

EHLO応答にSMTP AUTHがないことを確認する。

Terminal window
printf 'EHLO client.example.net\r\nQUIT\r\n' | nc mail.example.com 25

応答にAUTHが表示されないことを確認する。

同じ未認証クライアントから外部ドメイン宛ての中継を試す。

Terminal window
swaks \
--server mail.example.com:25 \
--from alice@example.com \
--to recipient@example.net \
--quit-after RCPT

mynetworksへ検証用ネットワークを追加していない場合は、Relay access deniedを含む454または554応答になることを確認する。

管理下のネットワークからの未認証中継を任意設定した場合は、同じRCPTが250で受理される。この確認では--quit-after RCPTにより実際の外部配送を発生させない。


Terminal window
postqueue -p
sudo find /home/bob/Maildir/new -maxdepth 1 -type f -printf '%f\n'
sudo journalctl -u postfix -u dovecot --since '-5 minutes'

キューが空になり、BobのMaildirにメールファイルが作成されることを確認する。Postfixログにはrelay=mail.example.com[private/dovecot-lmtp]とstatus=sentが表示される。


検証用クライアントから接続する。

Terminal window
nc mail.example.com 143

接続後に次のIMAPコマンドを入力する。BobPasswordは検証用パスワードへ置き換える。

a LOGIN bob@example.com BobPassword
b SELECT INBOX
c FETCH 1 BODY.PEEK[HEADER.FIELDS (FROM TO SUBJECT)]
d LOGOUT

a OKでログイン成功、b OKでINBOX選択成功となり、FETCHの応答に送信したメールのヘッダーが表示されることを確認する。


  • doveconf -nとpostfix checkがエラーにならない。
  • PostfixがTCP 25、DovecotがTCP 143で待ち受ける。
  • TCP 465、587、993では待ち受けない。
  • EHLO応答にAUTHが表示されない。
  • 未認証のTCP 25接続でローカルドメイン宛てのメールを受理する。
  • 信頼ネットワーク外から外部ドメインへの中継を拒否する。
  • Postfixがローカル宛てメールをDovecot LMTPへ渡す。
  • Dovecotが/home/bob/Maildirへメールを保存する。
  • IMAPではBobのPAM認証を要求し、Bobのメールボックスを表示する。
  • SMTPとIMAPでTLSを提供しない。