我需要检查 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。