OpenWRTからグローバルIPの変更を検知してメール送信(gmail)

この記事は約8分で読めます。

 昨年来、OpenWRTでwireguardのVPNを運用していますが、たまにプロバイダから割り当てられているグローバルIPが変わることがあります。そうするとVPNがつながらなくなるため、一定の時間でそれをチェックしてメール送信するようにしました。

msmtp導入手順(概要)

  • Googleアプリパスワードの作成
    Gmail送信のためのアプリパスワードを作成します。二段階認証の登録が必須です。
  • msmtpのインストール
    OpenWRT上のソフトウェア、msmtpをインストールします。
  • msmtprcファイル作成
    ユーザーごとにも設定できますが、システムの設定ファイルを利用します。
  • シェルスクリプトの作成
    msmtpを利用してgmailからメールを送信するシェルスクリプトを作成します。
  • cronの設定
    適当な頻度でシェルを実行するようにします。

Googleアプリパスワードの作成

まず、準備としてGoogleアプリパスワードを生成します。

Googleアカウントにログインし、セキュリティを選択。

二段階認証は必須なので設定。

2段階認証プロセスの設定の下の方にあるアプリパスワードを設定。

新しくアプリパスワードの名前を入力し、作成。

生成されたアプリパスワードを記録

smtpクライアント(msmtp)のインストール

 msmtpは、シンプルなSMTP クライアントで、メールサーバーを指定してメールを送信することができます。ここでは送信するメールとしてメールはgmailを使います。

msmtpをOpenWrtのSoftwareからインストールします。(System->Software)

設定ファイル(msmtprc)の作成

設定ファイルを作成します。ユーザー毎にも作成出来ますが、OpenWRTなので今回はシステムのデフォルト(/etc/msmtprc)を編集します。ユーザー毎に作成する場合は.msmtpファイルをユーザーのホームディレクトリに作成します。

編集後のmsmtpファイル

defaults
account gmail
host smtp.gmail.com
port 587
user xxxxx@gmail.com
password (先ほど生成したアプリパスワード)
from xxxxx@gmail.com
tls on
tls_starttls on
tls_certcheck off
auth on
syslog LOG_MAIL
account default : gmail

シェルスクリプトの作成

送信を実行するシェルスクリプトを作成します。

#!/usr/bin/env sh
# OpenWRT changeip.sh
# file /usr/local/changeip.sh
#

RECIPIENT="xxxxx@gmail.com"
SENDER="owr_home<xxxxxx@gmail.com>"
ipaddress=$(curl -s ifconfig.io -4)
global_ipaddress=$(cat /usr/local/gip/oldgip4)
if [ ${ipaddress} != ${global_ipaddress} ]; then
  cat << EOF > /usr/local/gip/message
To: ${RECIPIENT}
Subject: Home Global IP has changed.
From: ${SENDER}
IP is ${ipaddress}
EOF
  cat /usr/local/gip/message | msmtp xxxxx@gmail.com
  echo ${ipaddress} > /usr/local/gip/oldgip4
else
  echo ${ipaddress} > /usr/local/gip/oldgip4
fi

シェルスクリプトにあるファイル、フォルダを事前に作成しておきます。書込み権限も念の為、与えておきます。

mkdir /usr/local/gip
touch /usr/local/gip/oldgip4
chmod 666 /usr/local/gip
chmod 666 /usr/local/gip/oldgip4

cronの設定

cronの設定をします。ここではLuci上のScheduled Tasks(System→Schedule Tasks)で設定しています。

Schedule Tasksの項目に以下のようにcronの設定を行っています。

※5時、8時、12時、15時、18時、21時、にシェルスクリプトが実行され、Global IPが変わっていたらメールが送られます。

PATH=/usr/sbin:/usr/bin:/sbin:/bin
0 5,8,12,15,18,21 * * * /usr/local/changeip.sh > /usr/local/ciperr.log

事前に、cronで記載されているエラー用のログファイルを作成しておきます。

touch /usr/local/ciperr.log
chmod 666 /usr/local/ciperr.log

ハマるポイント

いくつかハマるポイントがあったので備忘録として残しています。

  • ユーザー用のmsmtpファイル(.msmtpファイル)があるとそちらが優先される。
  • cronからファイルへの書き込みができない。
  • Googleアプリパスワードは作成時にしかパスワードを確認できない。

始めはよくわからずユーザ用の.msmtpファイルを作成していたので、その後作成したシステム用のmsmtpファイルが機能せずにハマりました。あと、cronからファイルへの書き込みができなかったため、フォルダの書き込み権限を変えています。3つ目はGoogleアプリパスワード、あまり使用しないため、前回設定していたものを忘れており、再び作成してしまいました。

これで、グローバルIPが変わってもそこそこのタイミングでmailにて通知がくるようになり、WireguardのVPNの使い勝手が良くなりました。