自宅サーバーでメールサーバーを運用するための設定メモを残す。
更新履歴
(2024.07.20) 作成。
目次
1. はじめに
Rocky Linux 9 上に独自のメールサーバーを立てるための設定メモを残す。
以下を前提とする。
- 自宅サーバーは 219.117.195.5 で運用しているものとする。
- 独自ドメイン(ここでは nminoru.jp とする)は取得・運用済とする。
- 独自ドメインに対するサーバー証明書も取得済とする。
- SPF/DKIM/DMARC を設定する。
設定するサービスは以下の3つとなる。
- Postfix
- Dovecot
- OpenDKIM
最終的に自宅サーバーでは以下のサービスを公開する。
種類 | ポート |
---|---|
SMTP、SMTPS | tcp/25、tcp/587 |
IMAPS | tcp/993 |
メールサーバーは迷惑メール対策に対策として SPF/DKIM/DMARC の設定も必要となる。
種類 | 目的 | 必要な作業 |
---|---|---|
SPF | メールを受信したサーバーが、送信元サーバーの IP アドレスを確認可能にする。 |
|
DKIM | メールを受信したサーバーが、送信元サーバーが送ったメールの署名を確認可能にする。 | |
DMARC | メールを受信したサーバーが、SPF/DKIM による認証が失敗したメールの扱いを定義可能にする。 |
|
独自ドメインに対するサーバー証明書は Let's Encrypt で取得し、以下のパスに格納しているものとする。 Let's Encrypyt による証明書の習得は Let's Encryptの設定メモ を参照のこと。
- /etc/letsencrypt/live/nminoru.jp/fullchain.pem
- /etc/letsencrypt/live/nminoru.jp/privkey.pem
2. 事前の Linux 設定
Rocky Linux 9 へパッケージをインストールする。
sudo dnf install epel-release sudo dnf config-manager --set-enabled crb sudo dnf install postfix dovecot opendkim opendkim-tools
3. メールサービスの設定
3.1 Postfix の設定
メールサーバーである postfix の設定を行う。
まず sendmail など他のメールサーバーソフトが入っている場合、postfix をメールサーバーとして使うように指定する。
sudo alternatives --config mta
postfix の設定ファイルを変更・修正する。
myhostname = ns.nminoru.jp mydomain = nminoru.jp myorigin = $mydomain # 以下のように修正する inet_interfaces = all mydestination = $mydomain, localhost, $myhostname, localhost.$mydomain, mail.$mydomain mynetworks_style = subnet mynetworks = 127.0.0.0/8 10/8 canonical_maps = hash:/etc/postfix/canonical masquerade_domains = $mydomain masquerade_exceptions = root,mailer-daemon home_mailbox = Maildir/ smtpd_banner = $myhostname ESMTP unknown smtpd_tls_cert_file = /etc/letsencrypt/live/nminoru.jp/fullchain.pem smtpd_tls_key_file = /etc/letsencrypt/live/nminoru.jp/privkey.pem smtpd_helo_required = yes smtpd_helo_restrictions = permit_mynetworks, reject_non_fqdn_helo_hostname, reject_invalid_helo_hostname, permit smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unknown_client_hostname, check_client_access hash:/etc/postfix/access, permit smtpd_sender_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unknown_sender_domain, check_sender_access hash:/etc/postfix/access, permit # SASL 認証を有効化 smtpd_sasl_auth_enable = yes Dovecot SASL ライブラリを指定 smtpd_sasl_type = dovecot # Dovecot SASL ライブラリの認証ソケットファイル /var/spool/postfix/ からの相対パスで記述 smtpd_sasl_path = private/auth # 古いバージョンの AUTH コマンド (RFC 2554) を実装した SMTP クライアントとの相互運用性を有効にする broken_sasl_auth_clients = yes ########## TLS/SSL関連 ########## # TLSを有効化 smtpd_use_tls = yes # TLSログレベルの設定 # 0:出力しない 1:TLSハンドシェイクと証明書情報 2:TLSネゴシエーションの全て smtpd_tls_loglevel = 1 # 暗号に関する情報を "Received:" メッセージヘッダに含める smtpd_tls_received_header = yes # 接続キャッシュファイルの指定 smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache # キャッシュの保持時間の指定 smtpd_tls_session_cache_timeout = 3600s # SSLv2、SSLv3 の無効化 smtp_tls_protocols = !SSLv2,!SSLv3,!TLSv1,!TLSv1.1 smtp_tls_mandatory_protocols = !SSLv2,!SSLv3,!TLSv1,!TLSv1.1 smtpd_tls_protocols = !SSLv2,!SSLv3,!TLSv1,!TLSv1.1 smtpd_tls_mandatory_protocols = !SSLv2,!SSLv3,!TLSv1,!TLSv1.1 # DKIM利用 smtpd_milters = inet:127.0.0.1:8891 non_smtpd_milters = inet:localhost:8891 milter_default_action = accept
submission inet n - n - - smtpd -o syslog_name=postfix/submission # -o smtpd_tls_security_level=encrypt -o smtpd_tls_security_level=may -o smtpd_sasl_auth_enable=yes -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth # -o smtpd_reject_unlisted_recipient=no # -o smtpd_client_restrictions=$mua_client_restrictions # -o smtpd_helo_restrictions=$mua_helo_restrictions # -o smtpd_sender_restrictions=$mua_sender_restrictions # -o smtpd_recipient_restrictions= -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
3.2 Dovecot の設定
POP/IMAP サーバーである dovecot を設定する。
protocols = imap pop3 lmtp listen = *
#以下の行を追加する disable_plaintext_auth = no #以下の行をコメントアウト #!include auth-system.conf.ext #以下の行を有効化 !include auth-passwdfile.conf.ext
mail_location = maildir:~/Maildir
#以下の行のように修正する ssl_cert = </etc/letsencrypt/live/nminoru.jp/fullchain.pem ssl_key = </etc/letsencrypt/live/nminoru.jp/privkey.pem
#以下の行のように修正する service auth { # Postfix smtp-auth unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix } }
dovecot へアクセスする際には、パスワードが必要となる。 これは /etc/dovecot/users に記述する。 nminoru というユーザーが、8558q4QNQ2 というパスワードでアクセスを許可される。
POP/IMAP へのログインはユーザー名とメールアドレスの両方が使えるように2行を用意する。
nminoru:{PLAIN}8558q4QNQ2:1000:1000::/home/nminoru nminoru@nminoru.jp:{PLAIN}8558q4QNQ2:1000:1000::/home/nminoru
3.3 OpenDKIM の設定
OpenDKIM を使うには、公開秘密鍵のキーペアを作成する必要がある。 まずキーペアの保存用フォルダを作成する。
sudo mkdir -p /etc/opendkim/keys/nminoru.jp/
キーペアは opendkim-tools パッケージに含まれる opendkim-genkey コマンドを使う。
opendkim-genkey コマンドは opendkim-genkey -D (ファイルの保存パス) -d (ドメイン名) -s (セレクト名)
のように指定する。
セレクト名は例えば日付(20231228)を文字化して指定する。
sudo opendkim-genkey -D /etc/opendkim/keys/nminoru.jp/ -d nminoru.jp -s 20231228
上記のコマンドを入力すると、以下の2ファイルができる。
sudo ls -laF /etc/opendkim/keys/nminoru.jp/ total 8 drwxr-xr-x. 2 opendkim opendkim 50 Dec 28 2023 ./ drwxr-x---. 3 opendkim opendkim 24 Dec 28 2023 ../ -rw-------. 1 opendkim opendkim 887 Dec 28 2023 20231228.private -rw-------. 1 opendkim opendkim 316 Dec 28 2023 20231228.txt
キーペアのファイルの所有者を変更する。
sudo chown -R opendkim:opendkim /etc/opendkim/keys/nminoru.jp/
# メールの送信("s")と受信("v")の両方で確認する Mode sv # KeyFile パラメーターを無効化する(コメントアウト) # KeyFile /etc/opendkim/keys/default.private # KeyTable パラメーターを有効化する KeyTable /etc/opendkim/KeyTable # SigningTable パラメーターを有効化する SigningTable refile:/etc/opendkim/SigningTable # ExternalIgnoreList パラメーターを有効化する # ExternalIgnoreList ExternalIgnoreList refile:/etc/opendkim/TrustedHosts # InternalHosts パラメーターを有効化する InternalHosts refile:/etc/opendkim/TrustedHosts
20231228._domainkey.nminoru.jp nminoru.jp:20231228:/etc/opendkim/keys/nminoru.jp/20231228.private
*@nminoru.jp 20231228._domainkey.nminoru.jp
127.0.0.1 ::1 10.0.0.0/8
4. サービス設定後の処理
4.1 Firewall の設定
起動したサービスを自宅ネットワークからのアクセスできるように Firewall にポートを公開する設定を実施する。
sudo firewall-cmd --add-service=smtp --zone=public --permanent sudo firewall-cmd --add-service=imaps --zone=public --permanent sudo firewall-cmd --add-port=587/tcp --zone=public --permanent sudo firewall-cmd --reload
4.2 DNS の設定
DNS に SPF/DKIM/DMARC を設定する。
SPF の設定
SPF は DNS に TXT レコードを追加する。
nminoru.jp IN TXT "v=spf1 ip4:219.117.195.0/24 -all"
DKIM の設定
DKIM は opendkim をインストールして設定した上で、DNS に TXT レコードを追加する。 DKIM はセレクター種別によって複数設定することができるが、3.3 OpenDKIM の設定 で指定した 20231228 というセレクターを指定する。 20231228._domainkey.nminoru.jp の TXT レコードを作成することになる。 /etc/opendkim/keys/nminoru.jp/20231228.txt に登録すべき TXT レコードの内容がそのまま入っているので転記すればよい。
また DKIM 署名が有効でないメールの扱いを設定するために ADSP レコードを登録する。 ここは all、unknown、discardable を選択できる。 ここでは unknown を指定する。
20231228._domainkey.nminoru.jp IN TXT "v=DKIM1; k=rsa; p=(公開鍵)" _adsp._domainkey.nminoru.jp IN TXT dkim=unknown
DMARC の設定
DMARC は DNS に TXT レコードを設定することで、SPF と DKIM が失敗した場合の取り扱いを指定する。
_dmarc.nminoru.jp IN TXT "v=DMARC1; p=quarantine; ruf=mailto:root@nminoru.jp; adkim=r; aspf=r"
SPF/DKIM/DMARC の設定の確認
自分のドメインから GMail にメールを送信し、そのヘッダーを確認する。 GMail が受信したメールには Authentication-Results ヘッダーを確認する。 SPF/DKIM/DMARC の設定に成功していれば、以下のように pass と判定される。
Authentication-Results: mx.google.com; dkim=pass header.i=@nminoru.jp header.s=20231228 header.b=N8bgECdK; spf=pass (google.com: domain of nminoru@nminoru.jp designates 219.117.195.5 as permitted sender) smtp.mailfrom=nminoru@nminoru.jp; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=nminoru.jp
4.3 Systemctl の設定
systemctl でメールサービス(3.)を有効化する。
sudo systemctl enable postfix sudo systemctl enable dovecot sudo systemctl enable opendkim
5. メールサービスの日常的な設定
メールサーバーを構築後に、受信を許可・拒否するドメインを設定したり、エイリアスを設定したりする。 そのやり方を説明する。
5.1 ローカルホストメールの正規化
ローカルネットワーク(自宅ネットワーク)内のホストからメールを送信しようとした場合、@(ホスト名).(ドメイン) のようなメールアドレスが付くことがある。 例えば host1.nminoru.jp からメールを送信すると @host1.nminoru.jp のようなメールドメインとなる。 これを @host1.nminoru.jp → @nminoru.jp のようにまるめることができる。
これは /etc/postfix/canonical ファイルにルールを記述する。
@host1.nminoru.jp @nminoru.jp @host1.localhost @nminoru.jp
/etc/postfix/canonical ファイルを更新した後は以下を実行する。
sudo postmap /etc/postfix/canonical
5.2 受信を許可・拒否するドメインの設定
特定のドメインからのメールを一律で受信したり、逆に拒否する設定ができる。
これは /etc/postfix/access ファイルにルールを記述する。
daimaru-matsuzakaya.jp OK s790813.srvape.com REJECT
/etc/postfix/access ファイルを更新した後は以下を実行する。
sudo postmap /etc/postfix/access
5.3 エイリアスの設定
nminoru.jp ドメインにエイリアスを追加することができる。 例えば netflix@nminoru.jp や niconico@nminoru.jp をエイリアスとして追加し、実際は nminoru@nminoru.jp へ転送して受け取るようにする。
これは /etc/aliases ファイルに記述する。
netflix: nminoru niconico: nminoru
/etc/aliases ファイルを更新した後は以下を実行する。
sudo newaliases