IPSET(8) IPSET(8)
NAME
ipset -- administration tool for IP sets
SYNOPSIS
ipset [ OPTIONS ] COMMAND [ COMMAND-OPTIONS ]
COMMANDS := { create | add | del | test | destroy | list | save |
restore | flush | rename | swap | help | version | - }
OPTIONS := { -exist | -output { plain | save | xml } | -quiet |
-resolve | -sorted | -name | -terse | -file filename }
ipset create SETNAME TYPENAME [ CREATE-OPTIONS ]
ipset add SETNAME ADD-ENTRY [ ADD-OPTIONS ]
ipset del SETNAME DEL-ENTRY [ DEL-OPTIONS ]
ipset test SETNAME TEST-ENTRY [ TEST-OPTIONS ]
ipset destroy [ SETNAME ]
ipset list [ SETNAME ]
ipset save [ SETNAME ]
ipset restore
ipset flush [ SETNAME ]
ipset rename SETNAME-FROM SETNAME-TO
ipset swap SETNAME-FROM SETNAME-TO
ipset help [ TYPENAME ]
ipset version
ipset -
DESCRIPTION
ipset is used to set up, maintain and inspect so called IP sets in the
Linux kernel. Depending on the type of the set, an IP set may store
IP(v4/v6) addresses, (TCP/UDP) port numbers, IP and MAC address pairs,
IP address and port number pairs, etc. See the set type definitions
below.
Iptables matches and targets referring to sets create references, which
protect the given sets in the kernel. A set cannot be destroyed while
there is a single reference pointing to it.
OPTIONS
The options that are recognized by ipset can be divided into several
different groups.
COMMANDS
These options specify the desired action to perform. Only one of them
can be specified on the command line unless otherwise specified below.
For all the long versions of the command names, you need to use only
enough letters to ensure that ipset can differentiate it from all other
commands. The ipset parser follows the order here when looking for the
shortest match in the long command names.
n, create SETNAME TYPENAME [ CREATE-OPTIONS ]
Create a set identified with setname and specified type. The
type may require type specific options. If the -exist option is
specified, ipset ignores the error otherwise raised when the
same set (setname and create parameters are identical) already
exists.
add SETNAME ADD-ENTRY [ ADD-OPTIONS ]
Add a given entry to the set. If the -exist option is specified,
ipset ignores if the entry already added to the set.
del SETNAME DEL-ENTRY [ DEL-OPTIONS ]
Delete an entry from a set. If the -exist option is specified
and the entry is not in the set (maybe already expired), then
the command is ignored.
test SETNAME TEST-ENTRY [ TEST-OPTIONS ]
Test whether an entry is in a set or not. Exit status number is
zero if the tested entry is in the set and nonzero if it is
missing from the set.
x, destroy [ SETNAME ]
Destroy the specified set or all the sets if none is given.
If the set has got reference(s), nothing is done and no set
destroyed.
list [ SETNAME ] [ OPTIONS ]
List the header data and the entries for the specified set, or
for all sets if none is given. The -resolve option can be used
to force name lookups (which may be slow). When the -sorted
option is given, the entries are listed/saved sorted (which may
be slow). The option -output can be used to control the format
of the listing: plain, save or xml. (The default is plain.) If
the option -name is specified, just the names of the existing
sets are listed. If the option -terse is specified, just the set
names and headers are listed. The output is printed to stdout,
the option -file can be used to specify a filename instead of
stdout.
save [ SETNAME ]
Save the given set, or all sets if none is given to stdout in a
format that restore can read. The option -file can be used to
specify a filename instead of stdout.
restore
Restore a saved session generated by save. The saved session
can be fed from stdin or the option -file can be used to specify
a filename instead of stdin.
Please note, existing sets and elements are not erased by
restore unless specified so in the restore file. All commands
are allowed in restore mode except list, help, version, interac-
tive mode and restore itself.
flush [ SETNAME ]
Flush all entries from the specified set or flush all sets if
none is given.
e, rename SETNAME-FROM SETNAME-TO
Rename a set. Set identified by SETNAME-TO must not exist.
w, swap SETNAME-FROM SETNAME-TO
Swap the content of two sets, or in another words, exchange the
name of two sets. The referred sets must exist and compatible
type of sets can be swapped only.
help [ TYPENAME ]
Print help and set type specific help if TYPENAME is specified.
version
Print program version.
- If a dash is specified as command, then ipset enters a simple
interactive mode and the commands are read from the standard
input. The interactive mode can be finished by entering the
pseudo-command quit.
OTHER OPTIONS
The following additional options can be specified. The long option
names cannot be abbreviated.
-!, -exist
Ignore errors when exactly the same set is to be created or
already added entry is added or missing entry is deleted.
-o, -output { plain | save | xml }
Select the output format to the list command.
-q, -quiet
Suppress any output to stdout and stderr. ipset will still exit
with error if it cannot continue.
-r, -resolve
When listing sets, enforce name lookup. The program will try to
display the IP entries resolved to host names which requires
slow DNS lookups.
-s, -sorted
Sorted output. When listing or saving sets, the entries are
listed sorted.
-n, -name
List just the names of the existing sets, i.e. suppress listing
of set headers and members.
-t, -terse
List the set names and headers, i.e. suppress listing of set
members.
-f, -file filename
Specify a filename to print into instead of stdout (list or save
commands) or read from instead of stdin (restore command).
INTRODUCTION
A set type comprises of the storage method by which the data is stored
and the data type(s) which are stored in the set. Therefore the TYPE-
NAME parameter of the create command follows the syntax
TYPENAME := method:datatype[,datatype[,datatype]]
where the current list of the methods are bitmap, hash, and list and
the possible data types are ip, net, mac, port and iface. The dimen-
sion of a set is equal to the number of data types in its type name.
When adding, deleting or testing entries in a set, the same comma sepa-
rated data syntax must be used for the entry parameter of the commands,
i.e
ipset add foo ipaddr,portnum,ipaddr
If host names or service names with dash in the name are used instead
of IP addresses or service numbers, then the host name or service name
must be enclosed in square brackets. Example:
ipset add foo [test-hostname],[ftp-data]
In the case of host names the DNS resolver is called internally by
ipset but if it returns multiple IP addresses, only the first one is
used.
The bitmap and list types use a fixed sized storage. The hash types use
a hash to store the elements. In order to avoid clashes in the hash, a
limited number of chaining, and if that is exhausted, the doubling of
the hash size is performed when adding entries by the ipset command.
When entries added by the SET target of iptables/ip6tables, then the
hash size is fixed and the set won't be duplicated, even if the new
entry cannot be added to the set.
GENERIC CREATE AND ADD OPTIONS
timeout
All set types supports the optional timeout parameter when creating a
set and adding entries. The value of the timeout parameter for the cre-
ate command means the default timeout value (in seconds) for new
entries. If a set is created with timeout support, then the same time-
out option can be used to specify non-default timeout values when
adding entries. Zero timeout value means the entry is added permanent
to the set. The timeout value of already added elements can be changed
by re-adding the element using the -exist option. The largest possible
timeout value is 2147483 (in seconds). Example:
ipset create test hash:ip timeout 300
ipset add test 192.168.0.1 timeout 60
ipset -exist add test 192.168.0.1 timeout 600
When listing the set, the number of entries printed in the header might
be larger than the listed number of entries for sets with the timeout
extensions: the number of entries in the set is updated when elements
added/deleted to the set and periodically when the garbage collector
evicts the timed out entries.
counters, packets, bytes
All set types support the optional counters option when creating a set.
If the option is specified then the set is created with packet and byte
counters per element support. The packet and byte counters are initial-
ized to zero when the elements are (re-)added to the set, unless the
packet and byte counter values are explicitly specified by the packets
and bytes options. An example when an element is added to a set with
non-zero counter values:
ipset create foo hash:ip counters
ipset add foo 192.168.1.1 packets 42 bytes 1024
comment
All set types support the optional comment extension. Enabling this
extension on an ipset enables you to annotate an ipset entry with an
arbitrary string. This string is completely ignored by both the kernel
and ipset itself and is purely for providing a convenient means to doc-
ument the reason for an entry's existence. Comments must not contain
any quotation marks and the usual escape character (\) has no meaning.
For example, the following shell command is illegal:
ipset add foo 1.1.1.1 comment "this comment is \"bad\""
In the above, your shell will of course escape the quotation marks and
ipset will see the quote marks in the argument for the comment, which
will result in a parse error. If you are writing your own system, you
should avoid creating comments containing a quotation mark if you do
not want to break "ipset save" and "ipset restore", nonetheless, the
kernel will not stop you from doing so. The following is perfectly
acceptable:
ipset create foo hash:ip comment
ipset add foo 192.168.1.1/24 comment "allow access to SMB share
on \\\\fileserv\\"
the above would appear as: "allow access to SMB share on \\file-
serv\"
skbinfo, skbmark, skbprio, skbqueue
All set types support the optional skbinfo extension. This extension
allows you to store the metainfo (firewall mark, tc class and hardware
queue) with every entry and map it to packets by usage of SET netfilter
target with --map-set option. skbmark option format: MARK or
MARK/MASK, where MARK and MASK are 32bit hex numbers with 0x prefix. If
only mark is specified mask 0xffffffff are used. skbprio option has tc
class format: MAJOR:MINOR, where major and minor numbers are hex with-
out 0x prefix. skbqueue option is just decimal number.
ipset create foo hash:ip skbinfo
ipset add foo skbmark 0x1111/0xff00ffff skbprio 1:10 skbqueue 10
hashsize
This parameter is valid for the create command of all hash type sets.
It defines the initial hash size for the set, default is 1024. The hash
size must be a power of two, the kernel automatically rounds up non
power of two hash sizes to the first correct value. Example:
ipset create test hash:ip hashsize 1536
maxelem
This parameter is valid for the create command of all hash type sets.
It does define the maximal number of elements which can be stored in
the set, default 65536. Example:
ipset create test hash:ip maxelem 2048.
family { inet | inet6 }
This parameter is valid for the create command of all hash type sets
except for hash:mac. It defines the protocol family of the IP
addresses to be stored in the set. The default is inet, i.e IPv4. For
the inet family one can add or delete multiple entries by specifying a
range or a network of IPv4 addresses in the IP address part of the
entry:
ipaddr := { ip | fromaddr-toaddr | ip/cidr }
netaddr := { fromaddr-toaddr | ip/cidr }
Example:
ipset create test hash:ip family inet6
nomatch
The hash set types which can store net type of data (i.e. hash:*net*)
support the optional nomatch option when adding entries. When matching
elements in the set, entries marked as nomatch are skipped as if those
were not added to the set, which makes possible to build up sets with
exceptions. See the example at hash type hash:net below.
When elements are tested by ipset, the nomatch flags are taken into
account. If one wants to test the existence of an element marked with
nomatch in a set, then the flag must be specified too.
forceadd
All hash set types support the optional forceadd parameter when creat-
ing a set. When sets created with this option become full the next
addition to the set may succeed and evict a random entry from the set.
ipset create foo hash:ip forceadd
SET TYPES
bitmap:ip
The bitmap:ip set type uses a memory range to store either IPv4 host
(default) or IPv4 network addresses. A bitmap:ip type of set can store
up to 65536 entries.
CREATE-OPTIONS := range fromip-toip|ip/cidr [ netmask cidr ] [ timeout
value ] [ counters ] [ comment ] [ skbinfo ]
ADD-ENTRY := { ip | fromip-toip | ip/cidr }
ADD-OPTIONS := [ timeout value ] [ packets value ] [ bytes value ] [
comment string ] [ skbmark value ] [ skbprio value ] [ skbqueue value ]
DEL-ENTRY := { ip | fromip-toip | ip/cidr }
TEST-ENTRY := ip
Mandatory create options:
range fromip-toip|ip/cidr
Create the set from the specified inclusive address range
expressed in an IPv4 address range or network. The size of the
range (in entries) cannot exceed the limit of maximum 65536 ele-
ments.
Optional create options:
netmask cidr
When the optional netmask parameter specified, network addresses
will be stored in the set instead of IP host addresses. The cidr
prefix value must be between 1-32. An IP address will be in the
set if the network address, which is resulted by masking the
address with the specified netmask, can be found in the set.
The bitmap:ip type supports adding or deleting multiple entries in one
command.
Examples:
ipset create foo bitmap:ip range 192.168.0.0/16
ipset add foo 192.168.1/24
ipset test foo 192.168.1.1
bitmap:ip,mac
The bitmap:ip,mac set type uses a memory range to store IPv4 and a MAC
address pairs. A bitmap:ip,mac type of set can store up to 65536
entries.
CREATE-OPTIONS := range fromip-toip|ip/cidr [ timeout value ] [ coun-
ters ] [ comment ] [ skbinfo ]
ADD-ENTRY := ip[,macaddr]
ADD-OPTIONS := [ timeout value ] [ packets value ] [ bytes value ] [
comment string ] [ skbmark value ] [ skbprio value ] [ skbqueue value ]
DEL-ENTRY := ip[,macaddr]
TEST-ENTRY := ip[,macaddr]
Mandatory options to use when creating a bitmap:ip,mac type of set:
range fromip-toip|ip/cidr
Create the set from the specified inclusive address range
expressed in an IPv4 address range or network. The size of the
range cannot exceed the limit of maximum 65536 entries.
The bitmap:ip,mac type is exceptional in the sense that the MAC part
can be left out when adding/deleting/testing entries in the set. If we
add an entry without the MAC address specified, then when the first
time the entry is matched by the kernel, it will automatically fill out
the missing MAC address with the MAC address from the packet. The
source MAC address is used if the entry matched due to a src parameter
of the set match, and the destination MAC address is used if available
and the entry matched due to a dst parameter. If the entry was speci-
fied with a timeout value, the timer starts off when the IP and MAC
address pair is complete.
The bitmap:ip,mac type of sets require two src/dst parameters of the
set match and SET target netfilter kernel modules. For matches on des-
tination MAC addresses, see COMMENTS below.
Examples:
ipset create foo bitmap:ip,mac range 192.168.0.0/16
ipset add foo 192.168.1.1,12:34:56:78:9A:BC
ipset test foo 192.168.1.1
bitmap:port
The bitmap:port set type uses a memory range to store port numbers and
such a set can store up to 65536 ports.
CREATE-OPTIONS := range fromport-toport [ timeout value ] [ counters ]
[ comment ] [ skbinfo ]
ADD-ENTRY := { [proto:]port | [proto:]fromport-toport }
ADD-OPTIONS := [ timeout value ] [ packets value ] [ bytes value ] [
comment string ] [ skbmark value ] [ skbprio value ] [ skbqueue value ]
DEL-ENTRY := { [proto:]port | [proto:]fromport-toport }
TEST-ENTRY := [proto:]port
Mandatory options to use when creating a bitmap:port type of set:
range [proto:]fromport-toport
Create the set from the specified inclusive port range.
The set match and SET target netfilter kernel modules interpret the
stored numbers as TCP or UDP port numbers.
proto only needs to be specified if a service name is used, and that
name does not exist as a TCP service.
Examples:
ipset create foo bitmap:port range 0-1024
ipset add foo 80
ipset test foo 80
ipset del foo udp:[macon-udp]-[tn-tl-w2]
hash:ip
The hash:ip set type uses a hash to store IP host addresses (default)
or network addresses. Zero valued IP address cannot be stored in a
hash:ip type of set.
CREATE-OPTIONS := [ family { inet | inet6 } ] | [ hashsize value ] [
maxelem value ] [ netmask cidr ] [ timeout value ] [ counters ] [ com-
ment ] [ skbinfo ]
ADD-ENTRY := ipaddr
ADD-OPTIONS := [ timeout value ] [ packets value ] [ bytes value ] [
comment string ] [ skbmark value ] [ skbprio value ] [ skbqueue value ]
DEL-ENTRY := ipaddr
TEST-ENTRY := ipaddr
Optional create options:
netmask cidr
When the optional netmask parameter specified, network addresses
will be stored in the set instead of IP host addresses. The cidr
prefix value must be between 1-32 for IPv4 and between 1-128 for
IPv6. An IP address will be in the set if the network address,
which is resulted by masking the address with the netmask, can
be found in the set. Examples:
ipset create foo hash:ip netmask 30
ipset add foo 192.168.1.0/24
ipset test foo 192.168.1.2
hash:mac
The hash:mac set type uses a hash to store MAC addresses. Zero valued
MAC addresses cannot be stored in a hash:mac type of set. For matches
on destination MAC addresses, see COMMENTS below.
CREATE-OPTIONS := [ hashsize value ] [ maxelem value ] [ timeout value
] [ counters ] [ comment ] [ skbinfo ]
ADD-ENTRY := macaddr
ADD-OPTIONS := [ timeout value ] [ packets value ] [ bytes value ] [
comment string ] [ skbmark value ] [ skbprio value ] [ skbqueue value ]
DEL-ENTRY := macaddr
TEST-ENTRY := macaddr
Examples:
ipset create foo hash:mac
ipset add foo 01:02:03:04:05:06
ipset test foo 01:02:03:04:05:06
hash:ip,mac
The hash:ip,mac set type uses a hash to store IP and a MAC address
pairs. Zero valued MAC addresses cannot be stored in a hash:ip,mac type
of set. For matches on destination MAC addresses, see COMMENTS below.
CREATE-OPTIONS := [ family { inet | inet6 } ] | [ hashsize value ] [
maxelem value ] [ timeout value ] [ counters ] [ comment ] [ skbinfo ]
ADD-ENTRY := ipaddr,macaddr
ADD-OPTIONS := [ timeout value ] [ packets value ] [ bytes value ] [
comment string ] [ skbmark value ] [ skbprio value ] [ skbqueue value ]
DEL-ENTRY := ipaddr,macaddr
TEST-ENTRY := ipaddr,macaddr
Examples:
ipset create foo hash:ip,mac
ipset add foo 1.1.1.1,01:02:03:04:05:06
ipset test foo 1.1.1.1,01:02:03:04:05:06
hash:net
The hash:net set type uses a hash to store different sized IP network
addresses. Network address with zero prefix size cannot be stored in
this type of sets.
CREATE-OPTIONS := [ family { inet | inet6 } ] | [ hashsize value ] [
maxelem value ] [ timeout value ] [ counters ] [ comment ] [ skbinfo ]
ADD-ENTRY := netaddr
ADD-OPTIONS := [ timeout value ] [ nomatch ] [ packets value ] [ bytes
value ] [ comment string ] [ skbmark value ] [ skbprio value ] [
skbqueue value ]
DEL-ENTRY := netaddr
TEST-ENTRY := netaddr
where netaddr := ip[/cidr]
When adding/deleting/testing entries, if the cidr prefix parameter is
not specified, then the host prefix value is assumed. When
adding/deleting entries, the exact element is added/deleted and over-
lapping elements are not checked by the kernel. When testing entries,
if a host address is tested, then the kernel tries to match the host
address in the networks added to the set and reports the result accord-
ingly.
From the set netfilter match point of view the searching for a match
always starts from the smallest size of netblock (most specific
prefix) to the largest one (least specific prefix) added to the set.
When adding/deleting IP addresses to the set by the SET netfilter
target, it will be added/deleted by the most specific prefix which
can be found in the set, or by the host prefix value if the set is
empty.
The lookup time grows linearly with the number of the different prefix
values added to the set.
Example:
ipset create foo hash:net
ipset add foo 192.168.0.0/24
ipset add foo 10.1.0.0/16
ipset add foo 192.168.0/24
ipset add foo 192.168.0/30 nomatch
When matching the elements in the set above, all IP addresses will
match from the networks 192.168.0.0/24, 10.1.0.0/16 and 192.168.0/24
except the ones from 192.168.0/30.
hash:net,net
The hash:net,net set type uses a hash to store pairs of different sized
IP network addresses. Bear in mind that the first parameter has
precedence over the second, so a nomatch entry could be potentially be
ineffective if a more specific first parameter existed with a suitable
second parameter. Network address with zero prefix size cannot be
stored in this type of set.
CREATE-OPTIONS := [ family { inet | inet6 } ] | [ hashsize value ] [
maxelem value ] [ timeout value ] [ counters ] [ comment ] [ skbinfo ]
ADD-ENTRY := netaddr,netaddr
ADD-OPTIONS := [ timeout value ] [ nomatch ] [ packets value ] [ bytes
value ] [ comment string ] [ skbmark value ] [ skbprio value ] [
skbqueue value ]
DEL-ENTRY := netaddr,netaddr
TEST-ENTRY := netaddr,netaddr
where netaddr := ip[/cidr]
When adding/deleting/testing entries, if the cidr prefix parameter is
not specified, then the host prefix value is assumed. When
adding/deleting entries, the exact element is added/deleted and over-
lapping elements are not checked by the kernel. When testing entries,
if a host address is tested, then the kernel tries to match the host
address in the networks added to the set and reports the result accord-
ingly.
From the set netfilter match point of view the searching for a match
always starts from the smallest size of netblock (most specific
prefix) to the largest one (least specific prefix) with the first param
having precedence. When adding/deleting IP addresses to the set by
the SET netfilter target, it will be added/deleted by the most
specific prefix which can be found in the set, or by the host prefix
value if the set is empty.
The lookup time grows linearly with the number of the different prefix
values added to the first parameter of the set. The number of secondary
prefixes further increases this as the list of secondary prefixes is
traversed per primary prefix.
Example:
ipset create foo hash:net,net
ipset add foo 192.168.0.0/24,10.0.1.0/24
ipset add foo 10.1.0.0/16,10.255.0.0/24
ipset add foo 192.168.0/24,192.168.54.0-192.168.54.255
ipset add foo 192.168.0/30,192.168.64/30 nomatch
When matching the elements in the set above, all IP addresses will
match from the networks 192.168.0.0/24<->10.0.1.0/24,
10.1.0.0/16<->10.255.0.0/24 and 192.168.0/24<->192.168.54.0/24 except
the ones from 192.168.0/30<->192.168.64/30.
hash:ip,port
The hash:ip,port set type uses a hash to store IP address and port num-
ber pairs. The port number is interpreted together with a protocol
(default TCP) and zero protocol number cannot be used.
CREATE-OPTIONS := [ family { inet | inet6 } ] | [ hashsize value ] [
maxelem value ] [ timeout value ] [ counters ] [ comment ] [ skbinfo ]
ADD-ENTRY := ipaddr,[proto:]port
ADD-OPTIONS := [ timeout value ] [ packets value ] [ bytes value ] [
comment string ] [ skbmark value ] [ skbprio value ] [ skbqueue value ]
DEL-ENTRY := ipaddr,[proto:]port
TEST-ENTRY := ipaddr,[proto:]port
The [proto:]port part of the elements may be expressed in the following
forms, where the range variations are valid when adding or deleting
entries:
portname[-portname]
TCP port or range of ports expressed in TCP portname identifiers
from /etc/services
portnumber[-portnumber]
TCP port or range of ports expressed in TCP port numbers
tcp|sctp|udp|udplite:portname|portnumber[-portname|portnumber]
TCP, SCTP, UDP or UDPLITE port or port range expressed in port
name(s) or port number(s)
icmp:codename|type/code
ICMP codename or type/code. The supported ICMP codename identi-
fiers can always be listed by the help command.
icmpv6:codename|type/code
ICMPv6 codename or type/code. The supported ICMPv6 codename
identifiers can always be listed by the help command.
proto:0
All other protocols, as an identifier from /etc/protocols or
number. The pseudo port number must be zero.
The hash:ip,port type of sets require two src/dst parameters of the set
match and SET target kernel modules.
Examples:
ipset create foo hash:ip,port
ipset add foo 192.168.1.0/24,80-82
ipset add foo 192.168.1.1,udp:53
ipset add foo 192.168.1.1,vrrp:0
ipset test foo 192.168.1.1,80
hash:net,port
The hash:net,port set type uses a hash to store different sized IP net-
work address and port pairs. The port number is interpreted together
with a protocol (default TCP) and zero protocol number cannot be used.
Network address with zero prefix size is not accepted either.
CREATE-OPTIONS := [ family { inet | inet6 } ] | [ hashsize value ] [
maxelem value ] [ timeout value ] [ counters ] [ comment ] [ skbinfo ]
ADD-ENTRY := netaddr,[proto:]port
ADD-OPTIONS := [ timeout value ] [ nomatch ] [ packets value ] [ bytes
value ] [ comment string ] [ skbmark value ] [ skbprio value ] [
skbqueue value ]
DEL-ENTRY := netaddr,[proto:]port
TEST-ENTRY := netaddr,[proto:]port
where netaddr := ip[/cidr]
For the netaddr part of the elements see the description at the
hash:net set type. For the [proto:]port part of the elements see the
description at the hash:ip,port set type.
When adding/deleting/testing entries, if the cidr prefix parameter is
not specified, then the host prefix value is assumed. When
adding/deleting entries, the exact element is added/deleted and over-
lapping elements are not checked by the kernel. When testing entries,
if a host address is tested, then the kernel tries to match the host
address in the networks added to the set and reports the result accord-
ingly.
From the set netfilter match point of view the searching for a match
always starts from the smallest size of netblock (most specific
prefix) to the largest one (least specific prefix) added to the set.
When adding/deleting IP addresses to the set by the SET netfilter
target, it will be added/deleted by the most specific prefix which
can be found in the set, or by the host prefix value if the set is
empty.
The lookup time grows linearly with the number of the different prefix
values added to the set.
Examples:
ipset create foo hash:net,port
ipset add foo 192.168.0/24,25
ipset add foo 10.1.0.0/16,80
ipset test foo 192.168.0/24,25
hash:ip,port,ip
The hash:ip,port,ip set type uses a hash to store IP address, port num-
ber and a second IP address triples. The port number is interpreted
together with a protocol (default TCP) and zero protocol number cannot
be used.
CREATE-OPTIONS := [ family { inet | inet6 } ] | [ hashsize value ] [
maxelem value ] [ timeout value ] [ counters ] [ comment ] [ skbinfo ]
ADD-ENTRY := ipaddr,[proto:]port,ip
ADD-OPTIONS := [ timeout value ] [ packets value ] [ bytes value ] [
comment string ] [ skbmark value ] [ skbprio value ] [ skbqueue value ]
DEL-ENTRY := ipaddr,[proto:]port,ip
TEST-ENTRY := ipaddr,[proto:]port,ip
For the first ipaddr and [proto:]port parts of the elements see the
descriptions at the hash:ip,port set type.
The hash:ip,port,ip type of sets require three src/dst parameters of
the set match and SET target kernel modules.
Examples:
ipset create foo hash:ip,port,ip
ipset add foo 192.168.1.1,80,10.0.0.1
ipset test foo 192.168.1.1,udp:53,10.0.0.1
hash:ip,port,net
The hash:ip,port,net set type uses a hash to store IP address, port
number and IP network address triples. The port number is interpreted
together with a protocol (default TCP) and zero protocol number cannot
be used. Network address with zero prefix size cannot be stored either.
CREATE-OPTIONS := [ family { inet | inet6 } ] | [ hashsize value ] [
maxelem value ] [ timeout value ] [ counters ] [ comment ] [ skbinfo ]
ADD-ENTRY := ipaddr,[proto:]port,netaddr
ADD-OPTIONS := [ timeout value ] [ nomatch ] [ packets value ] [ bytes
value ] [ comment string ] [ skbmark value ] [ skbprio value ] [
skbqueue value ]
DEL-ENTRY := ipaddr,[proto:]port,netaddr
TEST-ENTRY := ipaddr,[proto:]port,netaddr
where netaddr := ip[/cidr]
For the ipaddr and [proto:]port parts of the elements see the descrip-
tions at the hash:ip,port set type. For the netaddr part of the ele-
ments see the description at the hash:net set type.
From the set netfilter match point of view the searching for a match
always starts from the smallest size of netblock (most specific
cidr) to the largest one (least specific cidr) added to the set. When
adding/deleting triples to the set by the SET netfilter target, it
will be added/deleted by the most specific cidr which can be found in
the set, or by the host cidr value if the set is empty.
The lookup time grows linearly with the number of the different cidr
values added to the set.
The hash:ip,port,net type of sets require three src/dst parameters of
the set match and SET target kernel modules.
Examples:
ipset create foo hash:ip,port,net
ipset add foo 192.168.1,80,10.0.0/24
ipset add foo 192.168.2,25,10.1.0.0/16
ipset test foo 192.168.1,80.10.0.0/24
hash:ip,mark
The hash:ip,mark set type uses a hash to store IP address and packet
mark pairs.
CREATE-OPTIONS := [ family { inet | inet6 } ] | [ markmask value ] [
hashsize value ] [ maxelem value ] [ timeout value ] [ counters ] [
comment ] [ skbinfo ]
ADD-ENTRY := ipaddr,mark
ADD-OPTIONS := [ timeout value ] [ packets value ] [ bytes value ] [
comment string ] [ skbmark value ] [ skbprio value ] [ skbqueue value ]
DEL-ENTRY := ipaddr,mark
TEST-ENTRY := ipaddr,mark
Optional create options:
markmask value
Allows you to set bits you are interested in the packet mark.
This values is then used to perform bitwise AND operation for
every mark added. markmask can be any value between 1 and
4294967295, by default all 32 bits are set.
The mark can be any value between 0 and 4294967295.
The hash:ip,mark type of sets require two src/dst parameters of the set
match and SET target kernel modules.
Examples:
ipset create foo hash:ip,mark
ipset add foo 192.168.1.0/24,555
ipset add foo 192.168.1.1,0x63
ipset add foo 192.168.1.1,111236
hash:net,port,net
The hash:net,port,net set type behaves similarly to hash:ip,port,net
but accepts a cidr value for both the first and last parameter. Either
subnet is permitted to be a /0 should you wish to match port between
all destinations.
CREATE-OPTIONS := [ family { inet | inet6 } ] | [ hashsize value ] [
maxelem value ] [ timeout value ] [ counters ] [ comment ] [ skbinfo ]
ADD-ENTRY := netaddr,[proto:]port,netaddr
ADD-OPTIONS := [ timeout value ] [ nomatch ] [ packets value ] [ bytes
value ] [ comment string ] [ skbmark value ] [ skbprio value ] [
skbqueue value ]
DEL-ENTRY := netaddr,[proto:]port,netaddr
TEST-ENTRY := netaddr,[proto:]port,netaddr
where netaddr := ip[/cidr]
For the [proto:]port part of the elements see the description at the
hash:ip,port set type. For the netaddr part of the elements see the
description at the hash:net set type.
From the set netfilter match point of view the searching for a match
always starts from the smallest size of netblock (most specific
cidr) to the largest one (least specific cidr) added to the set. When
adding/deleting triples to the set by the SET netfilter target, it
will be added/deleted by the most specific cidr which can be found in
the set, or by the host cidr value if the set is empty. The first sub-
net has precedence when performing the most-specific lookup, just as
for hash:net,net
The lookup time grows linearly with the number of the different cidr
values added to the set and by the number of secondary cidr values per
primary.
The hash:net,port,net type of sets require three src/dst parameters of
the set match and SET target kernel modules.
Examples:
ipset create foo hash:net,port,net
ipset add foo 192.168.1.0/24,0,10.0.0/24
ipset add foo 192.168.2.0/24,25,10.1.0.0/16
ipset test foo 192.168.1.1,80,10.0.0.1
hash:net,iface
The hash:net,iface set type uses a hash to store different sized IP
network address and interface name pairs.
CREATE-OPTIONS := [ family { inet | inet6 } ] | [ hashsize value ] [
maxelem value ] [ timeout value ] [ counters ] [ comment ] [ skbinfo ]
ADD-ENTRY := netaddr,[physdev:]iface
ADD-OPTIONS := [ timeout value ] [ nomatch ] [ packets value ] [ bytes
value ] [ comment string ] [ skbmark value ] [ skbprio value ] [
skbqueue value ]
DEL-ENTRY := netaddr,[physdev:]iface
TEST-ENTRY := netaddr,[physdev:]iface
where netaddr := ip[/cidr]
For the netaddr part of the elements see the description at the
hash:net set type.
When adding/deleting/testing entries, if the cidr prefix parameter is
not specified, then the host prefix value is assumed. When
adding/deleting entries, the exact element is added/deleted and over-
lapping elements are not checked by the kernel. When testing entries,
if a host address is tested, then the kernel tries to match the host
address in the networks added to the set and reports the result accord-
ingly.
From the set netfilter match point of view the searching for a match
always starts from the smallest size of netblock (most specific
prefix) to the largest one (least specific prefix) added to the set.
When adding/deleting IP addresses to the set by the SET netfilter
target, it will be added/deleted by the most specific prefix which
can be found in the set, or by the host prefix value if the set is
empty.
The second direction parameter of the set match and SET target modules
corresponds to the incoming/outgoing interface: src to the incoming one
(similar to the -i flag of iptables), while dst to the outgoing one
(similar to the -o flag of iptables). When the interface is flagged
with physdev:, the interface is interpreted as the incoming/outgoing
bridge port.
The lookup time grows linearly with the number of the different prefix
values added to the set.
The internal restriction of the hash:net,iface set type is that the
same network prefix cannot be stored with more than 64 different inter-
faces in a single set.
Examples:
ipset create foo hash:net,iface
ipset add foo 192.168.0/24,eth0
ipset add foo 10.1.0.0/16,eth1
ipset test foo 192.168.0/24,eth0
list:set
The list:set type uses a simple list in which you can store set names.
CREATE-OPTIONS := [ size value ] [ timeout value ] [ counters ] [ com-
ment ] [ skbinfo ]
ADD-ENTRY := setname [ { before | after } setname ]
ADD-OPTIONS := [ timeout value ] [ packets value ] [ bytes value ] [
comment string ] [ skbmark value ] [ skbprio value ] [ skbqueue value ]
DEL-ENTRY := setname [ { before | after } setname ]
TEST-ENTRY := setname [ { before | after } setname ]
Optional create options:
size value
The size of the list, the default is 8. The parameter is ignored
since ipset version 6.24.
By the ipset command you can add, delete and test set names in a
list:set type of set.
By the set match or SET target of netfilter you can test, add or delete
entries in the sets added to the list:set type of set. The match will
try to find a matching entry in the sets and the target will try to add
an entry to the first set to which it can be added. The number of
direction options of the match and target are important: sets which
require more parameters than specified are skipped, while sets with
equal or less parameters are checked, elements added/deleted. For exam-
ple if a and b are list:set type of sets then in the command
iptables -m set --match-set a src,dst -j SET --add-set b src,dst
the match and target will skip any set in a and b which stores data
triples, but will match all sets with single or double data storage in
a set and stop matching at the first successful set, and add src to the
first single or src,dst to the first double data storage set in b to
which the entry can be added. You can imagine a list:set type of set as
an ordered union of the set elements.
Please note: by the ipset command you can add, delete and test the set-
names in a list:set type of set, and not the presence of a set's member
(such as an IP address).
GENERAL RESTRICTIONS
Zero valued set entries cannot be used with hash methods. Zero protocol
value with ports cannot be used.
COMMENTS
If you want to store same size subnets from a given network (say /24
blocks from a /8 network), use the bitmap:ip set type. If you want to
store random same size networks (say random /24 blocks), use the
hash:ip set type. If you have got random size of netblocks, use
hash:net.
Matching on destination MAC addresses using the dst parameter of the
set match netfilter kernel modules will only work if the destination
MAC address is available in the packet at the given processing stage,
that is, it only applies for incoming packets in the PREROUTING, INPUT
and FORWARD chains, against the MAC address as originally found in the
received packet (typically, one of the MAC addresses of the local
host). This is not the destination MAC address a destination IP address
resolves to, after routing. If the MAC address is not available (e.g.
in the OUTPUT chain), the packet will simply not match.
Backward compatibility is maintained and old ipset syntax is still sup-
ported.
The iptree and iptreemap set types are removed: if you refer to them,
they are automatically replaced by hash:ip type of sets.
DIAGNOSTICS
Various error messages are printed to standard error. The exit code is
0 for correct functioning.
BUGS
Bugs? No, just funny features. :-) OK, just kidding...
SEE ALSO
iptables(8), ip6tables(8) iptables-extensions(8)
AUTHORS
Jozsef Kadlecsik wrote ipset, which is based on ippool by Joakim Axels-
son, Patrick Schaaf and Martin Josefsson.
Sven Wegener wrote the iptreemap type.
LAST REMARK
I stand on the shoulders of giants.
Jozsef Kadlecsik Jun 25, 2015 IPSET(8)