SQL Server如何确定外部服务器/客户端的公网IP地址

本文介绍用户的公网IP不固定时,如何定位真实的公网IP地址。

场景一

问题描述

用户的公网IP不固定,使用本地IP查看工具定位到的IP不准确,即使将查询到的本地IP加入了RDS的白名单中,连接RDS的时候也会报错。因此,用户需要查询到准确的客户端IP才能访问RDS。

注意事项

如果您在生产环境中发现本地设备的公网IP地址会变化,建议您改为使用内网连接,或者在白名单中配置合理的公网IP段,确保不会因为IP地址改变而断连。

获取客户端IP

  1. 将IP地址0.0.0.0/0加入RDS实例的白名单中。具体操作,请参见设置白名单

    重要

    0.0.0.0/0表示允许任何IP访问RDS实例,测试完成后请立即修改。

  2. 使用客户端连接RDS SQL Server数据库。具体操作,请参见连接SQL Server实例

  3. 执行如下命令,查询客户端IP。

    SELECT  CONNECTIONPROPERTY('PROTOCOL_TYPE') AS PROTOCOL_TYPE,
            CONNECTIONPROPERTY('CLIENT_NET_ADDRESS') AS CLIENT_NET_ADDRESS

    如下表示已查询成功:

    image.png

  4. 将步骤1在白名单中添加的0.0.0.0/0条目删除,添加上真实的出口IP。

场景二

问题描述

若您需要统计已连接到RDS SQL Server数据库的所有IP,或定位一些安全问题(如链接泄露等),可以使用以下方法获取已连接到数据库的所有IP。

获取所有连接到数据库的IP

  1. 将IP地址0.0.0.0/0加入RDS实例的白名单中。具体操作,请参见设置白名单

    重要

    0.0.0.0/0表示允许任何IP访问RDS实例,测试完成后请立即修改。

  2. 使用客户端连接RDS SQL Server数据库。具体操作,请参见连接SQL Server实例

  3. 执行如下命令,查询所有连接到数据库的IP。

    SELECT
    SP.SPID,
    SP.LOGINAME,
    SP.LOGIN_TIME,
    SP.HOSTNAME,
    SP.PROGRAM_NAME,
    DC.CLIENT_TCP_PORT,
    DC.CLIENT_NET_ADDRESS
    FROM SYS.SYSPROCESSES AS SP
    INNER JOIN SYS.DM_EXEC_CONNECTIONS AS DC
    ON SP.SPID = DC.SESSION_ID
    WHERE SP.SPID > 50
    AND DC.AUTH_SCHEME='SQL'

    如下表示已查询成功:

    image.png

  4. 将在步骤1中添加的0.0.0.0/0或您公司的IP段从白名单中删除。

查看更详细的连接参数配置

在查询到已连接到数据库的所有IP后,若您需要查看单个连接更详细的参数配置,请执行如下命令:

SELECT * FROM SYS.DM_EXEC_SESSIONS WHERE SESSION_ID=<之前获取的SPID>

如下表示已查询成功:

image.png