如何检查是不是正在使用 ssh 隧道?

Posted

技术标签:

【中文标题】如何检查是不是正在使用 ssh 隧道?【英文标题】:How to check if ssh tunnel is being used?如何检查是否正在使用 ssh 隧道? 【发布时间】:2020-09-11 23:01:05 【问题描述】:

我正在使用 python 脚本自动打开隧道,我正在寻找一种方法来查看是否正在使用隧道。

python 代码:

    from sshtunnel import SSHTunnelForwarder
    server = ( SSHTunnelForwarder(
        'main_server_ip',
        ssh_username="username",
        ssh_pkey="~/.ssh/id_rsa",
        local_bind_address=('0.0.0.0', randomPort),
        remote_bind_address=(host_ip, 3389)
        ) )

我使用了sshtunnel 选项:

server.skip_tunnel_checkup = False
server.start()
server.check_tunnels()
print(server.tunnel_is_up, flush=True)

但它只显示隧道是否打开\活动未使用,我在发布之前寻找了一种方法,但所有示例仅显示隧道是否活动\打开。

我需要一个选项来查看隧道是否已使用\未使用,因此如果 X 次未使用,我可以关闭它。

隧道用于 rdp 连接,对我来说,如果有人通过隧道连接到 rdp 连接并进行处理。如果 rdp 会话关闭,则表示隧道未使用。

谢谢

【问题讨论】:

【参考方案1】:

这是我的解决方案:

import subprocess, re, socket

ip_address = (([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")] or [[(s.connect(("8.8.8.8", 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1]]) + ["no IP found"])[0]

ports_used = []
p = subprocess.Popen(["netstat", "-na"], stdout=subprocess.PIPE)
out = p.stdout.read()
lines = out.decode('utf-8').split('\n')
for line in lines:
    is_open = re.match(rf'tcp.*ip_address:([0-9][0-9]*).*ESTABLISHED\s*$', line)
    if is_open is not None:
        ports_used.append(is_open[1])

破坏 netstat 命令在机器上查找所有ESTABLISHED 端口,并从那里按主机\容器 ip 过滤,然后将其与我知道在我的数据库数据中打开的端口匹配。 (活动\打开的 ssh 隧道端口都列在我的数据库中。) 那么,我可以查看端口是否不在is_open 中意味着连接已关闭。

【讨论】:

以上是关于如何检查是不是正在使用 ssh 隧道?的主要内容,如果未能解决你的问题,请参考以下文章

如何在MacOS上创建ssh隧道? [关闭]

如何使用 python 打开 SSH 隧道?

如何以编程方式连接到需要 SSH 隧道的远程数据库服务器?

如何使用反向 SSH 隧道绕过防火墙和 NAT

如何在两跳 SSH 隧道上使用 JProfiler

如何链接 SSH 隧道