在 IP 范围内启用防火墙的代理 Azure SQL 数据库

在 IP 范围内启用防火墙的代理 Azure SQL 数据库

我有以下设置

  • 启用防火墙的 Azure SQL 数据库,以便仅允许来自 104.xxx IP 地址的连接
  • Azure 托管 Linux VM,与 Azure DB 位于同一位置,外部 IP 为 104.xxx
  • 本地 Linux VM,能够通过 vnet 连接 Azure VM,外部 IP 地址为 91.xxx

目标是能够使用 Azure 托管 VM 作为代理将本地 VM 连接到 SQL DB。

我尝试了两种方式进行设置,使用 Nginx + RTMP 流媒体模块,如下所述使用 TCP 代理通过 VPN 连接到 SQL 数据库,接下来nginx.conf

events {
  worker_connections  1024;
}
stream {
  upstream sqlvm {
    server sqldb.database.windows.net:1433;
  }
  server {
    listen 1433;
    proxy_pass sqlvm;
  }
}

第二种方式是使用 HAProxytcp模式。

listen sqldb
    bind *:1433 
    mode tcp
    server sqldb sqldb.database.windows.net:1433 check port 1433 inter 1000

在两种情况下,与 SQL 客户端(例如sqlcmd)的连接都会以相同的方式失败。

# 10.x.x.x is the IP of Azure VM in this setup
$ sqlcmd -S 10.x.x.x,1433 -d dbName -U [email protected] -P password
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Cannot open server 'sqldb' requested by the login. Client with IP address '91.x.x.x' is not allowed to access the server.  To enable access, use the Windows Azure Management Portal or run sp_set_firewall_rule on the master database to create a firewall rule for this IP address or address range.  It may take up to five minutes for this change to take effect..

在代理虚拟机上执行时,相同的命令有效。

所以不知何故,Azure SQL 知道原始客户端 IP 地址并阻止它,即使它是通过代理。

鉴于我们在 TCP 级别进行代理,这怎么可能呢?此设置是否有解决方法/工作配置?

答案1

这个问题的答案似乎在文档中Azure SQL 连接体系结构Azure SQL Connectivity Architecture

连接策略

默认:这是创建后在所有服务器上生效的连接策略,除非您明确将连接策略更改为代理或重定向。对于来自 Azure 内部的所有客户端连接(例如,来自 Azure 虚拟机),默认策略为重定向;对于来自外部的所有客户端连接(例如,来自本地工作站的连接),默认策略为代理。

这意味着第一个连接通过代理,但重定向后它会完全绕过代理。

对于上述设置,解决方案是将代理 VM 移出 Azure。也可以通过将 DB 连接模式更改为代理模式来实现(但会降低性能)

相关内容