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) {