Tomcat port of mod_remoteip, this valve replaces the apparent client remote IP address and hostname for the request with the IP address list presented by a proxy or a load balancer via a request headers (e.g. "X-Forwarded-For").
Another feature of this valve is to replace the apparent scheme (http/https) and server port with the scheme presented by a proxy or a load balancer via a request header (e.g. "X-Forwarded-Proto").
This valve proceeds as follows:
If the incoming request.getRemoteAddr() matches the valve's list of internal or trusted proxies:
$remoteIpHeader (default value x-forwarded-for). Values are
processed in right-to-left order.$protocolHeader (default value X-Forwarded-Proto)
consists only of forwards that match protocolHeaderHttpsValue configuration parameter (default
https) then request.isSecure = true, request.scheme = https and
request.serverPort = 443. Note that 443 can be overwritten with the $httpsServerPort
configuration parameter.Globals#REQUEST_FORWARDED_ATTRIBUTE and value Boolean.TRUE to
indicate that this request has been forwarded by one or more proxies.| RemoteIpValve property | Description | Equivalent mod_remoteip directive | Format | Default Value |
|---|---|---|---|---|
| remoteIpHeader | Name of the Http Header read by this valve that holds the list of traversed IP addresses starting from the requesting client | RemoteIPHeader | Compliant http header name | x-forwarded-for |
| internalProxies | Regular expression that matches the IP addresses of internal proxies. If they appear in the
remoteIpHeader value, they will be trusted and will not appear in the proxiesHeader
value |
RemoteIPInternalProxy | Regular expression (in the syntax supported by java.) |
10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|
169\.254\.\d{1,3}\.\d{1,3}|127\.\d{1,3}\.\d{1,3}\.\d{1,3}|
100\.6[4-9]{1}\.\d{1,3}\.\d{1,3}|100\.[7-9]{1}\d{1}\.\d{1,3}\.\d{1,3}|
100\.1[0-1]{1}\d{1}\.\d{1,3}\.\d{1,3}|100\.12[0-7]{1}\.\d{1,3}\.\d{1,3}|
172\.1[6-9]{1}\.\d{1,3}\.\d{1,3}|172\.2[0-9]{1}\.\d{1,3}\.\d{1,3}| 172\.3[0-1]{1}\.\d{1,3}\.\d{1,3}|
0:0:0:0:0:0:0:1|::1 By default, 10/8, 192.168/16, 169.254/16, 127/8, 100.64/10, 172.16/12, and ::1 are allowed. |
| proxiesHeader | Name of the http header created by this valve to hold the list of proxies that have been processed in the
incoming remoteIpHeader |
proxiesHeader | Compliant http header name | x-forwarded-by |
| trustedProxies | Regular expression that matches the IP addresses of trusted proxies. If they appear in the
remoteIpHeader value, they will be trusted and will appear in the proxiesHeader value |
RemoteIPTrustedProxy | Regular expression (in the syntax supported by java.) |
|
| protocolHeader | Name of the http header read by this valve that holds the flag that this request | N/A | Compliant http header name like X-Forwarded-Proto, X-Forwarded-Ssl or
Front-End-Https |
X-Forwarded-Proto |
| protocolHeaderHttpsValue | Value of the protocolHeader to indicate that it is an Https request |
N/A | String like https or ON |
https |
| httpServerPort | Value returned by jakarta. when the protocolHeader
indicates http protocol |
N/A | integer | 80 |
| httpsServerPort | Value returned by jakarta. when the protocolHeader
indicates https protocol |
N/A | integer | 443 |
This Valve may be attached to any Container, depending on the granularity of the filtering you wish to perform.
Regular expression vs. IP address blocks: mod_remoteip allows to use address blocks
(e.g. 192.168/16) to configure RemoteIPInternalProxy and RemoteIPTrustedProxy
; as Tomcat doesn't have a library similar to apr_ipsubnet_test,
RemoteIpValve uses regular expression to configure internalProxies and
trustedProxies in the same fashion as RequestFilterValve does.
Sample with internal proxies
RemoteIpValve configuration:
<Valve
className="org.apache.catalina.valves.RemoteIpValve"
internalProxies="192\.168\.0\.10|192\.168\.0\.11"
remoteIpHeader="x-forwarded-for"
proxiesHeader="x-forwarded-by"
protocolHeader="x-forwarded-proto"
/>
| property | Value Before RemoteIpValve | Value After RemoteIpValve |
|---|---|---|
| request.remoteAddr | 192.168.0.10 | 140.211.11.130 |
| request.header['x-forwarded-for'] | 140.211.11.130, 192.168.0.10 | null |
| request.header['x-forwarded-by'] | null | null |
| request.header['x-forwarded-proto'] | https | https |
| request.scheme | http | https |
| request.secure | false | true |
| request.serverPort | 80 | 443 |
Note : x-forwarded-by header is null because only internal proxies as been traversed by the request.
x-forwarded-by is null because all the proxies are trusted or internal.
Sample with trusted proxies
RemoteIpValve configuration:
<Valve
className="org.apache.catalina.valves.RemoteIpValve"
internalProxies="192\.168\.0\.10|192\.168\.0\.11"
remoteIpHeader="x-forwarded-for"
proxiesHeader="x-forwarded-by"
trustedProxies="proxy1|proxy2"
/>
| property | Value Before RemoteIpValve | Value After RemoteIpValve |
|---|---|---|
| request.remoteAddr | 192.168.0.10 | 140.211.11.130 |
| request.header['x-forwarded-for'] | 140.211.11.130, proxy1, proxy2 | null |
| request.header['x-forwarded-by'] | null | proxy1, proxy2 |
Note : proxy1 and proxy2 are both trusted proxies that come in x-forwarded-for
header, they both are migrated in x-forwarded-by header. x-forwarded-by is null because all
the proxies are trusted or internal.
Sample with internal and trusted proxies
RemoteIpValve configuration:
<Valve
className="org.apache.catalina.valves.RemoteIpValve"
internalProxies="192\.168\.0\.10|192\.168\.0\.11"
remoteIpHeader="x-forwarded-for"
proxiesHeader="x-forwarded-by"
trustedProxies="proxy1|proxy2"
/>
| property | Value Before RemoteIpValve | Value After RemoteIpValve |
|---|---|---|
| request.remoteAddr | 192.168.0.10 | 140.211.11.130 |
| request.header['x-forwarded-for'] | 140.211.11.130, proxy1, proxy2, 192.168.0.10 | null |
| request.header['x-forwarded-by'] | null | proxy1, proxy2 |
Note : proxy1 and proxy2 are both trusted proxies that come in x-forwarded-for
header, they both are migrated in x-forwarded-by header. As 192.168.0.10 is an internal
proxy, it does not appear in x-forwarded-by. x-forwarded-by is null because all the proxies
are trusted or internal.
Sample with an untrusted proxy
RemoteIpValve configuration:
<Valve
className="org.apache.catalina.valves.RemoteIpValve"
internalProxies="192\.168\.0\.10|192\.168\.0\.11"
remoteIpHeader="x-forwarded-for"
proxiesHeader="x-forwarded-by"
trustedProxies="proxy1|proxy2"
/>
| property | Value Before RemoteIpValve | Value After RemoteIpValve |
|---|---|---|
| request.remoteAddr | 192.168.0.10 | untrusted-proxy |
| request.header['x-forwarded-for'] | 140.211.11.130, untrusted-proxy, proxy1 | 140.211.11.130 |
| request.header['x-forwarded-by'] | null | proxy1 |
Note : x-forwarded-by holds the trusted proxy proxy1. x-forwarded-by holds
140.211.11.130 because untrusted-proxy is not trusted and thus, we cannot trust that
untrusted-proxy is the actual remote ip. request.remoteAddr is untrusted-proxy
that is an IP verified by proxy1.
| Modifier and Type | Field and Description |
|---|---|
| private boolean | |
| private boolean | |
| private static final Pattern | commaSeparatedValuesPattern
|
| private String | |
| private int | |
| private int | |
| private Pattern | |
| private static final Log | log
Logger
|
| private String | |
| private String | |
| private String | |
| private String | |
| private String | |
| private boolean | |
| private Pattern |
| Access | Constructor and Description |
|---|---|
| public |
| Modifier and Type | Method and Description |
|---|---|
| protected static String[] | Returns: array of String (nonnull)The string to convert commaDelimitedStrings)Convert a given comma delimited String into an array of String |
| public String | Returns: The HTTP header nameObtain the name of the HTTP header used to override the value returned by |
| public int | |
| public int | |
| public String | |
| public String | Returns: The HTTP header nameObtain the name of the HTTP header used to override the value returned by |
| public String | |
| public String | Returns: the value of the protocol header for incoming https request (e.g. "https")
|
| public String | |
| public String | |
| public boolean | |
| public String | |
| public void | invoke(Request
The servlet request to be processed request, Response The servlet response to be created response)Implements org. Perform request processing as required by this Valve. |
| public boolean | |
| public boolean | |
| private boolean | |
| public void | |
| public void | |
| public void | setHostHeader(String
The HTTP header name hostHeader)Set the name of the HTTP header used to override the value returned by |
| public void | setHttpServerPort(int
The server port httpServerPort)
Server Port value if the Default value : 80 |
| public void | setHttpsServerPort(int
The server port httpsServerPort)
Server Port value if the Default value : 443 |
| public void | setInternalProxies(String
The proxy regular expression internalProxies)Regular expression that defines the internal proxies. |
| public void | setPortHeader(String
The HTTP header name portHeader)Set the name of the HTTP header used to override the value returned by |
| private void | |
| public void | setProtocolHeader(String
The header name protocolHeader)
Header that holds the incoming protocol, usually named |
| public void | setProtocolHeaderHttpsValue(String
The header name protocolHeaderHttpsValue)Case insensitive value of the protocol header to indicate that the incoming http request uses SSL. |
| public void | setProxiesHeader(String
The header name proxiesHeader)The proxiesHeader directive specifies a header into which mod_remoteip will collect a list of all of the intermediate client IP addresses trusted to resolve the actual remote IP. |
| public void | setRemoteIpHeader(String
The header name remoteIpHeader)Name of the http header from which the remote ip is extracted. |
| public void | setRequestAttributesEnabled(boolean
true causes the attributes to be set, false disables
the setting of the attributes.Should this valve set request attributes for IP address, Hostname, protocol and port used for the request? |
| public void | setTrustedProxies(String
The regular expression trustedProxies)
Regular expression defining proxies that are trusted when they appear in the |
| changeLocalName | back to summary |
|---|---|
| private boolean changeLocalName | |
| changeLocalPort | back to summary |
|---|---|
| private boolean changeLocalPort | |
| commaSeparatedValuesPattern | back to summary |
|---|---|
| private static final Pattern commaSeparatedValuesPattern
| |
| hostHeader | back to summary |
|---|---|
| private String hostHeader | |
| httpServerPort | back to summary |
|---|---|
private int httpServerPort
| |
| httpsServerPort | back to summary |
|---|---|
private int httpsServerPort
| |
| internalProxies | back to summary |
|---|---|
private Pattern internalProxies
| |
| log | back to summary |
|---|---|
| private static final Log log Hides org. Logger | |
| portHeader | back to summary |
|---|---|
| private String portHeader | |
| protocolHeader | back to summary |
|---|---|
private String protocolHeader
| |
| protocolHeaderHttpsValue | back to summary |
|---|---|
private String protocolHeaderHttpsValue
| |
| proxiesHeader | back to summary |
|---|---|
private String proxiesHeader
| |
| remoteIpHeader | back to summary |
|---|---|
private String remoteIpHeader
| |
| requestAttributesEnabled | back to summary |
|---|---|
private boolean requestAttributesEnabled
| |
| trustedProxies | back to summary |
|---|---|
| private Pattern trustedProxies | |
| RemoteIpValve | back to summary |
|---|---|
| public RemoteIpValve() Default constructor that ensures | |
| commaDelimitedListToStringArray | back to summary |
|---|---|
| protected static String[] commaDelimitedListToStringArray(String commaDelimitedStrings) Convert a given comma delimited String into an array of String | |
| getHostHeader | back to summary |
|---|---|
| public String getHostHeader() Obtain the name of the HTTP header used to override the value returned by
| |
| getHttpServerPort | back to summary |
|---|---|
| public int getHttpServerPort() | |
| getHttpsServerPort | back to summary |
|---|---|
| public int getHttpsServerPort() | |
| getInternalProxies | back to summary |
|---|---|
public String getInternalProxies()
| |
| getPortHeader | back to summary |
|---|---|
| public String getPortHeader() Obtain the name of the HTTP header used to override the value returned by
| |
| getProtocolHeader | back to summary |
|---|---|
public String getProtocolHeader()
| |
| getProtocolHeaderHttpsValue | back to summary |
|---|---|
public String getProtocolHeaderHttpsValue()
| |
| getProxiesHeader | back to summary |
|---|---|
public String getProxiesHeader()
| |
| getRemoteIpHeader | back to summary |
|---|---|
public String getRemoteIpHeader()
| |
| getRequestAttributesEnabled | back to summary |
|---|---|
public boolean getRequestAttributesEnabled()
| |
| getTrustedProxies | back to summary |
|---|---|
public String getTrustedProxies()
| |
| invoke | back to summary |
|---|---|
| public void invoke(Request request, Response response) throws IOException, ServletException Implements org. Doc from org. Perform request processing as required by this Valve. An individual Valve MAY perform the following actions, in the specified order:
A Valve MUST NOT do any of the following things:
| |
| isChangeLocalName | back to summary |
|---|---|
| public boolean isChangeLocalName() | |
| isChangeLocalPort | back to summary |
|---|---|
| public boolean isChangeLocalPort() | |
| isForwardedProtoHeaderValueSecure | back to summary |
|---|---|
| private boolean isForwardedProtoHeaderValueSecure(String protocolHeaderValue) | |
| setChangeLocalName | back to summary |
|---|---|
| public void setChangeLocalName(boolean changeLocalName) | |
| setChangeLocalPort | back to summary |
|---|---|
| public void setChangeLocalPort(boolean changeLocalPort) | |
| setHostHeader | back to summary |
|---|---|
| public void setHostHeader(String hostHeader) Set the name of the HTTP header used to override the value returned by
| |
| setHttpServerPort | back to summary |
|---|---|
| public void setHttpServerPort(int httpServerPort)
Server Port value if the Default value : 80
| |
| setHttpsServerPort | back to summary |
|---|---|
| public void setHttpsServerPort(int httpsServerPort)
Server Port value if the Default value : 443
| |
| setInternalProxies | back to summary |
|---|---|
| public void setInternalProxies(String internalProxies) Regular expression that defines the internal proxies. Default value : 10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|169\.254.\d{1,3}.\d{1,3}|127\.\d{1,3}\.\d{1,3}\.\d{1,3}|0:0:0:0:0:0:0:1
| |
| setPortHeader | back to summary |
|---|---|
| public void setPortHeader(String portHeader) Set the name of the HTTP header used to override the value returned by
| |
| setPorts | back to summary |
|---|---|
| private void setPorts(Request request, int defaultPort) | |
| setProtocolHeader | back to summary |
|---|---|
| public void setProtocolHeader(String protocolHeader)
Header that holds the incoming protocol, usually named
Default value :
| |
| setProtocolHeaderHttpsValue | back to summary |
|---|---|
| public void setProtocolHeaderHttpsValue(String protocolHeaderHttpsValue) Case insensitive value of the protocol header to indicate that the incoming http request uses SSL.
Default value :
| |
| setProxiesHeader | back to summary |
|---|---|
| public void setProxiesHeader(String proxiesHeader) The proxiesHeader directive specifies a header into which mod_remoteip will collect a list of all of the intermediate client IP addresses trusted to resolve the actual remote IP. Note that intermediate RemoteIPTrustedProxy addresses are recorded in this header, while any intermediate RemoteIPInternalProxy addresses are discarded. Name of the http header that holds the list of trusted proxies that has been traversed by the http request. The value of this header can be comma delimited.
Default value :
| |
| setRemoteIpHeader | back to summary |
|---|---|
| public void setRemoteIpHeader(String remoteIpHeader) Name of the http header from which the remote ip is extracted. The value of this header can be comma delimited.
Default value :
| |
| setRequestAttributesEnabled | back to summary |
|---|---|
| public void setRequestAttributesEnabled(boolean requestAttributesEnabled) Should this valve set request attributes for IP address, Hostname, protocol and port used for the request? This
are typically used in conjunction with the
| |
| setTrustedProxies | back to summary |
|---|---|
| public void setTrustedProxies(String trustedProxies)
Regular expression defining proxies that are trusted when they appear in the Default value : empty list, no external proxy is trusted.
| |