📧

送信専用のメールサーバとしてSendmailを構築する

2024/04/24に公開

はじめに

今のご時世、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