やってみた OpenVPN利用時にLINEで通知を受け取る

VPN Linux

こちらの記事で自宅のルーターをVPNサーバーとする手順をご紹介しました。その後、以前から興味があったOpenVPNを自宅のサーバーにインストールしてみたのですが、これがなかなかいい感じです。後先になりますが今回はOpenVPNサーバーの構築ではなく、OpenVPNのVPN接続・切断をLINEで通知する方法についてご紹介したいと思います。私のサーバー環境はDebian10.5です。

OpenVPNのよいところ

OpenVPNの場合は自宅LAN内に1台PC・サーバーが必要になりますが(安価に済ませるならラズパイでも可能ですし、予算を気にしなければAWSなどクラウド上に仮想サーバーをたててもOKです)、メーカー・企業が提供するVPNサービスと異なり外部の中継サーバーを必要としません。昨今「VPNサービスを利用し情報漏洩が生じて本末転倒」というニュースもありますが、OpenVPNの場合自宅のサーバーを経由するだけですので「接続先のサーバーが本当に安全なのか信用できない」という悩みは無用です。

OpenVPNのつらいところ

これは前回の記事にもあたりますが、全てにおいて完全に自己責任であることです。自宅のゲートウェイへ外部に対する穴を開けることになりますので、適切な設定を行うことが必要なのは勿論のこと、定期的にログのチェックなども実施した方が良いでしょう。

VPN接続・切断の通知をLINEで受け取る

以上を踏まえ「最低限VPNのセッションが張られた、落ちたくらいは知りたい」と思い色々調べてみました。主に参考にさせて頂いたサイトはこちらです。有益な情報を公開頂き有難うございます!

RaspberryPi VPNのログ監視:VPN接続毎にLINEへ通知して不審なアクセスを検知する

OpenVPN の接続・切断時に Slack に通知する

前者はLINEを使った手法ですが、利用されているのがSoftEther VPNであり、ローカルでの挙動がOpenVPNとは少し異なりました。後者はOpenVPNを利用されていますが、通知先はLINEではなくSlackです。

両者の情報を組み合わせれば上手くいくかも・・・ということで挑戦してみました。全体的な流れはこんな感じです。


VPN接続・切断⇒IFTTTへパラメータを送信⇒IFTTTと連携したLINEが通知を送信


IFTTTに登録

LINEへ通知を飛ばすために「IFTTT(イフト)」というサービスを利用します。恥ずかしながら私はこのIFTTTを知らなくて、今回初めて使ってその便利さに感激しました。「if this then that」を略してIFTTT、読んだ通り「もし〇〇なら☆☆を実行する」という仕組みを提供するものです。アカウントを持っていない方はまずこちらで登録を済ませましょう。

IFTTT
Get started with IFTTT, the easiest way to do more with your favorite apps and devices for free. Make your home more relaxing. Make your work more productive. K...

アカウントを作成したら先ほどのリンク先を参考にIFTTT側の作業を進めましょう。キャプチャを豊富に使いながら大変丁寧に解説されていますので(私も見習わなくては・・・)、特に迷うことは無いと思います。

シェル作成

まずは必要なシェルの置き場を作成しましょう。

sudo mkdir /usr/local/vpn

ここに3つのシェル(LINE.sh、connect.sh、disconnect.sh)を作成します。

connect.sh

#! /bin/bash
sh /usr/local/vpn/LINE.sh connect:$common_name $untrusted_ip $ifconfig_pool_remote_ip
disconnect.sh

#! /bin/bash
sh /usr/local/vpn/LINE.sh disconnect:$common_name $untrusted_ip $ifconfig_pool_remote_ip
LINE.sh

#!/bin/sh
URL="https://maker.ifttt.com/trigger"
EVENTNAME="IFTTTで設定したEventName"
YOUR_KEY="WebhooksのAPIキー(https://maker.ifttt.com/use/***この部分***)"

WEBHOOKSURL="${URL}/${EVENTNAME}/with/key/${YOUR_KEY}"

curl -X POST -H "Content-Type: application/json" -d \
     '{"value1":"'$1'","value2":"'$2'","value3":"'$3'"}' \
         ${WEBHOOKSURL}

echo
exit 0

LINE.shはこちらのサイトのコードをそのまま利用させて頂きました。

それでは、シェルを書き終えたら実行権限を付与しましょう。

sudo chmod +x /usr/local/vpn/*

こんな風になっていればOKです!

sandambara@sandambara:~$ ls -l /usr/local/vpn
合計 12
-rwxr-xr-x 1 root root 340  8月 22 16:24 LINE.sh
-rwxr-xr-x 1 root root  99  8月 22 13:18 connect.sh
-rwxr-xr-x 1 root root 102  8月 22 13:19 disconnect.sh

IFTTT・LINE連携テスト

先ほど作成したLINE.shはconnect.sh、disconnect.shから呼び出して利用しますが、単体でも実行できます。動作テストしてみましょう。

sudo sh /usr/local/vpn/LINE.sh hoge fuga piyo

このように表示されたらシェルの内容はOKです。

sandambara@sandambara:~$ sudo sh /usr/local/vpn/LINE.sh hoge fuga piyo
Congratulations! You've fired the vpn_notification event

無事LINEの通知を受信できたでしょうか??

server.confに加筆する

VPN接続・切断をどうやって検知するかですが、これは先ほどご紹介した2つ目のリンク先にもあるように、OpenVPNのコンフィグで制御が可能でマニュアルにも記載があります。

Openvpn23ManPage – OpenVPN Community

早速コンフィグを編集します。

sudo nano /etc/openvpn/server.conf

コンフィグに下記3行を加筆します。

script-security 2
client-connect /usr/local/vpn/connect.sh
client-disconnect /usr/local/vpn/disconnect.sh

script-security 2はシェル実行を可能にするための設定で、VPN接続・切断時にそれぞれclient-connect、client-disconnectに続くシェルが実行される仕組みになっています。ですのでcronを使ったりディレクトリ監視する必要はありません。

sudo systemctl restart openvpn@server

ここでVPN接続・切断を行いLINEの通知を受け取れれば成功です。ちなみにこれらのシェルを実行できないとき(パスを誤って記述したときなど)は通知が来ないだけではなくOpenVPN自体がコケてしまいますので注意しましょう。

これで「自分がVPNを利用していないのに通知がきた」などというシチュエーションにいち早く気付くことができるようになりました(想像しただけでゾッとしますね/笑)。LINEの通知は他にも色々使い道があると思うので、皆さんも是非挑戦してみてください。

コメント