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

Iva*_*van 43 security openvpn testing telnet

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

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

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

Loi*_*ary 57

这是一个外壳单线:

echo -e "\x38\x01\x00\x00\x00\x00\x00\x00\x00" | 
   timeout 10 nc -u openvpnserver.com 1194 | cat -v
Run Code Online (Sandbox Code Playgroud)

如果另一端有 openvpn,输出将是

@$M-^HM--LdM-t|M-^X^@^@^@^@^@@$M-^HM--LdM-t|M-^X^@^@^@^@^@@$M-^HM--LdM-t|M-^X...
Run Code Online (Sandbox Code Playgroud)

否则它将在 10 秒后静音并超时或显示不同的内容。

注意:这仅在tls-authconfig 选项未激活时才有效,否则服务器会拒绝 HMAC 不正确的消息。

  • 简单说一下,这是针对 Linux/Unix 的,而不是针对 Windows 的。并且它需要 netcat(在某些发行版中默认未安装)。此外,如果您的 Linux 发行版没有“超时”命令,只需使用 netcat“-w”参数,例如“nc -w 10 -u openvpnserver.com 1194”。 (9认同)
  • 我发现管道到 `od -x -N 14` 而不是 `cat -v` 更有用,因为你可以 a) 看到实际的二进制内容而不是 ASCII 垃圾,b) 作为服务器立即接收每一行输出发送每个握手数据包并在第一个之后立即停止。`-N 14` 因为握手包有 14 个字节长并且只是重复。 (3认同)
  • 我得到了一些不同的东西,但我确实得到了一些东西。谢谢。 (2认同)
  • 如果服务器使用 `tls-auth` 配置选项丢弃 HMAC sig 不正确的数据包,这在 OP 场景中将不起作用。 (2认同)

Mis*_*uru 6

您可以尝试在 CLI 中运行以下命令

#netstat -ltnup
Run Code Online (Sandbox Code Playgroud)

这应该列出正在您的服务器/系统上侦听的所有进程。grep 查找你想要的端口号

#netstat -ltnup | grep 1194
Run Code Online (Sandbox Code Playgroud)


小智 6

抱歉,如果我的回答有点晚了 ;)
发送包含以下内容的 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()
Run Code Online (Sandbox Code Playgroud)

  • 对于 Python 3 第 10 行会导致问题。将“sock.send(senddata)”替换为“sock.send(senddata.encode())”,它将起作用。 (3认同)
  • 正如 loic 的回答所说,这不适用于 `tls-auth`。 (2认同)

ser*_*ren 6

对于任何试图监视已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值进行添加。


ant*_*set -3

如果你在 tcp 监听上设置了 openvpn 那么它就像

telnet vpnserver 1194
Run Code Online (Sandbox Code Playgroud)

假设 1194 是你让它监听的端口

这应该会给你某种形式的响应,表明 openvpn 服务器正在监听

  • 请注意,默认情况下 OpenVPN 仅使用 UDP,而 telnet 则使用 TCP。 (6认同)
  • 没有理由对此投反对票。他明确表示这个解决方案是针对监听tcp的openvpns。例如,我有这样的解决方案,因为我的负载均衡器不允许 udp (3认同)