OpenVPNサーバーがOpenVPNクライアントを使用せずにリモートポートでリッスンしていることを確認する方法


39

OpenVPN(UDP)サーバーが稼働しており、指定されたhost:portでアクセスできることを確認する必要があります。

OpenVPNクライアントがなく(サーバーをインストールする機会もない)、サーバーへの接続に必要なキーもない、普通のWindows XPコンピューターしかありません。WinXPの一般的なコマンドラインツール、ブラウザー、およびPuTTYだけが私の傾向にあります。

SMTPまたはPOP3サーバーのようなものをテストしていた場合、telnetを使用して応答するかどうかを確認しますが、OpenVPN(UDP)でこれを行う方法は?


OpenVPNのは、TCP経由で実行されている場合、あなたにもtelnet接続ができ
RVS

OpenVPNはUDP経由で実行されています
イヴァン

2
実際の監視システムからではなく、時代遅れのWindowsシステムからこれを解決したい理由について詳しく説明していただけますか?
アレックスホルスト

2
UDP openvpnサーバーが(推奨)tls-auth構成オプションを使用している場合、それは不可能です(少なくとも外側のラッパーキーがない場合)。不正なHMAC署名を持つパケットは、サーバーによる応答なしで破棄されます。
アレックスストラジェス

回答:


51

シェルのワンライナーは次のとおりです。

echo -e "\x38\x01\x00\x00\x00\x00\x00\x00\x00" | 
   timeout 10 nc -u openvpnserver.com 1194 | cat -v

反対側にopenvpnがある場合、出力は

@$M-^HM--LdM-t|M-^X^@^@^@^@^@@$M-^HM--LdM-t|M-^X^@^@^@^@^@@$M-^HM--LdM-t|M-^X...

それ以外の場合は、10秒後にミュートされてタイムアウトになるか、異なるものが表示されます。

注:これは、tls-authconfigオプションがアクティブでない場合にのみ機能します。そうでない場合、サーバーは誤ったHMACを持つメッセージを拒否します。


2
私は少し違うものを手に入れますが、私は何かを手に入れます。ありがとう。
artfulrobot

7
明らかなことを述べるために、これはWindowsではなくLinux / Unix用です。また、netcatが必要です(一部のディストリビューションではデフォルトでインストールされません)。また、Linuxディストリビューションに「タイムアウト」コマンドがない場合は、「nc -w 10 -u openvpnserver.com 1194」のようなnetcatの「-w」パラメーターを使用するだけです。
MV。

1
これはすごいfsckingです。
-dmourati

2
サーバーがtls-authconfigオプションを使用して不正なHMAC sigを持つパケットをドロップする場合、これはOPシナリオでは機能しません。
アレックスストラジェス

2
a)ASCIIガベージではなく実際のバイナリコンテンツを確認し、b)サーバーが各ハンドシェイクパケットを送信するときに出力の各行を即座に受信し、最初の直後にそれを停止できるためod -x -N 14、パイピングの方cat -vがはるかに便利です。-N 14ハンドシェイクパケットの長さは14バイトで、繰り返されるためです。
BaseZen

5

回答が少し遅れてすみません;)
次の内容のudpパケットを送信します:
$ 38 $ 01 $ 00 $ 00 $ 00 $ 00 $ 00 $ 00 $ 00
サーバーは何か応答する必要があります。
次のようなpythonでudpパケットを偽造できます。

import socket
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
   sock.connect((ip, port))
   print("Sending request...")
   sock.send(senddata)
   try:
      dta=sock.recv(100)
      print("Server reply: %s" %(dta))
   except:
      print("Server not responding")
   sock.close()
   print("###########################################################")

def main():
   checkserver("addr.of.server1",1194)
   checkserver("addr.of.server2",1195)

if __name__ == "__main__":
   main()

1
loicの答えが示すように、これはのために機能しませんtls-auth
tedder42 16

1
Python 3行10では問題が発生します。「sock.send(senddata)」を「sock.send(senddata.encode())」に置き換えると、動作します。
NDB

2

CLIで次を実行しようとすることができます

#netstat -ltnup

これにより、サーバー/システムでリッスンしているすべてのプロセスがリストされます。必要なポート番号のGrep

#netstat -ltnup | grep 1194

OPにはWindows XPツールしかありません。
user9517はGoFundMonicaをサポートしています11

1
@Iain:OPにはPuTTYがあったため、サーバーにSSHで接続できる可能性があります。その場合、この非常に簡単なチェックは有用な最初のステップです。
mivk

2

これを実行して、tls-auth有効になっているサーバーを監視しようとしている人は、次のPythonスクリプトを使用できます:https : //github.com/liquidat/nagios-icinga-openvpn

出力はNagiosまたはIcingaで使用するためにフォーマットされていますが、Pythonとtlsキーファイルを使用できる場合は、誰でも実行できます。

たとえばSHA256、ダイジェストとして使用している場合、次のようなものを使用します。

python check-openvpn.py -p 1194 --tls-auth ta.key --digest SHA256 vpn-server.example.com

注:--tls-auth-inverseサーバーのkey-direction値に応じて追加する必要がある場合があります。


0

有効なOpenVPNクライアントとOpenVPNサーバーの相互作用のpcapを取得できる場合、TiZonによって提案されているように、netcatのようなものでパケットの初期セットをモデル化できます。

基本的に、サーバーに少なくともエラーメッセージで応答させるために十分な有効な最初のパケットが必要なので、完璧である必要はありません。

http://pcapr.netにアクセスしようとしましたが、OpenVPNの例はありませんでした。おそらく、他の誰かがサービスが稼働していると主張している場合、その人にトランザクションのpcapを取得させることができます。


-5

TCPリッスンでopenvpnをセットアップしている場合は、次のように簡単です

telnet vpnserver 1194

1194がリッスンしているポートであると仮定します

これにより、openvpnサーバーがリッスンしていることを示す何らかの応答が得られます。


100%確信していますか?これを行うと、しばらく待ってから「ポート1194でホストへの接続を開けませんでした:接続に失敗しました」というメッセージが表示されます。OpenVPNサーバーが応答する前に、クライアントは最初に何かを言うつもりではありませんか?
イヴァン

6
デフォルトでOpenVPNはUDPのみであり、telnetはTCPを使用することを意図していることに注意してください。
イヴァン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.