Redhat系Linux CentOS には Logwatch というログ監視ツールが入っており、毎日の結果をCentOS内部の root ユーザにメールの形で送っています。
しかし、いちいちLinuxサーバにログインしてrootのメール見るは鬱陶しいということで、このroot宛てのサーバ内部からのメールをGmailに転送しようというのが今回の要件です。
送信元MTAにはデフォルトの sendmail を使うので、sendmail の設定が必要となります。この設定方法は sendmailからGmailへメールを転送する方法 : カブに乗ったプログラマとSendmailでGmailに転送 - みゃあの主記憶装置 が参考なりました。
以下ほぼコピペですが、一応メモしておきます。
GmailはSMTPにSubmission(ポート587)で、SMTP認証とTLSを使っているので設定が結構厄介です。
1.sendmail.mcでの設定
まず、sendmail.mc で、SMTP/SubmissionやSMTP Auth の設定をします。
# vi /etc/mail/sendmail.mc
===dnl define(`SMART_HOST’, `smtp.your.provider’)dnl の次行に下記入力===
define(`SMART_HOST', `smtp.gmail.com')dnl
define(`ESMTP_MAILER_ARGS', `TCP $h 587')
define(`RELAY_MAILER_ARGS', `TCP $h 587')
FEATURE(authinfo, DATABASE_MAP_TYPE` -o 'MAIL_SETTINGS_DIR`authinfo')
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')
===dnl # DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA’)dnlのコメント解除===
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
===dnl DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea’)dnlのコメントを解除===
DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea')dnl
===dnl FEATURE(masquerade_envelope)dnlの次の行に以下の内容を入力===
FEATURE(masquerade_envelope)dnl
FEATURE(genericstable, DATABASE_MAP_TYPE` -o 'MAIL_SETTINGS_DIR`genericstable')
GENERICS_DOMAIN_FILE(MAIL_SETTINGS_DIR`genericsdomain')
FEATURE(`generics_entire_domain')
sendmail.mcの設定が終わったら、sendmail.cfを作成します。
m4 /usr/share/sendmail-cf/m4/cf.m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
2.authinfo,genericstableの作成
SMTPの認証情報を格納するauthinfoファイルを作成します。
# vi /etc/mail/authinfo
AuthInfo:smtp.gmail.com "U:hoge" "I:hoge@gmail.com" "P:passwd"
authinfoファイルが作成できたらauthinfo.dbファイルを作成します。makemapコマンドでsendmail用のデータベースマップを作成できるわけですが、hash オプションにより生パスワードが見られるリスクは軽減できますね。設定が終わったら、/etc/mail/authinfo は削除した方が安全かもしれません。
makemap hash /etc/mail/authinfo.db < /etc/mail/authinfo
また、下記コマンドでgenericsdomainファイルを作成します。
echo localhost >> /etc/mail/genericsdomain
echo `hostname`>> /etc/mail/genericsdomain
さらに、下記コマンドを実行しgenericstableファイルを作成します。
echo root nasubi@gmail.com > /etc/mail/genericstable
makemap hash /etc/mail/genericstable.db < /etc/mail/genericstable
これでsendmail再起動します。
/etc/rc.d/init.d/sendmail reload
3.root宛のメール転送設定
下記コマンドでaliasesファイルを編集しroot宛てのメールをGmailに送るようにします。
# vi /etc/aliases
(最下行の root: を修正(デフォルトはコメント))
# Person who should get root's mail
#root: marc
(保存してからnewaliasesで反映します)
# newaliases
下記コマンドでテストメールを送信できます。Gmail側で受信しているか確認してみましょう。
echo test|mail root
しかし、実際テストしてみると届きません。
/var/log/maillog でメールのログを見てみると下記のようになっていました。
Mar 10 10:49:40 localhost sendmail[21224]: p2A1md2K021223: to=hoge@gmail.com, ctladdr=
(0/0), delay=00:01:01, xdelay=00:01:01, mailer=relay, pri=30559, relay=smtp.gmail.com [74.125.53.109], dsn=4.0.0, stat=Deferred: Connection timed out with smtp.gmail.com
タイムアウトしてるようです。
結局原因はファイアウォールの設定を見逃してたことでした。
ここで書いてるiptablesのスクリプトに下記を追加し、反映することでようやく無事にroot宛てメールが転送されるようになりました。
#################
#################
iptables -A OUTPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -s $myhost -d $any --dport 587 -j ACCEPT
iptables -A INPUT -p tcp -s $any --sport 587 -d $myhost -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -s $myhost -d $any --dport 8001 -j ACCEPT
iptables -A INPUT -p tcp -s $any --sport 8001 -d $myhost -j ACCEPT
補足:
SMTP認証はせず、サブミッションポート(ポート587)対応だけなら、「1.sendmail.mcでの設定」で以下の部分のみ設定すればいいようです。
# vi /etc/mail/sendmail.mc
===dnl define(`SMART_HOST’, `smtp.your.provider’)dnl の次行に下記入力===
define(`SMART_HOST', `smtp.gmail.com')dnl
define(`ESMTP_MAILER_ARGS', `TCP $h 587')
define(`RELAY_MAILER_ARGS', `TCP $h 587')
===dnl # DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA’)dnlのコメント解除===
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
===dnl DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea’)dnlのコメントを解除===
DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea')dnl
あとは、sendmail.cfを作成し、sendmailサービスを再起動するだけです。
補足2:
sendmail.mcからsendmail.cf作成時に以下のようなメッセージが出た場合、sendmail-cf がインストールされていない可能性があるので、RedHat系の場合、yumでインストールしてやります。
# m4 /usr/share/sendmail-cf/m4/cf.m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
m4: /usr/share/sendmail-cf/m4/cf.m4: No such file or directory
/etc/mail/sendmail.mc:10: m4: cannot open `/usr/share/sendmail-cf/m4/cf.m4': No such file or directory
↓ sendmail-cfをインストール