从虚拟机访问主机网络上的 SQL 服务器
Accessing a SQL Server on host's network from a virtual machine
我的公司有一个设置,其中有一个 Microsoft SQL 服务器可以在我们的本地网络(无法访问互联网)上访问,我可以从我的普通工作站访问它(运行 Windows 10).我在这个工作站上安装了一个 Ubuntu 虚拟机和 Virtualbox,这个虚拟机作为我的主要开发平台。我想
- 能够从具有 python
的访客访问 SQL 服务器
- 理想情况下,我还想对 SQL 服务器使用主机的 Windows 身份验证,尽管这是可选的
我该如何设置?我无法控制 SQL 服务器(但我可能可以甜言蜜语地说服工程师进行一些小改动),但我可以控制主机并完全控制来宾。虚拟网络应该是 NAT 还是桥接?
有关 VMware 上 NAT 和桥接网络之间的差异,请参阅 this question。对于 Virtualbox,它们应该是相同的。
基本上,桥接网络对网络运行方式的限制比 NAT 少。因此,如果您可以从主机访问 SQL 服务器,您将可以从具有桥接网络的访客那里获得相同的访问权限。
回答我自己的问题以防其他人遇到同样的问题。以下是在 Windows 主机上的 NAT 配置中使用 Ubuntu 客户端进行测试的。我强烈建议在 Linux 客户端和 Windows 主机上使用相同的用户名。
我按照这个出色的指南找到了大部分解决方案:http://www.easysoft.com/products/data_access/odbc-sql-server-driver/kerberos.html。
您可以通过查找本地 DNS 服务器 nmcli dev show | grep DNS
(对我有用)找到密钥分发中心 (KDC),否则请咨询您当地的 IT 部门。
在 Windows 主机上 - 应该可以访问 SQL 服务器 - 您可以通过在 Windows 中输入 setspn -L
来列出服务器主体名称 (SPN)命令提示符。
我使用了 Microsoft 自己的 ODBC 驱动程序而不是 EasySoft 驱动程序:https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server。确保还安装了 unixODBC。
请记住,在 /etc/krb5.conf.
中配置 kerberos 时,域应该全部大写(出于我不完全理解的原因)
关于 为 Kerberos 身份验证配置 SQL 服务器 ODBC 数据源 部分,您可以使用在添加的 /etc/odbcinst.ini 中指定的驱动程序名称安装 Microsoft ODBC 驱动程序时。我的 odbcinst.ini 看起来像这样
[ODBC Driver 13 for SQL Server]
Description=Microsoft ODBC Driver 13 for SQL Server
Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.1
UsageCount=1
所以 /etc/odbc.ini 应该是这样的(请参阅 Easysoft 指南了解 windowsmachine
和 spn
的含义)
[mssql-kerberos-dsn]
Driver = ODBC Driver 13 for SQL Server
Server = windowsmachine
ServerSPN = spn
Trusted_Connnection = yes
注意附加行 Trusted_Connnection
。这使得数据源使用起来稍微方便一些。
在测试设置之前,您必须 运行 kinit
并按照 Easysoft 指南中的说明使用您的 Active Directory 凭据登录。然后您可以使用 `
测试连接
sqlcmd -D -S mssql-kerberos-dsn
如果您安装了 sqlcmd(参见 https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools)。
此外,您可以通过 运行ning
测试它是否适用于 pyodbc
import pyodbc
print(pyodbc.connect('DSN=mssql-kerberos-dsn'))
来自 python 终端。
对我来说,更简洁的方法是安装 ubuntu 作为主机并使用 docker 来托管您的 SQL 服务器。另外,寻找如何加入 ubuntu 到 windows AD。它将帮助您配置用户。
我的公司有一个设置,其中有一个 Microsoft SQL 服务器可以在我们的本地网络(无法访问互联网)上访问,我可以从我的普通工作站访问它(运行 Windows 10).我在这个工作站上安装了一个 Ubuntu 虚拟机和 Virtualbox,这个虚拟机作为我的主要开发平台。我想
- 能够从具有 python 的访客访问 SQL 服务器
- 理想情况下,我还想对 SQL 服务器使用主机的 Windows 身份验证,尽管这是可选的
我该如何设置?我无法控制 SQL 服务器(但我可能可以甜言蜜语地说服工程师进行一些小改动),但我可以控制主机并完全控制来宾。虚拟网络应该是 NAT 还是桥接?
有关 VMware 上 NAT 和桥接网络之间的差异,请参阅 this question。对于 Virtualbox,它们应该是相同的。
基本上,桥接网络对网络运行方式的限制比 NAT 少。因此,如果您可以从主机访问 SQL 服务器,您将可以从具有桥接网络的访客那里获得相同的访问权限。
回答我自己的问题以防其他人遇到同样的问题。以下是在 Windows 主机上的 NAT 配置中使用 Ubuntu 客户端进行测试的。我强烈建议在 Linux 客户端和 Windows 主机上使用相同的用户名。
我按照这个出色的指南找到了大部分解决方案:http://www.easysoft.com/products/data_access/odbc-sql-server-driver/kerberos.html。
您可以通过查找本地 DNS 服务器 nmcli dev show | grep DNS
(对我有用)找到密钥分发中心 (KDC),否则请咨询您当地的 IT 部门。
在 Windows 主机上 - 应该可以访问 SQL 服务器 - 您可以通过在 Windows 中输入 setspn -L
来列出服务器主体名称 (SPN)命令提示符。
我使用了 Microsoft 自己的 ODBC 驱动程序而不是 EasySoft 驱动程序:https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server。确保还安装了 unixODBC。
请记住,在 /etc/krb5.conf.
中配置 kerberos 时,域应该全部大写(出于我不完全理解的原因)关于 为 Kerberos 身份验证配置 SQL 服务器 ODBC 数据源 部分,您可以使用在添加的 /etc/odbcinst.ini 中指定的驱动程序名称安装 Microsoft ODBC 驱动程序时。我的 odbcinst.ini 看起来像这样
[ODBC Driver 13 for SQL Server]
Description=Microsoft ODBC Driver 13 for SQL Server
Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.1
UsageCount=1
所以 /etc/odbc.ini 应该是这样的(请参阅 Easysoft 指南了解 windowsmachine
和 spn
的含义)
[mssql-kerberos-dsn]
Driver = ODBC Driver 13 for SQL Server
Server = windowsmachine
ServerSPN = spn
Trusted_Connnection = yes
注意附加行 Trusted_Connnection
。这使得数据源使用起来稍微方便一些。
在测试设置之前,您必须 运行 kinit
并按照 Easysoft 指南中的说明使用您的 Active Directory 凭据登录。然后您可以使用 `
sqlcmd -D -S mssql-kerberos-dsn
如果您安装了 sqlcmd(参见 https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools)。
此外,您可以通过 运行ning
测试它是否适用于 pyodbcimport pyodbc
print(pyodbc.connect('DSN=mssql-kerberos-dsn'))
来自 python 终端。
对我来说,更简洁的方法是安装 ubuntu 作为主机并使用 docker 来托管您的 SQL 服务器。另外,寻找如何加入 ubuntu 到 windows AD。它将帮助您配置用户。