Тема: 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