メール送信
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
telnet smtp.gmail.com 25 Trying 108.177.97.108... telnet: connect to address 108.177.97.108: Connection timed out
ググった結果。
ポート 25、ポート 465、ポート 587 のいずれかを指すように社内導入型のメールサーバーを設定します。
25は空いてそうな感じの文言が、この場合はOS側の問題かと思ったけどfirewallもサービスごと切ってるのでよくわからない。
ルータで閉じてそうなポートもみてみたけど特にそのような設定は見当たらなかった。
で、色々調べてたらたどり着いたのが下記。OP25Bっていうらしい。迷惑メール送信防止策として取ってる仕組みらしい。
具体的には、動的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
googleで安全性の低いアプリを許可しないと、送信することが出来ないようです。 https://myaccount.google.com/lesssecureapps
google側でも設定が必要らしい。上記の設定が必要。
Google のセキュリティ標準を満たしていない場合、Google では、そのアプリやサイトからアカウントにログインしようとしたユーザーをブロックすることがあるらしい。
セキュリティ標準に関しては概要レベルでしか読んでないけどこれ満たすのは大変そうなのでとりあえず↑の設定をオンにして回避w
④ 送信してみる
上記のスクリプトを使ってメールを送信してみた。結果うまく届いた。(よかった!!)
うまくいかない場合は下記を試すのもいいらしいけどうまく行ったので言及はしない
$ yum install cyrus-sasl-plain
まとめ
昔の記事を読んでるとメールの送信側については特に無設定で簡単に送信出来た時代があったんだなって思うとそりゃ迷惑メールも増えるわって思った。
固定IPさえ取ってしまえば現代でも簡単に送れてしまうことには変わりないけど。。。
おまけ
固定IPじゃなくても送信元偽装メールは遅れるのか。
SMTPの通信に置いて送信側のプログラムはアドレスに記載されているホストとサーバが属しているホストが一致しているか検証することが出来ない。
またSMTPのプロトコル上の送信者とデータ部のFromの送信者も一致している必要はない。これを使って迷惑メールを送っている。
ここで出てくるのがさっきのOP25Bの話でこいつがいる以上はどうしても送信元を偽ることは厳しくなる。
つまりは外部へのメール送信は全てリレーサーバが送信元となってしまう。上のスクリプトだとFromが無視されてしまう。なるほどって感じでした。