通过 SSH 隧道通过中间服务器连接到 MSSQL

通过 SSH 隧道通过中间服务器连接到 MSSQL

我遇到一个相当复杂的情况,涉及让公司网络外部的外部服务器与公司网络内的 MSSQL 服务器进行通信。目的是将实时数据库数据拉入客户的云应用程序中。我在为云应用程序供应商工作。云应用程序是一种“大数据”分析解决方案。

客户坚持将他们的数据库保存在他们自己的网络内,因此将整个数据库移动到云端是不可行的。

我们的设置是:

服务器1)Ubuntu 虚拟服务器位于 AWS 上,运行云应用程序。云应用程序需要知道 MSSQL 服务器的 IP 地址和端口。我们对此拥有 root 访问权限。

服务器2)Ubuntu 物理服务器,位于公司网络内。我们将其放入其中以协商将数据路由到外部云服务。我们拥有对此服务器的 root 访问权限,可以对其进行任何操作

服务器3)MSSQL 数据库服务器,位于企业网络内。此数据库服务器由各种客户端业务应用程序使用,因此可以理解的是,企业 IT 部门希望我们不要干预此服务器。我们没有此服务器的 root 访问权限。我们有一个只读用户帐户来连接数据库。

                         | (Corporate network)
(Cloud provider)         |
[Server 1] <=====(reverse SSH tunnel)===[Server 2]
                         |                  | (happily talking)
                         |              [Server 3 (DB)]

由于各种原因,我们无法获得服务器 2 的公共 IP 地址,公司 IT 部门也无法将端口转发到服务器 2。我们实际上可以从外部与服务器 2 通信的唯一方式是通过反向 SSH 隧道,公司 IT 部门认为这是可以接受的。如果需要,我们可以创建多个反向隧道。

反向隧道工作正常:

    Server 2)#   ssh -f -N -R 50022:localhost:22 reversessh@server_1.ip.address

我们可以通过以下方式从服务器 1 访问服务器 2:

    Server 1)$   ssh my_user_on_server2@localhost -p 50022

网络内的服务器 2 可以看到服务器 3,并且可以顺利连接到在其上运行的 MSSQL 数据库服务器。FWIW 我一直在使用 unixodbc / FreeTDS 测试与服务器 3 的 MSSQL 通信。

如何让服务器 1 上的 MSSQL 客户端与服务器 3 上的数据库通信?

我尝试过的:

考虑到我们对服务器 2 拥有完全控制权,我已尝试通过 UFW 设计端口转发,以便到达服务器 2 上的端口 51433 的数据包将被发送到服务器 3 上的端口 1433。但即使这样似乎也不起作用(是的,我在添加规则后禁用然后启用了 UFW)

/etc/ufw/sysctl.conf

    net/ipv4/ip_forward=1

/etc/ufw/before.rules

    *nat
    :PREROUTING ACCEPT [0:0]
    -A PREROUTING -p tcp --dport 51433 -j DNAT --to-destination server_3.internal.ip.address:1433
    COMMIT

但是,尝试使用 localhost:51433 连接到服务器 2 上的 MSSQL 数据库不起作用。

我的计划是在服务器 2 和服务器 1 之间建立另一个反向 SSH 隧道:

    Server 2)#   ssh -f -N -R 1433:localhost:51433 reversessh@server_1.ip.address

然后将 MSSQL“客户端”(云应用程序)指向服务器 1 上的 localhost:1433。

因此,请记住,我们只能进行反向 SSH 隧道传输流量到我们内部的服务器……

如何让服务器 1 上的 MSSQL 客户端与服务器 3 上的数据库通信?

考虑到企业网络的限制,我们还可以采用其他方法吗?

更新

@dave_thompson_085 建议的工作解决方案:

    Server 2)#   ssh -f -N -R 51433:server3:1433 user@server1

相关内容