メールリレーサーバの構築[さくらのクラウド/CentOS7]

GMOの特定のNWが Gmail/Gsuite に嫌われているらしく、メール配送に苦慮している方がいるようなので、さくらのクラウドにメールリレーサーバを構築する手順を作成しました。一時的な逃げ道になればいいかと思います。

既存のメールサーバがSPFに対応していることが前提で、DKIM、DMARCに対応していても問題は起きないはずです。さくらのVPSでも同様に構築できるかと思います。さくらのVPSで構築する場合は広告から申し込んで頂けると幸いです。

1. メールリレーサーバのセットアップ

#-- まずは さくらのクラウドで CentOS7 でサーバを作成
#-- ホスト名は、relay.example.com とする

#-- 既存の送信用メールサーバから送信される Envelope From のドメインを変数に設定(例では2つ)
DOMAINS="xxx.example.com yyy.example.com"

#-- 既存の送信用メールサーバのIPアドレスを変数に設定(例では2サーバ)
IPS="xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy"

#-- tool のインストールとパッケージを更新
yum install -y bind-utils
yum update -y

#-- IPADDRESS の取得
source /etc/sysconfig/network-scripts/ifcfg-eth0

#-- postfix の設定

#-- From に指定できるドメインを設定
for x in ${DOMAINS}
do
  echo "${x} OK" >> /etc/postfix/access
done
postmap /etc/postfix/access

POSTCONF="postconf -c /etc/postfix -e"
${POSTCONF} inet_interfaces=${IPADDR}
${POSTCONF} smtpd_helo_restrictions="reject_invalid_hostname reject_non_fqdn_hostname reject_unknown_hostname"
${POSTCONF} smtpd_sender_restrictions="reject_non_fqdn_sender reject_unknown_sender_domain"
${POSTCONF} inet_protocols=ipv4
${POSTCONF} smtpd_helo_required=yes
${POSTCONF} message_size_limit=52428800
${POSTCONF} disable_vrfy_command=yes
${POSTCONF} smtpd_discard_ehlo_keywords=dsn,enhancedstatuscodes,etrn
${POSTCONF} smtpd_sender_restrictions="check_sender_access hash:/etc/postfix/access, reject"
${POSTCONF} smtp_tls_loglevel=1
${POSTCONF} smtp_tls_security_level=may
${POSTCONF} smtp_use_tls=yes
${POSTCONF} smtp_tls_CAfile=/etc/pki/tls/certs/ca-bundle.crt
${POSTCONF} tls_random_source=dev:/dev/urandom

MYNETWORKS="127.0.0.1,${IPADDR}"
for x in ${IPS}
do
  MYNETWORKS="${MYNETWORKS},${x}"
done
MYNETWORKS=$(echo ${MYNETWORKS} | sed 's/,$//')
${POSTCONF} mynetworks=${MYNETWORKS}

#-- firewalld で既存のメールサーバからのアクセスを許可
for x in ${IPS}
do
  firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='${x}/32' accept"
done

#-- postfix, firewalld の設定変更も兼ねてOSを再起動
shutdown -r now

2. DNS登録 (事前にSPFのTTLは短くしておくこと)

#-- relay.example.com の 正引き(Aレコード)をDNSに登録する
#-- 作成したリレーサーバのIPアドレスの逆引き(PTRレコード) に relay.example.com. を登録する
#-- xxx.example.com と yyy.example.com の SPFを記述したTXTレコードに作成したリレーサーバのIPアドレスを追加する

3. DNSの登録確認

#-- python3.4 インストール
yum install -y python34 python34-pip
pip3.4 install py3dns pyspf

#-- SPF登録確認ツールの作成
cat <<-'_EOL_'> check_spf.py
#!/usr/bin/python3.4
import sys,spf
print(spf.check(i=sys.argv[1],s=sys.argv[2],h="localhost")[0])
_EOL_
chmod 755 check_spf.py

#-- 確認コマンド実行
source /etc/sysconfig/network-scripts/ifcfg-eth0

#-- From アドレスに使用する自メールドメインを変数に設定
DOMAINS="xxx.example.com yyy.example.com"

while :
do
  FLAG=0
  if [ $(dig $(hostname). a +short | grep -c "^${IPADDR}$") -eq 0 ]
  then
    echo "$(hostname) の A レコードが ${IPADDR} と一致していません"
    FLAG=$(($FLAG + 1))
  fi

  if [ $(dig -x ${IPADDR} +short | grep -c "^$(hostname).$") -eq 0 ]
  then
    echo "${IPADDR} の PTR レコードが $(hostname) と一致していません"
    FLAG=$(($FLAG + 1))
  fi

  for x in ${DOMAINS}
  do
    if [ $(./check_spf.py ${IPADDR} ${x}) != "pass" ]
    then
      echo "${IPADDR} が ${x} の SPF レコードに登録されていません"
      FLAG=$(($FLAG + 1))
    fi
  done

  if [ ${FLAG} -eq 0 ]
  then
    break
  fi

  sleep 30

done
#-- 上記スクリプトが終了したら、確認完了

4. 既存のメールサーバのメール配送先を構築したリレーサーバに変更する

#-- postfix であれば relayhost に構築したメールサーバの relay.example.com を設定
#-- sendmail であれば SmartRealy に構築したメールサーバの relay.example.com を設定

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)