送信専用のメールサーバとしてSendmailを構築する
はじめに
今のご時世、Sendmailを利用している環境は中々ないのですが、
業務上で初めて触ったので、色々とメモします。
postfixほど情報は整理されておらず、少し苦労しました。。。
環境情報
- OS
CentOS7
前提
- selinuxは無効
- firewallは設定済み
- 送信専用メールサーバとして利用
- 送信はTCP/25番ポートを利用
- SMTP-AUTHは未使用
- 他のサーバからメールリレー出来るサーバとして運用する
手順
1.関連パッケージインストール
- sendmail関連パッケージをインストール
# yum install sendmail sendmail-cf
2.設定ファイル編集
- 設定ファイルバックアップ
# cd /etc/mail/
# cp -ip sendmail.mc sendmail.mc.YYYYMMDD
# cp -ip sendmail.cf sendmail.cf.YYYYMMDD
- 設定ファイル編集
# vi sendmail.mc
以下、編集箇所です。
define(`confSMTP_LOGIN_MSG', `$j unknown; $b')dnl
define(`confLOG_LEVEL', `9')dnl
define(`confAUTH_OPTIONS', `A')dnl
dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
MASQUERADE_AS(`test.example.jp')dnl
FEATURE(masquerade_envelope)dnl
FEATURE(masquerade_entire_domain)dnl
MASQUERADE_DOMAIN(localhost)dnl
MASQUERADE_DOMAIN(localhost.localdomain)dnl
MASQUERADE_DOMAIN(hoge.example.jp)dnl ★この行は追加
define(`confDOMAIN_NAME', `test.example.jp')dnl ★この行は追加
★下記記述を末尾に追加
define(`confRECEIVED_HEADER',`$?sfrom $s $.$?_($?s$|from $.$_)
$.$?{auth_type}(authenticated$?{auth_ssf} bits=${auth_ssf}$.)
$.by $j (unknown)$?r with $r$. id $i$?{tls_version}
(version=${tls_version} cipher=${cipher} bits=${cipher_bits} verify=${verify})$.$?u
for $u; $|;
$.$b')dnl
それぞれの記述に関する簡単な説明です。
define(`confSMTP_LOGIN_MSG', `$j unknown; $b')dnl
→telnet等でsendmailにアクセスする際、バージョン情報を隠す
define(`confLOG_LEVEL', `9')dnl
→ログレベルの設定です。
デフォルトは9となり、syslogで言うとinfoレベルの出力のようです。
メール送信元アドレス、宛先アドレス、配送ステータス等、
通常の運用であればこの設定で問題ないかと思います。
※postfixのデフォルトのログ出力レベルと変わりません。
define(`confAUTH_OPTIONS', `A')dnl
→認証に関する設定です。
デフォルトは「A」の後に「p」も記載されていますが、
「p」はSMTP認証を必須とするオプションとなるため、削除します。
dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
→「dnl」はコメントアウトの意です。「#」ではコメントアウトにはならないので注意してください。
「delete through newline」の略らしいです。
デフォルトだとローカルのみリレーする設定となっているため、
「dnl」を行頭につけることで、この設定を無効化します。
MASQUERADE_AS(`test.example.jp')dnl
FEATURE(masquerade_envelope)dnl
FEATURE(masquerade_entire_domain)dnl
MASQUERADE_DOMAIN(localhost)dnl
MASQUERADE_DOMAIN(localhost.localdomain)dnl
MASQUERADE_DOMAIN(hoge.example.jp)dnl
→送信元のアドレス(From,エンベロープ)を書き換える設定となります。
この設定の例であれば、「hoge.example.jp」、「localhost」、「localhost.localdomain」が
送信元のアドレスに含まれていた場合、「test.example.jp」に変換して送信します。
define(`confDOMAIN_NAME', `test.example.jp')dnl
→ローカル配送をする際のメールホスト名を「test.example.jp」に設定します。
define(`confRECEIVED_HEADER',`$?sfrom $s $.$?_($?s$|from $.$_)
$.$?{auth_type}(authenticated$?{auth_ssf} bits=${auth_ssf}$.)
$.by $j (unknown)$?r with $r$. id $i$?{tls_version}
(version=${tls_version} cipher=${cipher} bits=${cipher_bits} verify=${verify})$.$?u
for $u; $|;
$.$b')dnl
→この記述がない場合、Recievedヘッダーに、sendmailのバージョン情報が含まれてしまうため、
「unknown」の記述を入れることによって、バージョン情報を隠すことが出来ます。
3.設定ファイルの変換
m4 sendmail.mc > sendmail.cf
4.リレー許可ネットワークの追加
# cp -ip access access_YYYYMMDD
# vi access
末尾にリレーを許可するNWを追記
デフォルトではローカル以外のリレーを許可していないため、
172.31.0.0/16、192.168.0.0/24を許可する場合は、以下のように追記します。
Connect:172.31 RELAY
Connect:192.168.0 RELAY
5.リレー許可設定ファイルをdbファイルに変換
# makemap.sendmail hash access.db < access
6.デフォルトで利用するMTAの確認
# alternatives --config mta
「sendmail.postfix」が選択されている場合は、「sendmail.sendmail」を選択します。
※下は既に「sendmail.sendmail」が選択されている出力例になります。
2 プログラムがあり 'mta' を提供します。
選択 コマンド
-----------------------------------------------
1 /usr/sbin/sendmail.postfix
*+ 2 /usr/sbin/sendmail.sendmail
Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:
7.hostsファイル編集
利用するサーバで名前解決が出来ないと、起動に時間がかなりかかります。
それを回避するために、hostsファイルを編集し、以下のように記載します。
# vi /etc/hosts
=============================================
(IPアドレス) (ホスト名) (ホスト名).localdomain
=============================================
8.postfix停止
postfixが起動している場合は、停止します。
# systemctl disable postfix
# systemctl stop postfix
9.sendmail起動
# systemctl enable sendmail
# systemctl start sendmail
10.メールテスト
以下のコマンドを送信し、宛先アドレスでメールが受信できることを確認します。
$ echo "TESTMAIL" |sendmail -t 宛先アドレス
おわりに
postfixに慣れているとコンフィグが読みづらいですね。。。
(「dnl」でコメントアウトの役割とか、具体的な定義内容がdefineの後に続いていたり、パラメータの書き始めが「`」と終わりが「'」と微妙に違うなど)
Discussion