SoftEther Server にVPN接続してきたときにメールで通知を投げるように設定します
SoftEtherのログ監視には swatch を利用
※ swatch についてはこちらを参照:Qiita swatchでログ監視、メール送信
SoftEtherのログはファイル名に日付がついている形式なので、ファイルの切り替わりを検知するために incron を利用
※ incron についてはこちらを参照:Qiita incronを使ってみた
SoftEther は言語が選べるので、とりあえず日本語と英語のログに対応しときます
※ 言語の切り替えはこちらを参照:Qiita SoftetherVPNの言語設定をEngilishへ変更
※ swatch の 設定に日本語と英語の両方のパターンを定義して対応です
この手順ではメールの送信に ssmtp を利用します
※ ssmtp のインストールや設定はこちらを参照:Qiita 【ssmtp】CentOSでログイン通知【rsyslog】
※ メールの文字コードに UTF-8 を指定しているので環境によっては文字化けるかも(手抜き)
※ メール送信用シェルを書き換えればなんにでも通知を投げれます(たとえばslackとか)
incron,swatch インストール(ログ、ディレクトリ監視用)
# mkdir -p /usr/local/src/yum/23.softether_watch
# cd /usr/local/src/yum/23.softether_watch
# yum --enablerepo=epel \
--downloadonly \
--downloaddir=./ \
install \
swatch \
incron \
# yum localinstall *.rpm
ログ監視(swatch)設定(接続・切断・認証失敗のログを監視)
それぞれのキーワードでログをひっかけて、exec で外部コマンドを呼び出してます
接続の失敗も検知するようにしてますが、大量にメールが来ても困るので 60秒以内に3回間違えたら通知するように制限もかけときます
# mkdir /usr/local/vpnswatch
# cd /usr/local/vpnswatch
# vi vpnswatchrc
# swatch で vpnserver のログを監視する
# 通信を開始したら通知
watchfor /\[HUB.* セッション .*: VPN Client の詳細:/
exec /usr/local/vpnswatch/sendmail.sh 'Connect' '$_'
watchfor /\[HUB.* Session .*: VPN Client details:/
exec /usr/local/vpnswatch/sendmail.sh 'Connect' '$_'
# 通信を終了したら通知
watchfor /\[HUB.* セッション .*: セッションが終了しました/
exec /usr/local/vpnswatch/sendmail.sh 'Disconnect' '$_'
watchfor /\[HUB.* Session .*: The session has been terminated/
exec /usr/local/vpnswatch/sendmail.sh 'Disconnect' '$_'
# ユーザ認証失敗したら(60秒間に3回間違えたら)通知
watchfor /\[HUB.* コネクション .*: ユーザー認証に失敗/
exec /usr/local/vpnswatch/sendmail.sh 'Fail' '$_'
threshold track_by=/\[HUB.* コネクション .*: ユーザー認証に失敗/,type=both,count=3,seconds=60
watchfor /\[HUB.* Connection .*: User authentication failed/
exec /usr/local/vpnswatch/sendmail.sh 'Fail' '$_'
threshold track_by=/\[HUB.* Connection .*: User authentication failed/,type=both,count=3,seconds=60
メール送信用シェル
ログでキーワードを検知したら呼ばれるシェル
とりあえず syslog にも情報を投げておいて、ssmtp でメールを送信します
メールアドレスはダミーなので自分のメールアドレスに変えないと届きませんよ
# vi sendmail.sh
#!/bin/bash
logger -p auth.crit -t vpnserver${1} "$2"
★ ADDR="test@mail.server.com"
SUBJ="VPNSERVER ${1} : `hostname`"
TYPE1='Content-Type: text/plain; charset="UTF-8"'
TYPE2='Content-Transfer-Encoding: 7bit'
HEADER="${TYPE1}\n${TYPE2}\nFrom: ${ADDR}\nTo: ${ADDR}\nSubject: ${SUBJ}"
echo -e "${HEADER}\n\nVPNServer ${1}\n\n${2}\n" | \
ssmtp -s ${ADDR}
# chmod 700 /usr/local/vpnswatch/sendmail.sh
ログ監視のサービス化(デーモン化 - vpnserver の起動後に起動)
vpnserver が起動してないときは監視しない
(vpnserver側の起動後条件にログ監視を追加しとくと良いかも)
# vi /usr/lib/systemd/system/vpnswatch.service
[Unit]
Description=SoftEther VPN Server Log Simple Watch
After=network.target
★ After=vpnserver.service
[Service]
Type=forking
ExecStart=/usr/local/vpnswatch/vpnswatch start
ExecStop=/usr/local/vpnswatch/vpnswatch stop
[Install]
WantedBy=multi-user.target
ログ監視サービス制御シェル
ログファイル名を動的に設定して swatch を起動します
# vi vpnswatch
#!/bin/bash
VPNDIR=/usr/local/vpnserver
SWATCHDIR=/usr/local/vpnswatch
SWATCHRC=${SWATCHDIR}/vpnswatchrc
PIDFILE=${SWATCHDIR}/.vpnswatch.pid
LOGDIR=${VPNDIR}/server_log
LOG=${LOGDIR}/vpn_`date '+%Y%m%d'`.log
# ログファイルが存在しなければ監視しない
if [ ! -e ${LOG} ]
then
echo "vpnswatch not found logfile : ${LOG}"
exit 0
fi
start() {
# Start daemons.
ls ${PIDFILE} > /dev/null 2>&1
if [ $? -ne 0 ]
then
echo "Starting vpnswatch"
/bin/swatch \
--config-file ${SWATCHRC} \
--script-dir ${SWATCHDIR} \
--pid-file ${PIDFILE} \
--tail-file ${LOG} \
--daemon
RETVAL=$?
return $RETVAL
else
echo "vpnswatch is already started"
fi
}
stop() {
# Stop daemons.
ls ${PIDFILE} > /dev/null 2>&1
if [ $? -eq 0 ]
then
echo "Shutting down vpnswatch"
kill $(cat ${PIDFILE})
rm -f ${PIDFILE}
return 0
else
echo "vpnswatch is not running"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "Usage: vpnswatch {start|stop|restart}"
exit 1
esac
exit 0
# chmod 700 vpnswatch
ログ監視サービス起動
# systemctl daemon-reload
# systemctl enable vpnswatch
# systemctl start vpnswatch
ログ切り替え監視設定
ログディレクトリにファイルがCREATE されたら、ログ監視サービスを再起動するように incron に設定
# incrontab -e
/usr/local/vpnserver/server_log IN_CREATE /usr/local/vpnswatch/vpnswatch restart
ログ切り替え監視設定有効化
reload は必須のようです
# incrontab --reload
# incrontab -l
# systemctl enable incrond
# systemctl start incrond
以上で接続検知設定は終了
きちんとメール送信がされるかをテストしておきます
VPNServerへの接続検知テスト
1)クライアントを起動して接続してみる
client# systemctl start vpnclient
--> メール受信(Connect)
2)クライアントから切断してみる
client# /usr/local/vpnclient/vpncmd localhost /CLIENT
> AccountDisconnect USER1
--> メール受信(Disconnect)
3)クライアントでパスワードを間違えて接続してみる
3回リトライして失敗するまでしばらく待つべし
client# /usr/local/vpnclient/vpncmd localhost /CLIENT
> AccountPasswordSet USER1 /TYPE:standard
> AccountConnect USER1
--> メール受信(Fail)
4)クライアントでパスワードを戻して接続してみる
client# /usr/local/vpnclient/vpncmd localhost /CLIENT
> AccountDisconnect USER1
--> メール受信(Disconnect)
> AccountPasswordSet USER1 /TYPE:standard
> AccountConnect USER1
--> メール受信(Connect)
ちゃんとそれぞれのタイミングでメールが届くこと!!