Назад | Перейти на главную страницу

IIS видит все подключения как локальные при запуске Citrix Secure Gateway на одном устройстве.

У нас установлен Citrix Secure Gateway на сервере Windows Server 2008 R2, а страница входа Citrix размещена в IIS на том же сервере. CSG обрабатывает входящие HTTP- и HTTPS-соединения на портах 80 и 443 и ретранслирует их в IIS, который прослушивает другой порт (используя только HTTP, а не HTTPS). Это означает, что IIS видит все входящие подключения как локальные, причем исходный IP-адрес является собственным IP-адресом сервера.

Это вызывает пару проблем. Это делает невозможным просмотр исходного IP-адреса в журналах IIS и заставляет IIS отображать подробные сообщения об ошибках HTTP для всех клиентов, включая внешние.

Мы можем смягчить вторую проблему, отключив подробные сообщения об ошибках, но идеальным решением было бы, чтобы IIS видел фактический исходный IP-адрес, а не собственный адрес сервера. Возможно ли это, и если да, то как?

Предполагая, что вы используете хотя бы 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();
        }
    }