【メールサーバー構築 第2回】送信編 – 初心者脱却!不正中継を防ぐSMTP-AuthとSubmissionポートの完全構築ガイド

「ただ送れるだけ」のサーバーは、ただの「凶器」です

こんにちは!「リナックス先生」です。
前回はDNSやSSL証明書の準備、お疲れ様でした。今回はいよいよ、メールを「送る」ためのソフトウェア、Postfix(ポストフィックス)を構築します。

【連載】Postfix+Dovecotで作る 最強のセキュアメールサーバー構築
コウ君

先生、Postfixって設定ファイルがすごく長くて難しそうという噂を聞きました…。
「不正中継」とか「リレー」とか、専門用語も多くて不安です。
初心者でも本当に大丈夫でしょうか?

リナックス先生

大丈夫よ、コウ君。
確かに設定項目は数百個あるけれど、実際にいじる必要があるのは「20箇所」くらい。
一番恐ろしいのは、設定ミスで「誰でも使えるメールサーバー(オープンリレー)」にしてしまい、世界中のスパム業者の踏み台にされること。
今回はそれを防ぐための「認証機能」を、1行ずつ意味を説明しながら設定していくわ!

1. PostfixとSASLツールのインストール

まずは必要なソフトウェアをインストールします。
今回はPostfix本体だけでなく、パスワード認証(SMTP-Auth)を実現するために Cyrus SASL(サイラス・サスル) 関連のツールも導入します。

AlmaLinux / Rocky Linux / RHEL系

# Postfixと認証ツールをインストール
dnf install postfix cyrus-sasl cyrus-sasl-plain

Ubuntu / Debian系

# インストール時に設定画面が出たら「Internet Site」を選び、ドメイン名を入力してください
apt update
apt install postfix libsasl2-modules sasl2-bin

インストール確認

# バージョン確認
postconf mail_version
# -> mail_version = 3.5.8 などと表示されればOK

2. main.cf の基本設定(身元の確立)

Postfixの設定ファイルは主に2つあります。

  • /etc/postfix/main.cf: 基本的な動作設定(ドメイン名やセキュリティポリシーなど)
  • /etc/postfix/master.cf: 各プロセスの動作設定(ポート開放など)

まずはメインとなる main.cf を編集します。
※編集前には必ずバックアップを取りましょう!

cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
vi /etc/postfix/main.cf

① ホスト名とドメイン定義

75行目あたりから、以下の項目を探して変更します。
前提: ホスト名 mail.example.com / ドメイン example.com

# ホスト名(FQDN)
myhostname = mail.example.com

# ドメイン名
mydomain = example.com

# メール送信時に @ 以降をどうするか(user@example.com にする)
myorigin = $mydomain

# 全てのネットワークインターフェースで待ち受ける(必須!)
# デフォルトの localhost だと外部からメールが届きません
inet_interfaces = all

# IPv4のみ使う場合(IPv6トラブル回避のため推奨)
inet_protocols = ipv4

② メールボックス形式の変更(Maildir)

Linuxのメール保存形式には、古い「mbox(1つの巨大ファイル)」と、新しい「Maildir(1メール1ファイル)」があります。
後のDovecot(受信)での管理が楽になるため、Maildir形式を採用します。

main.cf の末尾付近、または home_mailbox で検索して変更します。

# ユーザーのホームディレクトリ配下の Maildir/ に保存する
# 末尾のスラッシュを忘れずに!
home_mailbox = Maildir/

3. 不正中継防止設定(セキュリティの要)

ここが最も重要な設定です。
「誰からのメールなら転送(リレー)を許可するか」を定義します。
設定を間違えると、スパム業者があなたのサーバーを経由してウイルスメールをばら撒きます。

mynetworks の設定

「無条件で信用するネットワーク」を指定します。
ここでは「自分自身(ローカルホスト)」のみを指定します。

# 127.0.0.0/8 のみを許可
mynetworks = 127.0.0.0/8

mydestination の設定

「自分のサーバーが最終目的地(受信すべき)となる宛先」を指定します。

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

4. セキュリティ強化1:SMTP-Auth(パスワード認証)

先ほどの mynetworks 設定だけでは、外部(あなたのスマホや自宅PC)からメールを送ろうとしても「お前は部外者だ」と拒否されてしまいます。
そこで、「IDとパスワードを知っているユーザーなら送信を許可する」という仕組み、SMTP-Auth を導入します。

main.cf の末尾に、以下のブロックを追記してください。

# --- SMTP-Auth Settings ---
# SASL認証を有効化
smtpd_sasl_auth_enable = yes

# 認証ソフトウェアの種類(Cyrus SASL)
smtpd_sasl_type = cyrus

# ソケットの場所(RHEL系の場合は smtpd だけで通ることが多い)
smtpd_sasl_path = smtpd

# 匿名ログインを禁止(noplaintextを入れると平文パスワード禁止だが、TLSと併用するためnoanonymousのみ)
smtpd_sasl_security_options = noanonymous

# 古いOutlook対策(ログイン方法の互換性)
broken_sasl_auth_clients = yes

# 【最重要】受信/転送の許可ルール
smtpd_recipient_restrictions = 
    permit_mynetworks, 
    permit_sasl_authenticated, 
    reject_unauth_destination

解説:smtpd_recipient_restrictions の意味
上から順に評価されます。
1. permit_mynetworks: サーバー内部からの送信ならOK。
2. permit_sasl_authenticated: パスワード認証に成功したらOK。
3. reject_unauth_destination: それ以外で、宛先がこのサーバー管理下でない場合は拒否(=スパムの踏み台拒否)。

5. セキュリティ強化2:TLS暗号化(盗聴防止)

パスワード認証を入れても、通信が平文(HTTPのような状態)だと、パスワードがネット上で盗み見られてしまいます。
第1回で取得したSSL証明書を使って、通信を暗号化(STARTTLS)します。

引き続き main.cf の末尾に追記します。

# --- TLS Settings ---
# TLSを有効化(may = 相手が対応していれば暗号化する)
smtpd_tls_security_level = may

# 証明書ファイルのパス(第1回で取得したパスを指定)
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem

# ログレベル(運用時は0か1推奨)
smtpd_tls_loglevel = 1

# セッションキャッシュ(高速化)
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

6. セキュリティ強化3:Submissionポート(587)の開放

家庭用プロバイダや会社のネットワークからは、通常「25番ポート」への接続がブロックされています(OP25B対策)。
そのため、メールソフト(MUA)からの送信専用の入り口である「587番ポート(Submissionポート)」を開放します。

ここで編集するのは main.cf ではなく、/etc/postfix/master.cf です。

vi /etc/postfix/master.cf

15行目付近にある submission の行を見つけてください。行頭の # を外して有効化します。
※インデント(行頭のスペース)は設定の一部なので、絶対に削除しないでください!

# Before (コメントアウトされている)
#submission inet n       -       n       -       -       smtpd
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
#  -o smtpd_sasl_auth_enable=yes

# After (有効化)
submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
# 587番ではTLSを強制する(encrypt)
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
# 以下、必要に応じてコメントアウトを外す(MUA補正機能など)
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

7. SASL認証サービスの起動

Postfixの設定は完了しましたが、認証を担当する saslauthd を起動しないとログインできません。

RHEL / AlmaLinux の場合

# サービス起動と自動起動設定
systemctl enable --now saslauthd

# 動作テスト(ユーザー作成後に実施)
testsaslauthd -u ユーザー名 -p パスワード

Ubuntu / Debian の場合

設定ファイル /etc/default/saslauthd を編集し、START=yes に変更する必要があります。

vi /etc/default/saslauthd
# START=yes に変更

systemctl start saslauthd

8. ユーザー作成と起動テスト

実際にメールを使うユーザー(Linuxユーザー)を作成し、Postfixを起動します。

ユーザー作成

# ユーザー kou-kun を作成(ログインシェルなし)
useradd -s /sbin/nologin kou-kun

# パスワード設定
passwd kou-kun
# -> ここで設定したパスワードがメールパスワードになります

Postfixの起動とFirewall開放

# 設定ファイルの構文チェック
postfix check

# 起動
systemctl enable --now postfix

# Firewall設定(25, 587, 465番を開放)
# AlmaLinux
firewall-cmd --add-service=smtp --permanent
firewall-cmd --add-service=smtp-submission --permanent
firewall-cmd --add-service=smtps --permanent
firewall-cmd --reload

# Ubuntu
ufw allow 25/tcp
ufw allow 587/tcp
ufw allow 465/tcp

第2回まとめ:世界へ送る準備は整った

お疲れ様でした!
設定ファイルとの格闘、大変でしたね。でもこれで、あなたのサーバーは:

  • 不正中継を拒否し、
  • ID/PASS認証で正規ユーザーのみを通し、
  • TLS暗号化で盗聴を防ぎ、
  • 587番ポートでどこからでも送信できる

という、プロバイダ顔負けの送信サーバーになりました。

コウ君

main.cf の設定、緊張しました…。
でも、「なぜその設定が必要なのか」が分かると面白いですね!
これでメール送信はできるようになったけど、まだ受信ができないんですよね?

リナックス先生

その通り。
今のままだと、届いたメールはサーバーの中に溜まる一方で、スマホから読むことができないの。
次回は、受信サーバーソフト「Dovecot」を構築して、iPhoneやOutlookからメールを読めるようにするわよ。
ここを乗り越えれば、ついに送受信の開通よ!

▼Postfix運用に最適な安定VPS

メールサーバーは24時間止まってはいけません。安定した稼働率と、万が一の時のスナップショット機能を備えた、Linux工房おすすめのVPSはこちらです。

【2026年最新】Linuxサーバー構築におすすめのVPS比較3選!現役エンジニアが速度とコスパで厳選
Linuxの勉強、まだ「自分のPC」でやって消耗していませんか?「Linuxを覚えたいけど、環境構築でエラーが出て先に進めない…」「VirtualBoxを入れたらパソコンが重くなった…」これは、Linux学習を始める9割の人がぶつかる壁です...

コメント