【问题标题】:how to connect to remote SQL Server Express over internet?如何通过 Internet 连接到远程 SQL Server Express?
【发布时间】:2022-01-17 16:15:17
【问题描述】:

我有一台装有 SQL Server Express 的 Windows 10 PC,我已经设置了远程连接,分配了一个固定端口(express,22172,删除了 IPALL 下的 TCP 动态端口),为端口设置了入站规则等。

我可以从同一网络(同一 LAN 路由器)上的 Linux PC 连接和操作数据库,使用:

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = @"192.168.1.22\SQLEXPRESS, 22172";
builder.InitialCatalog = "<database>";
builder.ItegratedSecurity=  "sa";
builder.Password = "<password>"

string connectionString = builder.ConnectionString;

那么,正常的防火墙入站规则、远程连接设置等工作,对吗?我现在希望能够从位于不同互联网(来自不同位置/城镇..)上的 Windows PC 上建立相同的连接

我有:

  • 为主机 PC 所在的路由器获取固定 IP
  • 修复了 主机PC的本地IP - 192.168.1.22 根据this 链接
  • 在 IP2 下为“SQLEXPRESS 协议 - TCP/IP - IP”设置 IP 地址”到 192.168.1.22
  • 将 SQL Server Windows NT - 64 位添加为 防火墙中允许的应用
  • 在 SQL Server 中启用 TCP/IP 和命名管道 带有开始 - 运行 - CLICONFG.exe 的客户端网络实用程序
  • 设置端口 在路由器上转发:服务端口 22172,IP 地址: 192.168.1.22,内部端口 22172,协议 - TCP,已启用

我已关闭防火墙,但仍然收到错误:“(提供程序:TCP 提供程序,错误 40 - 无法打开与 SQL Server 的连接)

我尝试这些连接字符串选项:

        SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
        builder.DataSource = @"tcp:xxx.xxx.x.xx\SQLEXPRESS, 22172";
        builder.InitialCatalog = "<database>";
        builder.UserID = "sa";
        builder.IntegratedSecurity = false;
        builder.Password = "<password>";

        sqlConnect = builder.ConnectionString;

我也尝试过这些变体:

        builder.DataSource = @"x.xxx.x.xx\SQLEXPRESS, 22172";
        builder.DataSource = @"tcp:xxx.xxx.x.xx, 22172";
        builder.DataSource = @"xxx.xxx.x.xx, 22172";

还有这些连接字符串:

        sqlConnect = @"Data Source = tcp:xxx.xxx.x.xx\SQLEXPRESS,22172; Initial Catalog = <database>; User ID = sa; Password = <password>";
        sqlConnect = @"Data Source = xxx.xxx.x.xx\SQLEXPRESS,22172; Initial Catalog = <database>; User ID = sa; Password = <password>";
        sqlConnect = @"Data Source = tcp:xxx.xxx.x.xx,22172; Initial Catalog = <database>; User ID = sa; Password = <password>";
        sqlConnect = @"Data Source = xxx.xxx.x.xx,22172; Initial Catalog = <database>; User ID = sa; Password = <password>";

为了更好的衡量,这个:

sqlConnect = @"Data Source=xxx.xxx.x.xx\SQLEXPRESS,22172;Initial Catalog=<database>;Persist Security Info=True;User ID=sa;Password=<password>;";

我已经扫描了关于 SO 等的所有相关问题 - 我在某处做错了什么?请帮忙

在主机 PC SQL 上运行select * from sys.tcp_endpoints 时的输出:因此,ip_address 对于两者都是 NULL,port 对于两者都是 0,is_dynamic_port 对于两者都是 1 - 这是相关信息吗?

Dedicated Admin Connection  1   1   2   TCP 2   TSQL    0   STARTED 1   0   1   NULL
TSQL Default TCP            4   1   2   TCP 2   TSQL    0   STARTED 0   0   1   NULL

我已尝试多次将动态端口更改为静态,我已删除配置管理器中的所有 0 或端口号,但仍然为 _is_dynamic_port 获得 1。事件查看器显示:

Server is listening on [ 'any' <ipv4> 22172].

如果我在 SQL 中运行以下命令,同样的消息:

EXEC xp_ReadErrorLog 0, 1, N'Server is listening on', N'any', NULL, NULL, 'DESC'

为什么 SQL 设置保留在动态端口上?

【问题讨论】:

  • 听起来您需要在边缘路由器上进行端口转发。正确的连接字符串是xxx.xxx.x.xx,22172,但如果您从不同的 LAN 连接,则相关的 IP 地址将是边缘路由器的地址。您还可以使用动态 DNS,以避免必须为其获取静态 IP
  • 如前所述,我正在做端口转发。并使用边缘路由器的 IP 地址进行连接
  • select * from sys.tcp_endpoints 的结果是什么?
  • @lptr 请查看相关更新详情
  • ..似乎命名实例正在动态端口上运行。一旦将其设置为固定的 22172 端口..并且您可以使用“192.168.1.22, 22172”(来自 win 或 linux 机器)连接到实例..然后在路由器上进行 port_forwarding 之后..应该可以使用internetIP,22172进行连接。在连接测试期间,您还可以在sql实例的windows主机上短暂禁用防火墙。

标签: c# sql-server tcp


【解决方案1】:

根据你的工作,我想你是在 Win PC 上设置的。 所以,...

  1. Linux 机器呢?是否允许对 192.168.1.22 进行出站连接?
  2. 看看SqlConnectionStringBuilder.IntegratedSecurity。它应该有一个布尔值。 false 如果应该使用用户名和密码进行身份验证 (https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlconnectionstringbuilder.integratedsecurity?view=dotnet-plat-ext-6.0)。
  3. 看看SqlConnectionStringBuilder.UserID。您的两个代码 sn-ps 中都缺少它。但在创建的连接字符串Persist Security Info=True;User ID=sa;Password=&lt;password&gt;; 中提到了作为«用户ID»、«用户»和«uid»。请看这里 (https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlconnectionstringbuilder.userid?view=dotnet-plat-ext-6.0)。

【讨论】:

  • 1.是的,Linux 机器可以连接(出站)连接到主机 windows PC 192.168.1.22。 2. stringbuilder 中包含集成安全性(对于 linux 机器的连接字符串,它等于“sa”,有效)。 3 我添加了userId,还是一样的错误
  • K.处理“外部”问题。那么你的命名实例呢?它的名称是否为“SQLEXPRESS”?它在运行吗?如果它正在运行,则更新管道名称以使其在任何地方都相同。
  • 是的,它是 SQLEXPRESS,正在运行吗?是的,自动启动,并且始终随着 PC 启动而启动。为什么要更新管道名称,如果是,在哪里更新?
  • 获得了您最近关于该主题的更新。是的,不是 22172 端口可能是源问题。默认 MSSQL 端口为 1433。“IPALL 下的 TCP 动态端口”表示“任何动态端口”(未列出确切端口)。在 IPALL 部分中,应该有一个“TCP 端口”行。该行应该让您的 22172 端口仅在指定端口上运行。
  • IPALL 下的 TCP 端口为 22172,还有其他想法吗?我应该选择不同的端口号吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多