Help us understand the problem. What is going on with this article?

【接続したら】SoftEther Server 接続検知設定【メールでお知らせ】

More than 1 year has passed since last update.

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)

ちゃんとそれぞれのタイミングでメールが届くこと!!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away