2013-02-27

[OpenVPN TIPS] OpenVPNの死活監視を行うには

By Taro Yamazaki  |  21:30

VPNサーバーに障害が発生したらすぐに知りたい、というニーズはありますよね。また、ファイアウォールなどを使用している場合に、疎通チェックが必要な場合もあります。

もちろん、OpenVPNクライアントを実際にセットアップし、それを使ってチェックするのが確実ではありますが、チェック用の証明書などを発行したりというのもなかなか面倒です。

今回はOpenVPNサーバーが落ちているかどうか、つまり、稼働しているはずのOpenVPNのポートにアクセスできるかどうかをチェックする方法について取り上げましょう。

プロトコルとしてTCPを使用している場合

OpenVPNをTCP上で運用している場合は単純で、稼働しているはずのポートにTCPで接続(telnetなどでもOKです)してみて、接続できればOpenVPNサーバーは稼働中、接続できなければ停止中、と判断できます。

これはシンプルで簡単ですね。

プロトコルとしてUDPを使用している場合

一方、UDPの場合はちょっと悩みどころです。残念ながらTCPのように簡単にはいきません。

具体的な方法については serverfault.com の「How to check that an OpenVPN server is listening on a remote port without using OpenVPN client?」で取り上げられていますが、稼働しているはずのポートにUDPで接続し、「0x38 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00」という9バイトのデータを送り込むと、もしOpenVPNが稼働していれば何らかのレスポンスがある、ということです。

Pythonのコードで記述するとこんな感じになります。
#!/usr/bin/python
import socket
import sys
from time import time

senddata= "\x38\x01\x00\x00\x00\x00\x00\x00\x00"
def checkserver(ip,port):
   print('Checking %s:%s' %(ip,port)) # <------
   sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
   sock.settimeout(5) # in seconds
   time_start = time()
   sock.connect((ip, int(port)))
   print("Sending request...") # <------
   sock.send(senddata)
   try:
      dta=sock.recv(100)
      time_end = time()
      ret = 0
      print("OpenVPN Connection OK : %f sec response time." %(time_end - time_start))
   except:
      ret = 2
      print("OpenVPN Connection failed.")
   sock.close()
   sys.exit(ret)
def main():
   argvs = sys.argv
   argc = len(argvs)
   if(argc != 3):
      print 'Invalid args!'
      sys.exit(3)
   checkserver(argvs[1], argvs[2])
if __name__ == "__main__":
   main()

なお、上記のコードをちょっといじる(「# <------」というコメントのある行を削除するかコメントアウトする)と、Nagiosのプラグインとしても動作します。あくまでも無保証ですが、よろしければお使いください。

もう一つ補足で。OpenVPNサーバーで管理コンソール(Management Console)を有効にしている場合は、そのポートにTCPで接続できるかどうかをチェックすることで、OpenVPNが稼働しているかを判断するという方法もあります。管理コンソールを使用すれば、単に稼働しているかのチェックだけではなく、現在接続しているクライアントのリストなどを取得することもできます。ただし、ファイアウォールなどで管理コンソールに接続できる接続元を制限したり、アクセス制限をきちんと設定しておかないととても危険ですので、その点はどうぞご注意を。

Image courtesy of digitalart / FreeDigitalPhotos.net

Author: Taro Yamazaki

© 2015 yamata::memo | Distributed By My Blogger Themes | Created By BloggerTheme9
TOP