我需要测试 OpenVPN 服务 (ssl-vpn) 是否正在从 Linux 机器监听特定 IP 地址和端口。我想使用 bash 脚本或 python 或 c/c++ 中的一些代码来做到这一点,但这不是问题 - 只要我知道 UDP 在这里如何工作,我就可以实现它。
我的问题是:远程计算机上的 VPN 服务配置为使用 UDP,并且由于 UDP 不是支持 TCP 等连接的协议,所以我假设我发送到远程机器的任何消息/包的答复都会被答复到我本地机器上的另一个端口。
我知道 netcat,但显然我不会使用无连接 UDP 协议收到答复,因此检查是nc -u ip port
行不通的。
那么,如何检查 VPN 是否真的在 IP 地址和端口后面启动并运行。
编辑:
是否可以使用 bash 脚本模拟 VPN?例如使用 SMTP 中的 HELO 连接并检查 VPN 服务器是否发送了回复?我知道这在 tcp 中是如何工作的,但我不知道如何在 UDP 中做到这一点。
编辑2:
我刚刚发现这个答案。那么,当远程服务器不可用时,我该如何监听应该应答的 ICMP 包?使用 bash/python/c/c++ 或 netcat 可以实现吗?我如何知道服务器是否在那里,监听请求(那么不应该有 ICMP 响应,对吗?)?
答案1
我认为可靠地测试这一点的唯一方法就是简单地建立与 VPN 的连接。
正如您所说,使用 TCP 的 OpenVPN 无法通过简单的 TCP 连接进行测试。我怀疑唯一的测试方法是使用 OpenVPN 协议。
我认为可以修改客户端以在未完全连接的情况下进行测试。
答案2
这是我之前对类似问题的回答。
如何在不使用 OpenVPN 客户端的情况下检查 OpenVPN 服务器是否正在监听远程端口?
如果您正在使用 tls 身份验证(tls-auth 配置行),则这不起作用,但您可以了解 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()