我想从我的 WSL 2 Debian 系统连接到 SQL Server 实例。这是因为我想用 Python 开发一个 cossplatform 应用程序并进行一些测试。
WSL 1
据我所知,在 WSL 1 中,我只有一个适配器在主机和 WSL 之间共享,因此我只需写入本地地址即可连接到主机端口中的某个东西。例如,要连接在主机中运行的 Jupyter Lab 服务器,我可以直接执行此操作而无需打开任何端口,而且它工作正常
wget http://localhost:8888/lab/tree/example_notebook.ipynb
WSL 2 + Jupyter + 防火墙规则
WSL 2 有一个未决问题开发人员声称将 WSL2 连接设为“私人”而不是“公共”,并使防火墙规则以安全的方式工作。
为了使我的 Debian WSL 2 系统和 Windows 主机系统上的 Jupyter 之间的连接正常工作,我必须在防火墙中添加一条“入站规则”
- 协议:TCP
- 端口:8888
- 公共网络
- 允许的 IP 地址:[我的 WSL 2 Debian 系统 IP 地址] 在这种情况下,整个子网将是:172.22.160.0/20
如果我对 Windows 适配器进行 ping 操作,则一切正常。我还可以使用 nmap 检查端口是否正确打开
$ nmap -p 8888 172.22.160.1 -Pn
Starting Nmap 7.80 ( https://nmap.org ) at 2022-09-22 14:40 CEST
Nmap scan report for [PC-NAME] (172.22.160.1)
Host is up (0.00040s latency).
PORT STATE SERVICE
8888/tcp open sun-answerbook
但是我尝试像在 WSL1 系统中那样下载笔记本,它不起作用 :/
wget http://172.22.160.1:8888/lab/tree/example_notebook.ipynb
我也尝试过禁用防火墙,但结果还是一样。
有办法吗?我尝试了 GH 线程中提到的其他方法,但没有找到解决方案。
WSL 2 + SQL Server + 防火墙规则
SQL Server 在我的 Windows 主机上的 cmd 中运行良好,以下命令:
sqlcmd -S [PC-NAME]\SQLEXPRESS -U user_name -P password -d db_name
但是在我的 WSL2 Debian 系统中,我甚至无法 ping 该实例,因为端口始终被“过滤”,即使我禁用防火墙,也会收到此信息:
$ nmap -p 1433 172.22.160.1 -Pn
Starting Nmap 7.80 ( https://nmap.org ) at 2022-09-22 15:19 CEST
Nmap scan report for APD-PC (172.22.160.1)
Host is up.
PORT STATE SERVICE
1433/tcp filtered ms-sql-s
我的 SQL Server 实例正在监听远程连接。
我不知道为什么这个端口与我可以毫无问题地打开的 8888 不同。
SQL 服务器
cmd
我的 SQL Server 实例正在运行。我可以在控制台中使用此命令连接到我的 Windows 主机:
sqlcmd -S 172.22.160.1\SQLEXPRESS -U username -P password -d database_name
它在本地运行良好,我可以毫无问题地运行一些查询。但如果我从我的 WSL2 Debian 系统尝试,它不起作用即使没有禁用防火墙。主要原因是没有真正的联系。我不知道是否需要
sqlcmd -S PCNAME\SQLEXPRESS -U username -P password -d database_name
我尝试过
- 禁用我安装的 Windows 防火墙和 VPN 软件。令人惊讶的是,禁用防火墙会将某些端口的状态从已过滤变为已关闭,而不是打开,即使 Jupyter 正在这些端口中运行。端口 8888 可以按预期工作,但其他端口(如 80 或 8081)即使没有防火墙也保持关闭状态。
- 添加正确的防火墙规则对不同端口的作用不同。我没有发现任何规律,它有点随机。
- 我有启用 TCP/IP 协议在 SQL Server 配置管理器中我尝试了几种配置。
- 我启用了防火墙设置名称是虚拟机监控
- 还有另一个开放的GH 问题请求相同的访问权限