通过ssh隧道访问远程数据库(Python 3)

Vla*_*nov 3 python ssh remote-access ssh-tunnel

我什至不理解(即使在阅读了几篇有关ssh tunelling的文章之后),CLI ssh命令在此脚本中的什么参数也是如此。基本上,我必须连接到某些服务器(我称其为“ ssh_tunnel_host:22”),而不是使用此隧道连接到db_host。

with SSHTunnelForwarder(
    ('ssh_tunnel_host', 22),
    ssh_username="ssh_username",
    ssh_pkey="/somepath/id_rsa",
    local_bind_address=('0.0.0.0', 1234),
    remote_bind_address=('127.0.0.1', 3306)
) as tunnel:
    client = paramiko.SSHClient()
    client.load_system_host_keys()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect('127.0.0.1', 1234)
    db_connection = pymysql.connect(host=db_host, port=3306, db='mysql', user='user',
                                    password='password', charset='utf8mb4')
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释:

  1. 什么是local_bind_address-是我的本地地址还是ssh_tunnel_host本地地址?在哪里可以学习IP和端口?
  2. 取决于上一个问题-什么是remote_bind_address-它是ssh_tunnel_host还是db_host的地址?我在哪里可以学习这些IP和端口?
  3. 我应该在哪里连接client.connect()?本地还是远程绑定?

(我确实尝试阅读文档,但仍然很混乱)

dan*_*nny 5

将其视为代理连接。您连接到ssh_tunnel_host:22它,并告诉它从其代理服务器连接<db host>:3306,这意味着客户端db_host访问ssh_tunnel_host您的端口3306 。

您可以指定您希望代理连接可用的本地(对您)ip:port,也可以让客户端选择一个免费的。省略local_bind_address后者。

然后,您连接到本地端口,该端口实际上是的代理remote_bind_address:3306

local_bind_address<-> ssh_tunnel_host<->remote_bind_address

代码应为:

db_host = '<address reachable only by ssh_tunnel_host>'
with SSHTunnelForwarder(
    ('ssh_tunnel_host', 22),
    ssh_username="ssh_username",
    ssh_pkey="/somepath/id_rsa",
    remote_bind_address=(db_host, 3306)
) as tunnel:
    port = tunnel.local_bind_port
    db_connection = pymysql.connect(
        host='127.0.0.1', port=port, db='mysql', user='user',
        password='password', charset='utf8mb4')
Run Code Online (Sandbox Code Playgroud)
  1. 客户地址本地。设置一个,或让客户端从中选择并找到其端口tunnel.local_bind_port

  2. 您要ssh_tunnel_host代理回信给您的地址。如果它是服务器服务的本地地址,则IP将是127.0.0.1服务的端口。可能是任何其他IP或ssh_tunnel_hostSSH隧道主机外部不可见的IP 网络中的IP 。

  3. 无处。隧道提供了一个本地ip:port代理远程连接。一旦隧道建立,就不需要其他客户端了。只需连接到本地ip:port。