![通过 SSH 隧道通过中间服务器连接到 MSSQL](https://linux22.com/image/688371/%E9%80%9A%E8%BF%87%20SSH%20%E9%9A%A7%E9%81%93%E9%80%9A%E8%BF%87%E4%B8%AD%E9%97%B4%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%BF%9E%E6%8E%A5%E5%88%B0%20MSSQL.png)
我遇到一个相当复杂的情况,涉及让公司网络外部的外部服务器与公司网络内的 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