2015年12月31日木曜日

メール配信で送信元IPを変更しながら負荷分散をする

最近検証したネタの備忘録です。

メール配信での悩みはキャリアのブロッキングです。
複数IPを持ってタイムコントロールをしながら配信管理をする事で、
キャリアの閾値以内で収めて配信する必要があります。

これが想像以上に面倒で、しかもspam認定されると解除もとても面倒なので、
SendGrid等の安価でAPIが使えるメール配信サービスをお勧めしています。

今回はどうしても内製化しなければならず、どうにか出来ないか?という話があったので、
どうにか作れないもんかと試行錯誤してやってみました。

先日クーポンを頂いた「さくらのクラウド」で試してみます。
メールの大量配信についてはどのクラウドでも推奨事項ではないので、あくまでもテストという事で。
一応、約款を見てもspamじゃなければ問題無さそうだったのでテスト環境に採用しました。

さくらのクラウドの良いところは、とにかく柔軟に何でも作れるというところだと思います。
価格設定~コントロールパネルまで全てオリジナリティのある内容なので、
どこか独立系のイメージがあります。IDCFクラウド同様に尖がってるなぁというイメージです。

今回はIPが複数必要だったので/28で払い出されるRouterを帯域幅100Mで契約しました。
/28ですが使用出来るIPの数は11個です。
サーバはCentOS release 6.7 (Final)を1GB/1仮想コアを契約しました。

今回はpostfixを使用して、間にHAproxyを挟んで負荷分散させます。
問題は送信元IPを変更するところなのですが、こちらはpostmultiを使って解消しました。

手順は以下です。
1.サーバにIPを割り当てる
2.必要なミドルウェアをインストールする
3.postmultiでpostfixインスタンスを複数構成にする
4.リレーの設定をする

以下のような構成を作ります。
事前にDNS(mxやtxtレコード)は設定しておきます。



まずはサーバにIPを割り当てますが、今回はセカンダリIPで手っ取り早く済ませます。
-----------------------
# vi /etc/sysconfig/network-scripts/ifcfg-eth0:1
DEVICE=eth0:1
NETMASK=255.255.255.240
IPADDR=[使用範囲内のIPアドレス]
# ifup eth0:1
-----------------------
同様にeth0:2、eth0:3・・・と作成していきます。

次に今回使用するミドルウェアをインストールします。
postfixはデフォルトでインストールされているものを使用するので、
必要なのはhaproxyです。
(接続確認用にtelnetを入れておくと便利です。)
-----------------------
# yum install haproxy
# yum install telnet
-----------------------


HAProxyの設定をします。
-----------------------
#vi /etc/haproxy/haproxy.cfg
listen smtp
  bind 127.0.0.1:25
  mode tcp
  balance roundrobin
  server mail2 インスタンス2のIPアドレス:25 check
  server mail3 インスタンス3のIPアドレス:25 check
  server mail4 インスタンス4のIPアドレス:25 check
  server mail5 インスタンス5のIPアドレス:25 check

listen smtp2
  bind HAProxyに設定するIP:25
  mode tcp
  balance roundrobin
  server mail2 インスタンス2のIPアドレス:25 check
  server mail3 インスタンス3のIPアドレス:25 check
  server mail4 インスタンス4のIPアドレス:25 check
  server mail5 インスタンス5のIPアドレス:25 check
-----------------------


次にpostmultiを使用した環境に変更をします。
マスターのpostfixは止めておきます。
# /etc/init.d/postfix stop

メールの受付/キューイング用にインスタンスを1つ。
そして配信用に複数のインスタンスを作ります。

postmultiでの複数インスタンス作成(例はインスタンス名postfix-mail1)
-----------------------
postmultiの構成の初期化
# postmulti -e init

postmulti構成でのインスタンス作成
# postmulti -I postfix-mail1 -G postfix -e create

作成したインスタンスの有効化
# postmulti -i postfix-mail1 -e enable

インスタンスの起動/停止
# postmulti -i postfix-mail1 -p start
# postmulti -i postfix-mail1 -p stop
-----------------------

postmultiのインスタンスでinet_interfacesにIPを指定します。
これが配信元IPとなります。
mydestinationやrelayhostの設定を行います。
postmultiのキューイング用インスタンスのコンフィグ変更点
-----------------------
inet_interfaces = 設定するIPアドレス
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, メールのドメイン
relayhost = [127.0.0.1]:25
relayhost = [HAproxyの設定アドレス]:25
default_destination_concurrency_limit = 1
default_destination_recipient_limit = 1
master_service_disable =
allow_mail_to_commands = alias,forward,include
-----------------------
配信用インスタンスは上記からrelayhostの設定を外します。

これで前記の構成が完了しました。
複数アドレスを記載したaliasを用意して、そのアドレスに外部から送信すると、
配信元IPを変更して送信される事がわかるかと思います。

まだこの状態ではセキュリティの担保等の複数問題点が残っていますが、
配信元IPを変えて送信することができました。

ここまでやって思うのは、やはりメールサーバは外部サービスが便利ということ。
メールサーバの運用は色々と面倒が多いので、内製化が必要なケースでも、
なんとか外部サービスに委託する形にもっていった方が、全員が幸せになるんじゃないかなー。
と思う次第です。

それでは、良いクラウド構築を。

0 件のコメント:

コメントを投稿