地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Linux】自宅サーバからgmailへメールを送信する

メール送信

LPIC取得時にさらっと構築したメールサーバ。

送信テストはローカルでしかやってなく特に困ることもなかったけど外部に送信する場合はどうやるんだろうって思って色々調べた。

環境

送信 OS : CentOS 7.7 メールサーバ : Postfix

手順

① 何はともあれサービスの起動

このタイミングでカーネル側でipv6を無効にしてるのにhostsに書かれてるぞと行ったwarningが出ていることに気づく(この辺はplaybookへフィードバック)

# ログ
$ less /var/log/mailog
Mar  5 06:27:46 choco01 postfix/master[1688]: warning: /usr/libexec/postfix/pickup: bad command startup -- throttling
Mar  5 06:28:46 choco01 postfix/pickup[13870]: fatal: parameter inet_interfaces: no local interface found for ::1

# hostsを編集
$ vim /etc/hosts

# サービス起動
$ systemctl start postfix

② サービスあげたので早速メール送信!

自身のメール宛に以下のスクリプトを実行してみる

#!/bin/bash

set -eu

if [ $# -ne 1 ]; then
  echo "Invalid Argments" 1>&2
  exit 1
fi

FROM="aaa@hoge.hoge"
TO="${1}"
SUBJECT="Test"
BODY="Test Mail"

MAILER=$(cat << EOS
        To: ${TO}
        From: ${FROM}
        Subject: ${SUBJECT}

        ${BODY}
EOS
)

echo "$MAILER" | sendmail ${TO} -i -t

ログを確認 -> 送信失敗してる

Mar  5 07:07:31 choco01 postfix/smtp[16189]: connect to alt1.gmail-smtp-in.l.google.com[108.177.8.26]:25: Connection timed out
Mar  5 07:07:46 choco01 postfix/smtp[16189]: connect to alt2.gmail-smtp-in.l.google.com[74.125.129.26]:25: Connection timed out
Mar  5 07:08:01 choco01 postfix/smtp[16189]: connect to alt3.gmail-smtp-in.l.google.com[172.253.112.26]:25: Connection timed out
Mar  5 07:08:16 choco01 postfix/smtp[16189]: connect to alt4.gmail-smtp-in.l.google.com[173.194.77.26]:25: Connection timed out

googlesmtp:25へ疎通できてないみたい。

telnet smtp.gmail.com 25
Trying 108.177.97.108...
telnet: connect to address 108.177.97.108: Connection timed out

ググった結果。

support.google.com

ポート 25、ポート 465、ポート 587 のいずれかを指すように社内導入型のメールサーバーを設定します。

25は空いてそうな感じの文言が、この場合はOS側の問題かと思ったけどfirewallもサービスごと切ってるのでよくわからない。

ルータで閉じてそうなポートもみてみたけど特にそのような設定は見当たらなかった。

で、色々調べてたらたどり着いたのが下記。OP25Bっていうらしい。迷惑メール送信防止策として取ってる仕組みらしい。

www.ntt.com

具体的には、動的IPアドレスを保持するユーザがメールを送信する際に、OCNのメールサーバーを経由せず、 自サーバーなどから直接メールを送信した場合、迷惑メール送信規制技術の一つである「OP25B」を用いて送信を規制します。

動的IPアドレスかつOCNのサーバを経由しないメール送信はプロパイダでで防いでるとのこと。なるほど。(static IPを取得すれば解決するけど。。。)

理由はわかったので次。上の記事的には25以外は使えそうなのでgoogleの587ポートを使ってみるとtelnetは成功した。

postfixのconfを書き換える

設定ファイルは/etc/postfix/main.cf

今回は上記まででわかったリレーホストのport指定とTLS、SASLの設定を追加。(追加の理由としてはリレー先メールサーバにSMTP Auth(SMTP認証)が必要なため)

セキュリティ(暗号化)方式としてTLS/STARTTLSが使えない場合は、port 465を使用する必要があるらしい。

ちなみにほとんどのプロバイダは、このポートを25番ポートの代替として587推奨しているとのこと。

$ vim /etc/postfix/main.cf

relayhost = [smtp.gmail.com]:587

#sasl setting
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain

#tls setting
smtp_use_tls = yes

書き換えたらサービスの再起動をして設定を反映させてみる。

$ systemctl restart postfix

qiita.com

googleで安全性の低いアプリを許可しないと、送信することが出来ないようです。 https://myaccount.google.com/lesssecureapps

google側でも設定が必要らしい。上記の設定が必要。

Google のセキュリティ標準を満たしていない場合、Google では、そのアプリやサイトからアカウントにログインしようとしたユーザーをブロックすることがあるらしい。

セキュリティ標準に関しては概要レベルでしか読んでないけどこれ満たすのは大変そうなのでとりあえず↑の設定をオンにして回避w

④ 送信してみる

上記のスクリプトを使ってメールを送信してみた。結果うまく届いた。(よかった!!)

うまくいかない場合は下記を試すのもいいらしいけどうまく行ったので言及はしない

$ yum install cyrus-sasl-plain

まとめ

昔の記事を読んでるとメールの送信側については特に無設定で簡単に送信出来た時代があったんだなって思うとそりゃ迷惑メールも増えるわって思った。

固定IPさえ取ってしまえば現代でも簡単に送れてしまうことには変わりないけど。。。

おまけ

固定IPじゃなくても送信元偽装メールは遅れるのか。

SMTPの通信に置いて送信側のプログラムはアドレスに記載されているホストとサーバが属しているホストが一致しているか検証することが出来ない。

またSMTPプロトコル上の送信者とデータ部のFromの送信者も一致している必要はない。これを使って迷惑メールを送っている。

ここで出てくるのがさっきのOP25Bの話でこいつがいる以上はどうしても送信元を偽ることは厳しくなる。

つまりは外部へのメール送信は全てリレーサーバが送信元となってしまう。上のスクリプトだとFromが無視されてしまう。なるほどって感じでした。