見出し画像

【Linux】 SMTPの設定

機器のVer

SMTPサーバ(Simple Mail Transfer Protocol)

電子メールをサーバが外部のSMTPサーバへ送信したり、外部のSMTPサーバより受信する機能を持ったサーバ。

今回のバージョンではデフォルトで設定されているPostfix で設定を行う。メール配送時にDNSサーバによる名前解決が必要になるため、『DNSサーバの構築(BIND)』が動作完了していること。

MTA(Mail Transfer Agent)
SMTPプロトコルを使って、電子メールをやり取りするためのサーバのこと。送信側のコンピュータからの電子メールを受信し、それを受信側のコンピュータに転送SMTPサーバとも呼ばれる。

MDA(Mail Delivery Agent)
MTAが受信した電子メールを、受信側のコンピュータに配送するためのプログラムのこと。MTAが受信した電子メールを、受信側のコンピュータのアカウントに保存する役割を果たす。

MUA(Mail User Agent)
電子メールを送受信するためのプログラムのこと。電子メールを送信するためにMTAに接続し、MTAが転送してきた電子メールを受信する役割も果たす。


SMTPの設定(postfix)

postfixのインストール

# yum -y install postfix


設定ファイルの編集

# vi /etc/postfix/main.cf

---------------------------------------------------------------
# ホスト名を設定する(ホスト名.ドメイン名)
myhostname = fedora.kajuhome.com

# ドメイン名を設定する
mydomain = kajuhome.com

# 送信者メールアドレスの@以降をドメイン名にする
myorigin = $mydomain

# Postfix が待ち受けるべき全てのネットワークインターフェースを指定
inet_interfaces = all

# Postfixが使用するプロトコルをIPv4に変更
inet_protocols = ipv4

# メールをローカルで受信するドメイン名を指定(ドメイン全体のメールサーバ)
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

# 信頼されたネットワークをCIDR (network/mask) 表記で指定(ローカルネットワーク)
mynetworks = 192.168.1.0/24, 127.0.0.0/8

# 中継を許可するドメインを指定
relay_domains = $mydestination

# 外部のSMTPサーバを経由してメールを送信するために使用するリレーサーバを指定
relayhost = [smtp.example.com]:587

# メールボックス(Maildir)を各ユーザのホームディレクトリに配置
home_mailbox = Maildir/

# これ以降は、最下位行に追加
# SMTPのVRFYコマンドを使用禁止
disable_vrfy_command = yes
# VRFYはアカウントが実在するか確認するコマンド。でたらめなユーザ問い合わせを行う悪質なプログラムにより
アカウント流出を防ぎます。

# メール送信時にアカウント名・パスワードをサーバに通知しメールサーバから認証を受ける(SASL認証)
smtpd_sasl_auth_enable = yes

# sasl認証に対応していないメーラは拒否
broken_sasl_auth_clients = yes

# クライアントに対しての認証設定
smtpd_sasl_security_options = noanonymous

# 認証に使用するサーバを指定
smtpd_sasl_local_domain = $mydomain
            または (*1)
smtpd_sasl_local_domain = $myhostname
# *1:メールアドレスの「@」以降の部分(当サイトであれば「kajuhome.com」に当たる)によって変更する。
# (SMTP認証に失敗する場合に切り替える。)

# ホストの接続に関する設定(SPAM拒否設定)
smtpd_client_restrictions = permit_mynetworks,
                            reject_rbl_client relays.ordb.org,
                            permit
smtpd_client_restrictions 属性の「relays.ordb.org」について
# RBLサイト"relays.ordb.org" は 2006年12月にサービスが停止した為、メールログ「/var/log/maillog」に以下の様な
# 「relays.ordb.org」接続エラーが多数でる。

Jan  4 03:54:34 fedora postfix/smtpd[24034]: warning: 164.68.9.218.relays.ordb.org: RBL lookup error:
 Host or domain name not found. Name service error for name=164.68.9.218.relays.ordb.org type=A:
 Host not found, try again

# RBLサイトを以下のように変更。
# ホストの接続に関しての設定
smtpd_client_restrictions = permit_mynetworks,
                            reject_rhsbl_client rhsbl.ahbl.org,
                            reject_rbl_client spamcop.net,
                            reject_rbl_client dynablock.wirehub.net,
                            reject_rbl_client sbl.spamhaus.org,
                            reject_unknown_client,
                            permit
 #    permit_mynetworks    :クライアントIPが $mynetworks に属していた場合は要求を許可する
 #    reject_rbl_client    :RBLサイトに登録されているブラックサイトを拒否
 #    reject_unknown_client:クライアントIPが DNS に PTR レコードを持たない場合等に要求を拒否

# メール中継の設定
smtpd_recipient_restrictions = permit_mynetworks,
                               permit_sasl_authenticated,
                               reject_unauth_destination
  #   permit_sasl_authenticated:SMTP_AUTHに認証されたクライアントを許可
  #   reject_unauth_destination:以下のアドレスにマッチするものは許可
                                   $inet_interfaces
                                   $mydestination
                                   $virtual_alias_domains
                                   $virtual_mailbox_domains
  #                              以下のドメイン・サブドメインは許可
                                   $relay_domains
  #                             上記以外は全て拒否

# MAIL FROM コマンドの送信者アドレスを制限
smtpd_sender_restrictions = reject_unknown_sender_domain
#     reject_unknown_sender_domain:送信者のメールアドレスが DNS の Aレコードや MXレコードを持たない場合は拒否

メールキューディレクトリのパスを指定するためのパラメータ
queue_directory = /var/spool/postfix


---------------------------------------------------------------


メールボックスの設定

新規ユーザを作成した場合、メールボックス(Maildir)を作成する
# mkdir /etc/skel/Maildir
# chmod 700 /etc/skel/Maildir


既存ユーザのメールボックス(Maildir)を作成する(例:linuxユーザの場合)
# mkdir /home/linux/Maildir
# chmod 700 /home/linux/Maildir
# chown linux:linux /home/linux/Maildir


ユーザのパスワードとSMTP-Authパスワードを別にする

# vi /usr/lib64/sasl2/smtpd.conf

---------------------------------------------------------------
pwcheck_method: auxprop
先頭に「#」を付けてコメント化
#mech_list: plain login
---------------------------------------------------------------

既存ユーザのSMTP-Auth(送信認証)パスワード設定する
# saslpasswd2 -u kajuhome.com -c linux
Password:
Again (for verification):

SMTP-Authユーザの確認
# sasldblistusers2
linux@kajuhome.com: userPassword

sasldb2のパーミッション・グループ変更
sasldb2の確認
# ll /etc/sasldb2
-rw-------  1 root root 12288  721 05:21 /etc/sasldb2

パーミッション変更、グループ変更
# chmod 640 /etc/sasldb2
# chgrp postfix /etc/sasldb2

sasldb2の確認
# ll /etc/sasldb2
-rw-r-----  1 root postfix 12288  721 05:21 /etc/sasldb2

以下が有効になっていれば実施する。

# systemctl stop sendmail.service
# systemctl disable sendmail.service
# systemctl status sendmail.service


デフォルトMTAの変更

# alternatives --config mta

2 プログラムがあり 'mta' を提供。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/sbin/sendmail.sendmail
   2           /usr/sbin/sendmail.postfix

上記一覧の「postfix」側の番号を入力
Enter を押して現在の選択 [+] を保持するか、選択番号を入力


postfix・SMTP-Authを自動的に起動

# systemctl enable postfix.service
# systemctl enable saslauthd.service
# systemctl status postfix.service
# systemctl status saslauthd.service
# systemctl start postfix.service
# systemctl start saslauthd.service


管理者へメールが送られた時、一般ユーザに転送

aliasファイルの変更
vi /etc/aliases

-----------------------------------------------
#
#  Aliases in this file will NOT be expanded in the header from
#  Mail, but WILL be visible over networks or from /bin/mail.
#
#       >>>>>>>>>>      The program "newaliases" must be run after
#       >> NOTE >>      this file is updated for any changes to
#       >>>>>>>>>>      show through to sendmail.
#

# Basic system aliases -- these MUST be present.
mailer-daemon:  postmaster
postmaster:     root

# General redirections for pseudo accounts.
bin:            root
daemon:         root
        :
        :
        :
# Person who should get root's mail
#root:          marc
root宛てをlinuxに変更
root:           linux
-----------------------------------------------

変更を反映
# newaliases


メールキュー

処理待ちのメールが一時的に保管される場所。キューは /var/spool/postfix ディレクトリまたは、sendmail では/var/spool/queue に保存

postqueue [OP]
 -p:メールキューを人間が読める形式で表示
 -i:メールキューのすべてのメッセージを表示
 -f:メールキューをフラッシュ
 -d <queue-id>:メールキューから特定のメッセージを削除
 -H <queue-id>:メールキューから特定のメッセージを保留状態に


SMTPの設定(sendmail)

sendmailのインストール

# yum install sendmail sendmail
# yum install sendmail sendmail-cf


/etc/mail/sendmail.mc設定

設定のメインとなるsendmail.cfファイルは、書式が難解なので比較的内容が分りやすい「sendmail.mc」ファイルと「m4」マクロを使用して「sendmail.cf」ファイルを作成する。

# vi /etc/mail/sendmail.mc

-----------------------------------------------

# メールサーバに設定する名前が「mail.server-memo.net」である場合
Dwmail
Dmserver-memo.net
define(`confDOMAIN_NAME',`$w.$m')dnl

# smtp接続許可設定 (先頭にdnlをつける)。他のネットワークからもsmtp接続を受け付ける。
dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
-----------------------------------------------

m4マクロを使用してsendmail.mcを実際にsendmailに読み込まれるsendmail.cfへ変換
# m4 sendmail.mc > sendmail.cf
コマンドを実行しても何も表示はされない


接続許可ネットワーク設定

/etc/mail/access 編集

# vi /etc/mail/access

-----------------------------------------------
# メール送信を許可するアドレスを追加
Connect:192.168.1                       RELAY
Connect:192.168.3.1                     RELAY
-----------------------------------------------

makemap.sendmail」コマンドを使用して「/etc/mail/access」ファイルから「/etc/mail/access.db」ファイルを作成
# makemap.sendmail hash access.db < access

access.dbに設定が反映されているかは、「strings」コマンドで確認
# strings access.db

※「makemap.sendmail」コマンドを使用して「access.db」を作成すると、「sendmail」を再起動させることなく 「access.db」の内容を即時反映させることが出来

/etc/mail/accessのオプション
OK:メールを受信する
RELAY:メールを受信・中継する
REJECT:メールを受信しない。エラーを出力する
DISCARD:メールを破棄する。エラーを出力しない


/etc/mail/local-host-names設定(受信メールアドレス設定)

「sendmail」がローカル配送(自サーバユーザへメール配送)するメールアドレスの設定を「/etc/mail/local-host-names」で行う。この設定が無いとメールを受信することが出来ない。

# vi /etc/mail/local-host-names

-----------------------------------------------
# 受信したいメールアドレスのユーザー名を除いた「@」以下を記述する
# 「xxx@server-memo.net」といったメールを受信させるには下記のように設定
server-memo.net
-----------------------------------------------


メールエイリアスの作成

/etc/aliasesはメールボックスエイリアスを設定

# vi /etc/aliases

-----------------------------------------------
# project@ に送られたメールはtakagi@、iida@、support@example.jpに送信される
project: takagi, iida, support@example.jp

# ファイル名を指定すればそのファイルに書き込みが行われる
# /dev/nullに書き込み 
project2: /dev/null

# パイプを通じて標準入力に書き込み
project3: "| /usr/local/bin/procmail"
-----------------------------------------------

newaliases


サーバ以外からのメール着信を許可

hosts.allowに全てのホストからのアクセスを許可する設定

# vi /etc/hosts.allow

-----------------------------------------------
# hosts.allow This file describes the names of the hosts which are
# allowed to use the local INET services, as decided
# by the '/usr/sbin/tcpd' server.
sendmail:ALL
-----------------------------------------------


MTAの切り替え

# alternatives --config mta

There are 2 programs which provide 'mta'.

  Selection    Command
-----------------------------------------------
 + 1           /usr/sbin/sendmail.postfix
*  2           /usr/sbin/sendmail.sendmail

Enter to keep the current selection[+], or type selection number: 2


postfix停止とsendmail起動

# systemctl stop postfix
# systemctl disable postfix
# systemctl status  postfix

# systemctl start sendmail
# systemctl enable sendmail
# systemctl status sendmail


メール送信のテスト

最終行に mailer local ... と出力されていれば成功。

> /parse jun@example.jp
Cracked address = $g
Parsing envelope recipient address
canonify input: jun @ rfs . jp
Canonify2 input: jun < @ rfs . jp >
Canonify2 returns: jun < @ rfs . jp . >
canonify returns: jun < @ rfs . jp . >
parse input: jun < @ rfs . jp . >
Parse0 input: jun < @ rfs . jp . >
Parse0 returns: jun < @ rfs . jp . >
ParseLocal input: jun < @ rfs . jp . >
ParseLocal returns: jun < @ rfs . jp . >
Parse1 input: jun < @ rfs . jp . >
Parse1 returns: $# local $: jun
parse returns: $# local $: jun
2 input: jun
2 returns: jun
EnvToL input: jun
EnvToL returns: jun
final input: jun
final returns: jun
mailer local, user jun

Ctrl + D で終了。


暗号化(postfix)

/etc/postfix/main.cfの設定

# vi /etc/postfix/main.cf

---------------------------------------------------------------
# ファイルの最後に
smtp_tls_security_level = may
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.testdom.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.testdom.com/privkey.pem
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_received_header = yes
smtpd_tls_loglevel = 1
---------------------------------------------------------------

smtp_tls_security_level:SMTPセッションでSSL/TLSを有効化する。mayは強制しない
smtpd_tls_cert_file:SSL/TLS通信で利用するサーバー証明書のパスを指定smtpd_tls_key_file:SSL/TLS通信で利用する秘密鍵のパスを指定smtpd_tls_session_cache_database:SSL/TLS通信用キャッシュデータベースの指定
smtpd_tls_session_cache_timeout:SSL/TLS通信のキャッシュ保持時間smtpd_tls_received_header:使用されているプロトコルおよび暗号に関する情報をReceivedヘッダーに追加
smtpd_tls_loglevel:SSL/TLS通信時のログ出力レベル


/etc/postfix/master.cfの設定

# vi /etc/postfix/master.cf

---------------------------------------------------------------
# #を外す 
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
---------------------------------------------------------------

mtpd_tls_wrappermode=yes: TLS (Transport Layer Security) ラッパーモードを有効にし、SMTPトラフィックを暗号化する。

smtpd_sasl_auth_enable=yes: SASL (Simple Authentication and Security Layer) 認証を有効にし、SMTPクライアントが認証された状態でSMTPサーバーと通信する。

smtpd_client_restrictions=permit_sasl_authenticated,reject: SMTPクライアントからの接続制限を設定し、SASL認証されたクライアントのみが接続を許可され、それ以外は拒否される。


postfixの再起動

# systemctl restart postfix.service
# systemctl  status postfix.service


POPとIMAPの設定


よろしければサポートお願いします!よりいい情報を発信します。