[[ip-filtering]]
== Restricting Connections with IP Filtering

You can apply IP filtering to application clients, node clients, or transport
clients, in addition to other nodes that are attempting to join the cluster.

If a node's IP address is on the blacklist, {security} will still allow the
connection to Elasticsearch, but it will be dropped immediately, and no requests
will be processed.

NOTE: Elasticsearch installations are not designed to be publicly accessible
      over the Internet. IP Filtering and the other security capabilities of
      {security} do not change this condition.

[float]
=== Enabling IP filtering

{security} features an access control feature that allows or rejects hosts,
domains, or subnets.

You configure IP filtering by specifying the `xpack.security.transport.filter.allow` and
`xpack.security.transport.filter.deny` settings in in `elasticsearch.yml`. Allow rules
take precedence over the deny rules.

[source,yaml]
--------------------------------------------------
xpack.security.transport.filter.allow: "192.168.0.1"
xpack.security.transport.filter.deny: "192.168.0.0/24"
--------------------------------------------------

The `_all` keyword can be used to deny all connections that are not explicitly
allowed.

[source,yaml]
--------------------------------------------------
xpack.security.transport.filter.allow: [ "192.168.0.1", "192.168.0.2", "192.168.0.3", "192.168.0.4" ]
xpack.security.transport.filter.deny: _all
--------------------------------------------------

IP filtering configuration also support IPv6 addresses.

[source,yaml]
--------------------------------------------------
xpack.security.transport.filter.allow: "2001:0db8:1234::/48"
xpack.security.transport.filter.deny: "1234:0db8:85a3:0000:0000:8a2e:0370:7334"
--------------------------------------------------

You can also filter by hostnames when DNS lookups are available.

[source,yaml]
--------------------------------------------------
xpack.security.transport.filter.allow: localhost
xpack.security.transport.filter.deny: '*.google.com'
--------------------------------------------------

[float]
=== Disabling IP Filtering

Disabling IP filtering can slightly improve performance under some conditions.
To disable IP filtering entirely, set the value of the `xpack.security.transport.filter.enabled`
setting in the `elasticsearch.yml` configuration file to `false`.

[source,yaml]
--------------------------------------------------
xpack.security.transport.filter.enabled: false
--------------------------------------------------

You can also disable IP filtering for the transport protocol but enable it for
HTTP only.

[source,yaml]
--------------------------------------------------
xpack.security.transport.filter.enabled: false
xpack.security.http.filter.enabled: true
--------------------------------------------------

[float]
=== Specifying TCP transport profiles

{ref}/modules-transport.html#_tcp_transport_profiles[TCP transport profiles]
enable Elasticsearch to bind on multiple hosts. {security} enables you to apply
different IP filtering on different profiles.

[source,yaml]
--------------------------------------------------
xpack.security.transport.filter.allow: 172.16.0.0/24
xpack.security.transport.filter.deny: _all
transport.profiles.client.xpack.security.filter.allow: 192.168.0.0/24
transport.profiles.client.xpack.security.filter.deny: _all
--------------------------------------------------

NOTE: When you do not specify a profile, `default` is used automatically.

[float]
=== HTTP Filtering

You may want to have different IP filtering for the transport and HTTP protocols.

[source,yaml]
--------------------------------------------------
xpack.security.transport.filter.allow: localhost
xpack.security.transport.filter.deny: '*.google.com'
xpack.security.http.filter.allow: 172.16.0.0/16
xpack.security.http.filter.deny: _all
--------------------------------------------------

[float]
[[dynamic-ip-filtering]]
==== Dynamically updating ip filter settings

In case of running in an environment with highly dynamic IP addresses like cloud
based hosting, it is very hard to know the IP addresses upfront when provisioning
a machine. Instead of changing the configuration file and restarting the node,
you can use the _Cluster Update Settings API_. For example:

[source,js]
--------------------------------------------------
PUT /_cluster/settings
{
    "persistent" : {
        "xpack.security.transport.filter.allow" : "172.16.0.0/24"
    }
}
--------------------------------------------------
// CONSOLE

You can also dynamically disable filtering completely:

[source,js]
--------------------------------------------------
PUT /_cluster/settings
{
    "persistent" : {
        "xpack.security.transport.filter.enabled" : false
    }
}
--------------------------------------------------
// CONSOLE
// TEST[continued]

NOTE: In order to avoid locking yourself out of the cluster, the default bound
      transport address will never be denied. This means you can always SSH into
      a system and use curl to apply changes.
