昨年来、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の使い勝手が良くなりました。