When accept-proxy or accept-netscaler-cip are being used, this gives the ability to log upstream proxy source IP and port. --- doc/configuration.txt | 4 ++++ include/types/log.h | 4 ++++ src/log.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+)
diff --git a/doc/configuration.txt b/doc/configuration.txt index a8036abf9f22..6d92a4530749 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -15328,6 +15328,10 @@ Please refer to the table below for currently defined variables : | | %bq | backend_queue | numeric | | | %ci | client_ip (accepted address) | IP | | | %cp | client_port (accepted address) | numeric | + | | %psi | proxy_source_ip | IP | + | | %psp | proxy_source_port | numeric | + | | %pdi | proxy_destination_ip | IP | + | | %pdp | proxy_destination_port | numeric | | | %f | frontend_name | string | | | %fc | feconn (frontend concurrent connections) | numeric | | | %fi | frontend_ip (accepting address) | IP | diff --git a/include/types/log.h b/include/types/log.h index 0fdb77577103..4ca9197b8ba6 100644 --- a/include/types/log.h +++ b/include/types/log.h @@ -55,6 +55,10 @@ enum { LOG_FMT_GLOBAL, LOG_FMT_CLIENTIP, LOG_FMT_CLIENTPORT, + LOG_FMT_PROXY_SRC_IP, + LOG_FMT_PROXY_SRC_PORT, + LOG_FMT_PROXY_DST_IP, + LOG_FMT_PROXY_DST_PORT, LOG_FMT_BACKENDIP, LOG_FMT_BACKENDPORT, LOG_FMT_FRONTENDIP, diff --git a/src/log.c b/src/log.c index 12329888130e..5d21a12926ff 100644 --- a/src/log.c +++ b/src/log.c @@ -145,6 +145,10 @@ static const struct logformat_type logformat_keywords[] = { { "bq", LOG_FMT_BCKQUEUE, PR_MODE_TCP, LW_BYTES, NULL }, /* backend_queue */ { "ci", LOG_FMT_CLIENTIP, PR_MODE_TCP, LW_CLIP, NULL }, /* client ip */ { "cp", LOG_FMT_CLIENTPORT, PR_MODE_TCP, LW_CLIP, NULL }, /* client port */ + { "psi", LOG_FMT_PROXY_SRC_IP, PR_MODE_TCP, LW_CLIP, NULL }, /* proxy source ip */ + { "psp", LOG_FMT_PROXY_SRC_PORT, PR_MODE_TCP, LW_CLIP, NULL }, /* proxy source port */ + { "pdi", LOG_FMT_PROXY_DST_IP, PR_MODE_TCP, LW_CLIP, NULL }, /* proxy destination ip */ + { "pdp", LOG_FMT_PROXY_DST_PORT, PR_MODE_TCP, LW_CLIP, NULL }, /* proxy destination port */ { "f", LOG_FMT_FRONTEND, PR_MODE_TCP, LW_INIT, NULL }, /* frontend */ { "fc", LOG_FMT_FECONN, PR_MODE_TCP, LW_BYTES, NULL }, /* feconn */ { "fi", LOG_FMT_FRONTENDIP, PR_MODE_TCP, LW_FRTIP, NULL }, /* frontend ip */ @@ -1399,6 +1403,68 @@ int build_logline(struct stream *s, char *dst, size_t maxsize, struct list *list last_isspace = 0; break; + case LOG_FMT_PROXY_SRC_IP: // %psi + conn = objt_conn(sess->origin); + if (conn) + ret = lf_ip(tmplog, (struct sockaddr *)&conn->proxy_addr.from, dst + maxsize - tmplog, tmp); + else + ret = lf_text_len(tmplog, NULL, 0, dst + maxsize - tmplog, tmp); + if (ret == NULL) + goto out; + tmplog = ret; + last_isspace = 0; + break; + + case LOG_FMT_PROXY_SRC_PORT: // %psp + conn = objt_conn(sess->origin); + if (conn) { + if (conn->proxy_addr.from.ss_family == AF_UNIX) { + ret = ltoa_o(sess->listener->luid, tmplog, dst + maxsize - tmplog); + } else { + ret = lf_port(tmplog, (struct sockaddr *)&conn->proxy_addr.from, + dst + maxsize - tmplog, tmp); + } + } + else + ret = lf_text_len(tmplog, NULL, 0, dst + maxsize - tmplog, tmp); + + if (ret == NULL) + goto out; + tmplog = ret; + last_isspace = 0; + break; + + case LOG_FMT_PROXY_DST_IP: // %pdi + conn = objt_conn(sess->origin); + if (conn) + ret = lf_ip(tmplog, (struct sockaddr *)&conn->proxy_addr.to, dst + maxsize - tmplog, tmp); + else + ret = lf_text_len(tmplog, NULL, 0, dst + maxsize - tmplog, tmp); + if (ret == NULL) + goto out; + tmplog = ret; + last_isspace = 0; + break; + + case LOG_FMT_PROXY_DST_PORT: // %pdp + conn = objt_conn(sess->origin); + if (conn) { + if (conn->proxy_addr.to.ss_family == AF_UNIX) { + ret = ltoa_o(sess->listener->luid, tmplog, dst + maxsize - tmplog); + } else { + ret = lf_port(tmplog, (struct sockaddr *)&conn->proxy_addr.to, + dst + maxsize - tmplog, tmp); + } + } + else + ret = lf_text_len(tmplog, NULL, 0, dst + maxsize - tmplog, tmp); + + if (ret == NULL) + goto out; + tmplog = ret; + last_isspace = 0; + break; + case LOG_FMT_FRONTENDIP: // %fi conn = objt_conn(sess->origin); if (conn) {