目的
VPC+ELB+EC2という定番アイテムでセキュアなSMTP中継サーバ(リレーサーバ)を構築する
構成を決定した理由
・Webからの自動送信に関する迷惑メール対策にかける工数を減少させたい
・アプリケーション改修はあまりやりたくない
・SESは海外発のサービスで遅延もあり、設定もまだめんどくさい
・SESの青天井な料金体系が気に入らない、しかも自由度は少ない
・既にそれなりの規模のサービスに実装したいため、まだまだ成長途中のAWSの機能はできれば使いたくない
要するに、横着です。
構成詳細
- t2.micro〜t2.small程度のCentOSのEC2インスタンス2つ
- ELB
- VPC(デフォルトじゃないほうがやりやすいかも)
構成図
設置手順概要
1. VPC作成
特記することはありませんが、サブネット(プライベートIP)は後で使うのでメモしておきましょう。
2. インスタンス作成
Public向けElasticIPは、念のため方が便利です。
ただし必須ではありません。
セキュリティグループはTCP25とTCP80とSSH用の3つが空いていれば最低限十分です。
サブミッションを使うかもって場合のみTCP587などを開けましょう。
ちなみに、うちの案件ではTCP25とTCP80だけで十分でした。
また、TCP80はVPC内サブネット(プライベートIP)からのアクセスのみ許可でOKです。
これは後でも説明しますが、ELBからの生死(ヘルス)チェック用です。
25と587は想定している送信元サーバのPublicIPからのみ許可するようにしましょう。
設定次第では千客万来のスパム専用踏み台サーバになってしまいます。
3. yumでpostfixとnginxをインストール
特記事項無しです。
4.postfixを設定
詳細は省略します。
ざっくりとやることは以下の通りです。
- main.cfの「mydomain」「mydestination」を設定
- main.cfの「mynetworks」にVPCのPrivateIPのCIDRまたは生成したnetwork_tableを設定
- 起動してchkconfigをonにする
正直やることは少ないですが、1個でも矛盾や間違いがあると動きません。
あと、設定は環境ごとに大きく異なるので、これをコピペしたらどこでも動く!ってものはまずありません。
5.nginxを設定
nginxはELBからの生死(ヘルス)チェックのみに用いるものなので、仮想ホストの設定は不要です。
ElasticIPまたは自動割り当てIPでELBが80ポートにアクセスして200を返せる最低限の設定をします。
6.ELBを設定
これも詳細は省略します。
ざっくりとやることは以下の通りです。
- ELBを作る(必ずVPCの下に作る)
- SMTP送信用ポート(25や587)を必要に応じて通過ポートに指定する
- ヘルスチェックはTCP80へのリクエストにする
- セキュリティグループはEC2と同じものか、同じポートの空いた同じVPC内の別のものに設定する
- 【任意】ELBのAliasまたはCNAME宛のDNSを引く
- 中継サーバ用EC2を配置する
ざっくりとしてますが、この6つは割と重要です。
3つめをバカ正直に「TCP25」にしてしまうと、syslogをいじらない限り全てのリクエストがmaillogに吐き出されます。
最大の旨味であるmaillogが生死チェックで埋もれてしまっては悲しい限りですので、忘れてはいけません。
4つめを忘れると、せっかく後で設定してもアクセスできず泣きます。
5つめは省いても全く問題ありませんが、後でアホみたいに長いELBのCNAMEを送信元サーバのrelayhostに書くのは嫌なので、短いものをここで先に設定しておくと非常に便利です。
7.送信元サーバのMTAの設定
送信元サーバのMTA(うちはこっちもPostfix)の中継サーバをELBに設定します。
postfixでは「relayhost = <ELBのCNAMEまたは設定したドメイン>」を追記して再起動するだけでOKです。
手順はこんなところです。
困ったときは?
困ったときは以下の点に注意してみるとサクッといけます。
送信元からリレーサーバに接続できない(Timeout)になる
以下の点が疑われます。
- ELBのセキュリティグループでそのサーバからの接続を許可していない
- EC2のセキュリティグループでそのサーバからの接続を許可していない
- VPCのセキュリティグループ(ACL)でそのサーバからの接続を許可していない
「応答がなかなか返ってこないな・・・あ、死んだ」の場合は大体セキュリティグループを疑うのがAWSの定石ですよね。
中継サーバに「Relay access denied」というログが出て中継ができない
ほぼ間違いなく「4.Postfixの設定」の「mynetworks」がうまく設定できていません。
接続元IPがログに併記されているはずなので、それを書き込んで再起動した後に改めて中継ができるか確認して下さい。
それでも中継できない場合はmain.cfの他の記述が誤っていて、Postfixの送信設定自体できていない可能性があります。
中継されたメールがどうしても迷惑メールに入ってしまう
必要に応じて中継サーバの迷惑メール対策をしてください。
送信元サーバやELBについての対策は特に必要ありません。
Tips
Q.中継・送信元の各サーバを同じドメインで運用したらNDN(不達通知)メールが届かないよ!
仕様です。
どうしても見たいという方は、relay_domainsにそのドメインを設定し、transport.dbを生成して読み込んでください。
transport.dbの生成の仕方はググってください。
Q.VPC使えない時はどうするの?
なくても運用できないわけではありません。
クラシックの場合との一番大きな違いは、ELBにセキュリティグループが付くかどうかとプライベートIP縛りが使えるかどうかです。
前者はともかく、後者を使えば、インターネット越しの盗聴の可能性が大幅に減少します。
逆に後者が使えないとインターネットや広範囲のプライベートネットを経由するため、盗聴のリスクが大幅に上昇します。
従って、VPCの使えないクラシックオンリーの環境の場合は、素直にSESを使うほうがいいと思われます。