1.Postfixを使ってSMTPサーバの構築

  まずは基本的な設定だけ行ってメールの送受信ができるか確認します。
  初めから暗号化だのSMTP-Authだの設定すると、うまく動かなかった時に何が原因が分からなくなるのでね・・・

 設定ファイルがインストール時に有効になっている(デフォルトで有効になっている)けど変更せずそのまま使用するパラメータはここでは記載しません。変更点だけを記載していきます。



Postfix構築の前提条件
 ・Postfixを設定した同一サーバにDovecot(POPサーバ)を構築する際の設定となります。
 ・このページではメールの送受信ができる為の設定しかしないので暗号化等の設定は別ページで行います。

目次
 Postfixインストール
 main.cfの修正
  myhostname
  mydomain
  myorigin
  inet_interfaces
  inet_protocols
  mydestination
  mynetworks
  relay_domains
  home_mailbox
  smtpd_banner
  sample_directory

 SMTPクライアントコマンド時のアクセス制御
  smtpd_helo_required
  smtpd_helo_restrictions
  disable_vrfy_command
  smtpd_sender_restrictions
  smtpd_recipient_restrictions
  smtpd_client_restrictions

 Postfix起動
補足
  mail_spool_directory 

Postfixインストール

 Postfixをインストールしましょう。下記のコマンドだけで実行すれば /etc 配下に postfixというディレクトリが作成されます。

dnf -y install postfix

設定ファイルmain.cfの修正

 ではPostfixの設定ファイル/etc/postfix/main.cf ファイルを修正していきます。

myhostname   94行目~

このSMTPサーバのFQDNを指定します。
 main.cfのデフォルトでは全てコメントアウトされていますが、行を追加するなりコメントアウトを外してPostfixをインストールしたFQDNを設定します。

#myhostname = host.domain.tld
#myhostname = virtual.domain.tld
     ↓ ↓ ↓ ↓
#myhostname = host.domain.tld
myhostname = mail.caramelsauce.info

mydomain   102行目

このSMPTサーバのドメイン名を指定します。デフォルトでは1行だけでその1行もコメントアウトされています。
 main.cfのデフォルト設定(コメントアウトのままでも同様)では「myhostname」で設定した値から最初の「.」までを削除したものが設定されます。
 具体的に描くと、上記で「myhostname」を「mail.caramelsauce.info」と設定したので初めの「.」までを削除した値「caramelsauce.info」がデフォルトの値になります。
 が、明示的に指定しちゃいましょう。

#mydomain = domain.tld
     ↓ ↓ ↓ ↓
mydomain = caramelsauce.info

myorigin   117行目~

このSMTPサーバからメールを送信した場合のドメイン名を指定します。
 Postfixをインストールした端末からmailコマンドでfromのメールアドレスを指定しなかった場合にメールを送信した際のドメイン名になります。

main.cfのデフォルト設定は全てコメントアウトされていて設定していない場合のデフォルト値は「$myhostname」となっています。
 しかし送信者のメールアドレスを「@caramelsauce.info」としたいので$mydomainと設定されている行のコメントを削除します。

#myorigin = $myhostname
#myorigin = $mydomain
     ↓ ↓ ↓ ↓
#myorigin = $myhostname
myorigin = $mydomain

 「mailコマンドでfromのメールアドレスを指定しなかった場合」とは具体的にどういう事かというと、下記の様にPostfixをインストールした端末にログインしてmailコマンドを使って送信する場合、rootユーザが送ったことは分かるが@以降のドメインが分からない。


mail zzxxccvv1324@docomo.ne.jp
Subject: test
a
.
EOT

 理由はfrom(送信者)の設定をしていないから。こういう時に$myoriginパラメータが補完されて、受信したメールの送信者を見ると「root@caramelsauce.info」となっています。

 しかし、下記の様に送信者を指定してメールを送信すると$myoriginパラメータは補完されずにfromに設定したメールアドレスになります。


echo "メールの本文"| mail -s "タイトル" -r root@mail.caramelsauce.info zzxxccvv1324@docomo.ne.jp

inet_interfaces   132行目~

このSMTPサーバがメールを受信するインターフェイスを指定します。
 main.cfのデフォルトではlocalhostに指定している行がコメント解除され有効になっています。
が、外部からもcaramelsauce.info宛のメールを受信できるようにしたいので設定値をallに変えます。
という事でlobalhostと設定されている行は改めてコメントアウトしてallが設定されている行のコメントを外します。

#inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
inet_interfaces = localhost
     ↓ ↓ ↓ ↓
inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
#inet_interfaces = localhost

inet_protocols   135行目

Postfixが使用するインターネットプロトコルを指定します。
 main.cfのデフォルトでは「all」が設定されていますが、DNSの設定でcaramelsauce.infoドメインのIPv6の設定はしていないので明示的にIPv4だけを設定した方がいいかと思います。

inet_protocols = all
     ↓ ↓ ↓ ↓
inet_protocols = ipv4

mydestination   183行目~

このSMTPサーバが受信する(ローカルに配送する)ドメイン名を指定します。
  main.cfのデフォルトでは「$myhostname, localhost.$mydomain, localhost」となっています。
  このドメイン(このメールサーバ)を使ってメールの送受信をするのは管理者自身だけ。よってメールサーバを複数構築する予定もない。(mail2.caramelsauce.infoサーバの構築なんかをする予定が無い。)
 という事は「@caramelsauce.info」宛のメールについて受信できればよい。
 とはいえ、ホスト名を含んだメールを受け取らない様にしなければいけない理由も無いので、「$myhostname」は消さず、「$mydomain」が追加された設定を有効にします。

mydestination = $myhostname, localhost.$mydomain, localhost
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
#	mail.$mydomain, www.$mydomain, ftp.$mydomain
     ↓ ↓ ↓ ↓
#mydestination = $myhostname, localhost.$mydomain, localhost
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
#	mail.$mydomain, www.$mydomain, ftp.$mydomain

mynetworks   283行目~

このSMTPサーバがクライアントとして他ドメイン宛のメール送信を認証もせずに許可するネットワークの指定をします。

 main.cfのデフォルトでは全てコメントアウトされているので、1番上のコメントを外してひとまずローカルネットワーク内(家からのみ)メール送信できるようにします。
 家のPCからメール送信する際はメーラのSMTP設定としてこのSMTPサーバを指定するので、家のPC(ローカルネットワーク内)からは、認証せずにメール送信できるようにIPを追加します。

#mynetworks = 168.100.189.0/28, 127.0.0.0/8
#mynetworks = $config_directory/mynetworks
#mynetworks = hash:/etc/postfix/network_table
     ↓ ↓ ↓ ↓
mynetworks = 127.0.0.0/8, 192.168.0.0/24
#mynetworks = $config_directory/mynetworks
#mynetworks = hash:/etc/postfix/network_table

relay_domains   315行目

このSMTPサーバが許可して受け取ったメールの中継先を指定します。
 許可して受け取った外部からのメールのリレーする宛先を指定(制限)します。
 しかし、$mynetwork内からのメールや、SMTP-Authで許可したクライアントからのメールに関しては、relay_domainsの宛先ではなく受け取ったメールの宛先に対応するSMTPサーバにリレーします。

 という事は構築したこのSMTPサーバが受け取るメールは、
・他ドメインから自ドメイン宛(管理者宛へのメール)
 → 他ドメインから他ドメイン宛のメールをリレー許可する気はない。
・管理者が他ドメイン宛へ送るメール
 → $mynetwork内、もしくはSMTP-Authで転送許可したメール。
この2通りだけになります。
ということはこの設定いらないような気がする・・・
実際、この設定をコメントアウトのままにしても管理者が外部にメール送信できるし、外部から自ドメイン宛のメールを受信する事が出来ました。

が、
設定不備でどこにでも中継できるサーバになってしまっていては大変なのでコメントアウトを外して、設定値はデフォルトのままにします。

#relay_domains = $mydestination
     ↓ ↓ ↓ ↓
relay_domains = $mydestination

home_mailbox   437行目~

各ユーザが受信したメールの保存ディレクトリをホームディレクトリの相対パスで指定します。
 main.cfのデフォルトでは全てコメントアウトされているので2行目の「Maildir/」と設定されているコメントを外します。
 下記の設定をした場合、fedoraユーザが受信したメールは /home/fedora/Maildir 配下に受信メールが保存されます。

#home_mailbox = Mailbox
#home_mailbox = Maildir/
     ↓ ↓ ↓ ↓
#home_mailbox = Mailbox
home_mailbox = Maildir/

補足
mailbox形式
 各ユーザが受信したメールを1つのファイルにまとめて保存する形式です。
 具体的に「home_mailbox = Mailbox」と設定した場合、fedoraユーザのメールは /home/fedora/Mailboxというファイルになり、メール受信するたびに /home/fedora/Mailboxファイルが増加していきます。

maildir形式
 各ユーザが受信したメールを1メール1ファイルに保存していく形式です。
 具体的に「home_mailbox = Maildir/」と設定した場合、fedoraユーザのメールは /home/fedora/Maildir 配下にさらにディレクトリを作成しその配下に1メール1ファイルとして保存(受信したメールの数のファイルが作成)されます。
 Maildir配下のディレクトリは開封済みメール(cur)とか未開封メール(new)というようにディレクトリ分けされます。

更にmailbox形式にするかmaildir形式にするかは、設定値の最後が「/」かどうかで、/ で終わるとmaildir形式と認識されます。
もし、「home_mailbox = Maildir 」という設定をしたら、末尾に「/」がないので、mailbox形式の /home/fedora/Maildir というファイルがmailbox形式になります。
ちょっと説明が分かりづらかったですかね・・・(w

smtpd_banner   591行目~

SMTPサーバーのグリーティングバナーの220コードに続くテキストを指定します。
Postfixのバージョンだったりを表示させたりするとろくなことにならないので、コメントアウトを外して「unknown」とか「Service Ready」とかに変更します。

#smtpd_banner = $myhostname ESMTP $mail_name
#smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
     ↓ ↓ ↓ ↓
#smtpd_banner = $myhostname ESMTP $mail_name
smtpd_banner = $myhostname ESMTP Service Ready

sample_directory   694行目

サンプル構成ファイルの場所
Postfixに関するファイルのサンプルがある場所らしいが、デフォルトで記載されているパスを見てもそんなファイルは確認できない・・・
そしてそもそも「このパラメータはVer2.1で廃止された。」と記載があるのになぜかコメントアウトが外れて有効になっている。
もう意味が解らない・・・
という事でコメントアウトして無効にしちゃいましょう。

sample_directory = /usr/share/doc/postfix/samples
     ↓ ↓ ↓ ↓
#sample_directory = /usr/share/doc/postfix/samples

SMTPクライアントコマンド時のアクセス制御

セキュリティーを高める為に迷惑メールの受信やSMTPサーバの踏み台にならない為の設定

smtpd_helo_required   新規追加

HELO/EHLOコマンドの要求
HELO/EHLOコマンドは接続してくるホストを識別する為のコマンド。
SMTPサーバとしてメール受信する時に、メールを送信してくる相手側がホスト名を名乗ってこない接続は拒否させるようにする。
そうする事で不正な送信者を拒否する為にどこでもいいのでこのパラメータを「yes」で追加します。

smtpd_helo_required = yes

smtpd_helo_restrictions   新規追加

HELO/EHLOコマンド時の制限設定
smtpd_helo_requiredの設定でHELO/EHLOコマンドを必須にしておいて、その際に名乗ってきたホスト名によってフィルタリング(受信するか拒否するか)の設定を行います。

smtpd_helo_restrictions =
        permit_mynetworks
        reject_invalid_hostname
        reject_non_fqdn_hostname
        reject_unknown_hostname
オプション説明
permit_mynetworksmain.cf内で設定しているmynetworks内からの接続は許可します。(ここで設定した127.0.0.1や192.168.0.1からの接続は許可する事になります。)
reject_invalid_hostnameEHLO ホスト名の文法が不正な場合に、要求を拒否します。
reject_non_fqdn_hostnameEHLO ホスト名の文法が RFC で要求されているような完全修飾ドメイン形式ではない場合に、要求を拒否します。
reject_unknown_hostnameEHLO ホスト名の文法がDNS AまたはMXレコードがない場合に、 要求を拒否します。

disable_vrfy_command   新規追加

VRFYコマンドを無効にするか指定します。
メールアカウントが存在するか確認できるコマンドとなるのでこんなもんは無効にします。
どこでもよいのでこのパラメータを「yes」で追加します。

disable_vrfy_command = yes

smtpd_sender_restrictions   新規追加

MAIL FROMコマンド時の制限設定
上のオプションから順に評価され条件にマッチしたオプションによって制限決定します。
拒否要件に当てはまった場合は、MAIL FROMコマンドの段階で制御します。

smtpd_sender_restrictions =
	reject_unknown_sender_domain
	permit
オプション説明
reject_unknown_sender_domainMAIL FROMコマンド時の送信者メールアドレスのドメインが、DNSに「A」や「MX」レコードが無い場合に要求を拒否。
reject許可

このSMTPサーバを使ってメール送信するのは管理者本人しかいない為、MAIL FROMコマンドで制御する内容は最小限にとどめてあります。

smtpd_recipient_restrictions   新規追加

RCPT TOコマンド時の制限を設定
上のオプションから順に評価され条件にマッチしたオプションによって制限決定します。
拒否要件に当てはまった場合は、RCPT TOコマンドの段階で制御します。

smtpd_recipient_restrictions =
	permit_mynetworks
	permit_sasl_authenticated
	permit_auth_destination
	check_recipient_access hash:/etc/postfix/rcptto-discard_list
	reject

RCPT TOコマンドは他ドメインのSMTPサーバから自ドメイン(caramelsauce.info)宛のメールを受信したいので「permit_mynetworks」で自ドメイン宛のメールは許可。
のちにSMTP-Authで

オプション説明
permit_mynetworksアクセスしてきているクライアントのIPアドレスが$mynetworksにマッチする場合許可。
permit_sasl_authenticatedSASL認証(SMTP-Auth)が通れば許可。
permit_auth_destination転送する場合:RCPT TOの送信先アドレスが $relay_domains またはそのサブドメインにマッチし、送信者指定の ルーティング(user@elsewhere@domain)を含まない場合
最終配送先の場合:RCPT TOの送信先アドレスが $mydestination(いわゆるcaramelsauce.info宛のメールの場合)や $inet_interfaces、$proxy_interfaces、$virtual_alias_domains、$virtual_mailbox_domainsにマッチし、送信者指定のルーティング(user@elsewhere@domain)を含まない場合。
check_recipient_accessRCPT TOの送信先アドレスに対して、アドレス毎に対応したいアクションを記載してある別ファイルを参照します。
reject拒否

 check_recipient_access で使用する別ファイルの使用方法は別ページで今後記載します。
(この設定が無くてもメールの送受信はできるので「check_recipient_access」の設定をしない場合は、行を削除するなりコメントアウトしておいて下さい。)

smtpd_client_restrictions   新規追加

クライアントからSMTP接続の要求を受けた際のアクセス制限
クライアントが送信するSMTPコマンドを全体的にチェックする制御。

smtpd_client_restrictions =
	permit_mynetworks
	check_client_access cidr:/etc/postfix/client_list
	permit_sasl_authenticated
	permit
オプション説明
permit_mynetworksアクセスしてきているクライアントのIPアドレスが$mynetworksにマッチする場合許可。
check_client_access指定した別のデータベースファイルに記載したクライアントのIPやホスト名等によって制限を指定します。
permit_sasl_authenticatedクライアントがSMTP-Authで認証に成功した場合許可。
reject拒否


Postfix起動

 設定が終わったらPostfixを起動します。

systemctl start postfix

その他のパラメータ補足事項

mail_spool_directory   444行目~

各ユーザが受信したメールの保存ディレクトリをホームディレクトリ以外にする場合、絶対パスで指定します。また、「home_mailbox」パラメータを有効にしている場合、この「mail_spool_directory」を設定しても無効となり /home 配下に受信メールが保存されます。
 私はhome_mailboxで設定しているのでコメントアウトのままです
が、もし、/var/spool/mail 配下にmaildir形式で保存したい場合の変更方法は
「home_bailbox」のパラメータは全てコメントアウトしたうえで下記のように変更します。

#mail_spool_directory = /var/mail
#mail_spool_directory = /var/spool/mail
     ↓ ↓ ↓ ↓
#mail_spool_directory = /var/mail
mail_spool_directory = /var/spool/mail/


続けてDovecotの構築を行います。