我已经在host1上启动反向SSH隧道:
host1@host1:~ $ while true; do echo "$(date) - Tunnel created" && ssh host2@host2 -NT -R3389:localhost:3389; done
我可以使用以下命令检查是否打开了从host2反向隧道的端口:
host2@host2:~$ nc -zv host1 3389
nc: connect to host1 port 3389 (tcp) failed: Connection refused
但是如果我发出以下命令,则它(可能)检查本地主机上端口的状态。实际上是打开的:
host2@host2:~$ nc -zv localhost 3389
Connection to localhost 3389 port [tcp/*] succeeded!
但是我想检查SSH隧道其他站点上端口的状态。因此,上一条命令应返回该端口已关闭,直到发出以下命令为止:
host1@host1:~/.ssh $ while true; do nc -lp 3389; done
由于TCP的性质,这是否有可能?
您不能使用TCP代理方法来模拟缺少服务的情况(“连接被拒绝”)在代理条目(主机2)处,因为:
您的客户端已经建立了到代理的连接,因此代理终止连接的唯一可能方法是进行连接重置(而实际目标的行为是“连接被拒绝”或“超时”)。
因此使用TCP代理方法无法模拟服务缺失。
现实世界中的代理行为(您所拥有的)] >>
] >>Client Proxy target ----HND-F1-SYN-->| | <---HND-F2-------| | ----HND-F3------>| | |---second hop connectopn-->|
理想代理的行为(您想要的)
Client Proxy target ----HND-F1-SYN-->| | |---second hop connectopn-->| <---HND-F2-------| | ----HND-F3------>| |
嗯,当然您可以通过使用防火墙对传入的SYN帧进行特殊处理的同时保留两个侦听套接字(原始+通用),当然是[[您可以制定解决方案来模拟缺少目标服务的解决方案
如您所见,实现这种解决方案可能很容易,但是它并不流行,因为它需要使用混杂的套接字,并且需要CPU额外的负载。好吧,这就是为什么不可能的原因。
这是您想要的方式:
通过这种方式,host1和host2之间的连接将是安全的,并且您的客户端将在TCP级别上看到绝对相同的握手,因此,它将确定服务是否正在运行(成功连接)(否)(connrefused或超时)。