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_mynetworks | main.cf内で設定しているmynetworks内からの接続は許可します。(ここで設定した127.0.0.1や192.168.0.1からの接続は許可する事になります。) |
reject_invalid_hostname | EHLO ホスト名の文法が不正な場合に、要求を拒否します。 |
reject_non_fqdn_hostname | EHLO ホスト名の文法が RFC で要求されているような完全修飾ドメイン形式ではない場合に、要求を拒否します。 |
reject_unknown_hostname | EHLO ホスト名の文法が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_domain | MAIL 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_authenticated | SASL認証(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_access | RCPT 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の構築を行います。