在同一台机器上运行 Citrix Secure Gateway 时,IIS 将所有连接视为本地连接

在同一台机器上运行 Citrix Secure Gateway 时,IIS 将所有连接视为本地连接

我们在 Windows Server 2008 R2 服务器上安装了 Citrix Secure Gateway,Citrix 登录页面托管在同一台服务器上的 IIS 中。CSG 处理端口 80 和 443 上的传入 HTTP 和 HTTPS 连接,并将它们中继到 IIS,后者正在侦听另一个端口(仅使用 HTTP,不使用 HTTPS)。这意味着 IIS 将所有传入连接视为本地连接,源 IP 地址是服务器自己的 IP 地址。

这会导致几个问题。它使得无法在 IIS 日志中看到源 IP 地址,并导致 IIS 向所有客户端(包括外部客户端)显示详细的 HTTP 错误消息。

我们可以通过关闭详细的错误消息来缓解第二个问题,但理想的解决方案是让 IIS 查看实际的源 IP 地址,而不是服务器自己的地址。这可能吗?如果可以,怎么做?

答案1

假设你至少运行的是 Web Interface 5.x,你可以配置它来查看通过网关连接的客户端的真实 IP 地址

找到以下部分$SITEROOT/Citrix/XenApp/app_code/PagesJava/com/citrix/wi/pageutils/Include.java

/**
     * Returns the IP address of the client
     *
     * @return the client IP address as a string
     */
    public static String getClientAddress(WIContext wiContext) {       
    String ageClientAddress = AGEUtilities.getAGEClientIPAddress(wiContext);       
    return (ageClientAddress != null
                    ? ageClientAddress                   
: wiContext.getWebAbstraction().getUserHostAddress());
    }

用以下内容替换整个部分:

/**
     * Returns the IP address of the client.
     *
     * @return the client IP address as a string
     */
    public static String getClientAddress(WIContext wiContext) {
        WebAbstraction web = wiContext.getWebAbstraction();
        String gatewayAddress = "127.0.0.1"; // change as appropriate if Gateway is on another server
        boolean comingFromGateway = web.getUserHostAddress().equals(gatewayAddress);
        String forwardedAddress = web.getRequestHeader("X-Forwarded-For");
        String ageClientAddress = AGEUtilities.getAGEClientIPAddress(wiContext);
        if (ageClientAddress != null) {
            return ageClientAddress;
        } else if (comingFromGateway && (forwardedAddress != null)) {
            return forwardedAddress;
        } else {
            return web.getUserHostAddress();
        }
    }    

相关内容