如何在不使用 OpenVPN 客户端的情况下检查 OpenVPN 服务器是否正在监听远程端口?

如何在不使用 OpenVPN 客户端的情况下检查 OpenVPN 服务器是否正在监听远程端口?

我需要检查 OpenVPN(UDP)服务器是否在给定的主机:端口上启动并可访问。

我只有一台普通的 Windows XP 计算机,没有 OpenVPN 客户端(也没有机会安装它),也不需要密钥来连接服务器 - 我只需要常见的 WinXP 命令行工具、浏览器和 PuTTY。

如果我正在测试 SMTP 或 POP3 服务器之类的东西,我会使用 telnet 并查看它是否响应,但是如何使用 OpenVPN(UDP)执行此操作?

答案1

以下是 shell 的一行代码:

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-auth,否则服务器将拒绝具有不正确 HMAC 的消息。

答案2

抱歉我的回答有点晚了 ;)
发送一个包含以下内容的 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.encode())
   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()

答案3

对于遇到此问题并试图监视已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值进行添加。

答案4

如果您可以获得有效的 OpenVPN 客户端与 OpenVPN 服务器交互的 pcap,则可以按照 TiZon 的建议,使用 netcat 之类的工具对初始数据包集进行建模。

基本上,您需要足够有效的第一个数据包来让服务器至少响应一条错误消息,因此它不必完美,只要足够好即可。

我尝试去http://pcapr.net,但我没有看到 OpenVPN 示例。也许,如果其他人声称服务已启动,您可以让其他人获取交易的 pcap。

相关内容