Тема: Haproxy и перенаправление Client-IP на конечный сервер

В CivetWeb

CivetWeb не поддерживает никакой модификации логов, так что надо использовать то что он умеет принимать и что можно подменить

civetweb.c

...
    ri = &conn->request_info;
    sockaddr_to_string(src_addr, sizeof(src_addr), &conn->client.rsa);
    referer = header_val(conn, "Referer");
    user_agent = header_val(conn, "User-Agent");
    snprintf(buf, sizeof(buf), "%s - %s [%s] \"%s %s HTTP/%s\" %d %" INT64_FMT " %s %s",
            src_addr, ri->remote_user == NULL ? "-" : ri->remote_user, date,
            ri->request_method ? ri->request_method : "-",
            ri->uri ? ri->uri : "-", ri->http_version,
            conn->status_code, conn->num_bytes_sent,
            referer, user_agent);
    if (conn->ctx->callbacks.log_access) {
        conn->ctx->callbacks.log_access(conn, buf);
    }
...

Так происходит замена дефолтного X-Forwarded-For header на Referer в конфиге haproxy

backend civetweb
  mode http
...
  option forwardfor header Referer
...

Результат

2017-03-29 15:03:08.394055 7fa74e2fa700  1 civetweb: 0x7fa92c06d3b0: 10.8.64.82 - - [29/Mar/2017:15:03:08 +0200] "GET /test HTTP/1.1" 404 0 172.24.52.186 curl/7.43.0
10.8.64.82 - Proxy IP
172.24.52.186 - Client IP
curl/7.43.0 - UserAgent

В Nginx

Он уже по умолчанию все принимает, надо только направить

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"'

Достаточно добавить только "option forwardfor" в конфиг haproxy

backend nginx
  mode http
...
  option forwardfor
...

Результат

10.8.64.82 - - [29/Mar/2017:15:36:25 +0200] "GET /test HTTP/1.1" 404 3650 "-" "curl/7.43.0" "172.24.52.186"
10.8.64.82 - Proxy IP
172.24.52.186 - Client IP
curl/7.43.0 - UserAgent

В Apache

Haproxy настраиваем как и для nginx'a

backend apache
  mode http
...
  option forwardfor
...

Делаем другой формат лога, или меняем стандартный

LogFormat "%h %{X-Forwarded-For}i %l %u %t \"%r\" %>s %b" proxyip
CustomLog "/var/log/httpd/000-default-ssl-false_access.log" proxyip

Результат

10.8.64.82 172.24.52.186 - - [29/Mar/2017:15:24:03 +0200] "GET /test HTTP/1.1" 401 381
10.8.64.82 - Proxy IP
172.24.52.186 - Client IP