2016年1月14日木曜日

sendmailでリレーサーバを構築するメモ

AWSなどで、ロードバランサ配下に複数台のサーバを配置し負荷分散と冗長構成をとった場合、はて、メールの送信どうするんだ?と悩んだのでメモ。
AWSに限らず、CentOSなんかで、メール送信をリレーサーバ経由にしたい場合にも使えます。


ロードバランサ配下のサーバにそれぞれEIPというかグローバルIPを割り当ててもいいのですが、
オートスケールをした場合グローバルIPが不定だったりして、SPFどうするんだ?という問題があります。
じゃぁAWSのSESつかうか。という方法が一番いい気がするのですが、バウンスメール処理をちゃんとしないといけないなど、結構手間な感じです。
GmailやSendGridなどをつかうのもいいのですが、手っ取り早く解決するにはメールサーバ用EC2を立てて、そこを中継させてあげればよさそうです。
また、その場合各サーバにはEIPを割り当てなくてもいい(別途SSH接続用踏み台サーバがいりますが)ので、セキュリティ面でもよさそうです。



まずは、メールリレーサーバにするEC2を用意します。
AmazonLinuxでは、デフォルトでSendMailが起動しています。初期設定では自分自身から送信のみできる状態になっています。

まずは、sendmailの設定である、sendmail.cfを作成するためのツールをインストールします。

 yum -y install sendmail-cf m4
次に念のためsendmail.mc及びsendmail.cfのバックアップを取ったうえで、sendmail.mcの設定を以下のように修正します。

dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl


頭にdnlをつけてこの設定を無効化することにより、よそからのメール転送を許可するようになります。
しかし、このままですと、だれでもこのサーバを踏み台にメールを送れる要するにオープンリレーサーバ状態になりますので、リレーを受け付けるサーバを制限します。
なお、この設定はsendmail.mcに以下の記述がある前提になります。

FEATURE(`access_db',`hash -T<TMPF> -o /etc/mail/access.db')dnl

同じディレクトリ(/etc/mail/)にaccessというファイルがあります。(access.dbではありません)
これに

connect:10.0.0.100 RELAY

のように、リレーを許可するサーバのIPを列挙します。
調べた感じ、10.0.0.0/24のような指定はできないようですが、

connect:10.0.0. RELAY

のような指定はできるようです。

さて、ご存知の通り、sendmailはPostfixなどと違い、設定ファイルをコンパイル(?)しないといけません。

以下のコマンドを実行し、sendmail.cfファイルを作成します。

m4 /etc/mail/sendmail.mc > /etc/sendmail.cf
作成したら、sendmailを再起動させ、設定を有効化します。

/etc/rc.d/init.d/sendmail restart
では、実際にリレーメールサーバにメールを送信し、リレーされることを確認します。
自分はお手軽にrubyでメール送信プログラムを作成しました。


# -*- encoding: utf-8 -*-
require 'mail'
mail = Mail.new
options = { :address => "10.0.0.20", #リレーメールサーバのIP
            :port => 25,
            :authentication => :plain,
            :enable_starttls_auto => true }
mail.charset = "utf-8"
mail.from "test@example.com"
mail.to "hogehoge@gmail.com"
mail.subject "タイトル"
mail.body "本文"
mail.delivery_method(:smtp, options)
mail.deliver

これをリレーする元サーバ、つまりaccessファイルで許可したサーバ内で実行します。
DNSの設定やSPFの設定が正しければ、メールが届いているはずです。
ちゃんと中継されたかはメールのヘッダ情報にリレーメールサーバのIPが記録されているはずですので、そこで確認する事が出来ます。






0 件のコメント:

コメントを投稿