SHOREWALL-RULES(5) | Configuration Files | SHOREWALL-RULES(5) |
rules - Shorewall rules file
/etc/shorewall[6]/rules
Entries in this file govern connection establishment by defining exceptions to the policies laid out in shorewall-policy[1](5). By default, subsequent requests and responses are automatically allowed using connection tracking. For any particular (source,dest) pair of zones, the rules are evaluated in the order in which they appear in this file and the first terminating match is the one that determines the disposition of the request. All rules are terminating except LOG and COUNT rules.
If you masquerade or use SNAT from a local system to the internet, you cannot use an ACCEPT rule to allow traffic from the internet to that system. You must use a DNAT rule instead.
The rules file is divided into sections. Each section is introduced by a "Section Header" which is a line beginning with ?SECTION and followed by the section name.
Sections are as follows and must appear in the order listed:
ALL
ESTABLISHED
The only ACTIONs allowed in this section are ACCEPT, DROP, REJECT, LOG, NFLOG, NFQUEUE and QUEUE
There is an implicit ACCEPT rule inserted at the end of this section.
RELATED
The only ACTIONs allowed in this section are ACCEPT, DROP, REJECT, LOG, NFLOG, NFQUEUE and QUEUE
There is an implicit rule added at the end of this section that invokes the RELATED_DISPOSITION (shorewall.conf[2](5)).
INVALID
The only Actions allowed in this section are ACCEPT, DROP, REJECT, LOG, NFLOG, NFQUEUE and QUEUE.
There is an implicit rule added at the end of this section that invokes the INVALID_DISPOSITION (shorewall.conf[2](5)).
UNTRACKED
The only Actions allowed in this section are ACCEPT, DROP, REJECT, LOG, NFLOG, NFQUEUE and QUEUE.
There is an implicit rule added at the end of this section that invokes the UNTRACKED_DISPOSITION (shorewall.conf[2](5)).
NEW
If you are not familiar with Netfilter to the point where you are comfortable with the differences between the various connection tracking states, then it is suggested that you place all of your rules in the NEW section (That's after the line that reads ?SECTION NEW').
If you specify FASTACCEPT=Yes in shorewall.conf[2](5) then the ALL, ESTABLISHED and RELATED sections must be empty.
An exception is made if you are running Shorewall 4.4.27 or later and you have specified a non-default value for RELATED_DISPOSITION or RELATED_LOG_LEVEL. In that case, you may have rules in the RELATED section of this file.
You may omit any section that you don't need. If no Section Headers appear in the file then all rules are assumed to be in the NEW section.
When defining rules that rewrite the destination IP address and/or port number (namely DNAT and REDIRECT rules), it is important to keep straight which columns in the file specify the packet before rewriting and which specify how the packet will look after rewriting.
The columns in the file are as follows (where the column name is followed by a different name in parentheses, the different name is used in the alternate specification syntax).
ACTION - target[:{log-level|none}[!][:tag]]
ACCEPT
ACCEPT+
ACCEPT!
action
ADD(ipset:flags[:timeout])
Beginning with Shorewall 5.0.3, an optional timeout can be specified. This is the number of seconds that the new entry in the ipset is to remain valid and overrides any timeout specified when the ipset was created.
ADD is non-terminating. Even if a packet matches the rule, it is passed on to the next rule.
AUDIT[(accept|drop|reject)]
A_ACCEPT, A_ACCEPT+ and A_ACCEPT!
A_DROP and A_DROP!
A_REJECT AND A_REJECT!
?COMMENT
CONMARK({mark})
CONTINUE
Do not process any of the following rules for this (source zone,destination zone). If the source and/or destination IP address falls into a zone defined later in shorewall-zones[4](5) or in a parent zone of the source or destination zones, then this connection request will be passed to the rules defined for that (those) zone(s). See shorewall-nesting[5](5) for additional information.
CONTINUE!
COUNT
DEL(ipset:flags)
DEL is non-terminating. Even if a packet matches the rule, it is passed on to the next rule.
DNAT
DNAT-
Like DNAT but only generates the DNAT iptables rule and not the companion ACCEPT rule. Use with IPv6 requires Shorewall 4.5.14 or later.
DROP
DROP!
HELPER
INLINE[(action)]
Some considerations when using INLINE:
IPTABLES({iptables-target [option ...])
ERROR: Unknown target (iptables-target)
This error message may be eliminated by adding the iptables-target as a builtin action in shorewall-actions[3](5).
IP6TABLES({ip6tables-target [option ...])
ERROR: Unknown target (ip6tables-target)
This error message may be eliminated by adding the ip6tables-target as a builtin action in shorewall-actions[3](5).
LOG:level
macro[(macrotarget)]
Example: FTP(ACCEPT).
The older syntax where the macro name and the target are separated by a slash (e.g. FTP/ACCEPT) is still allowed but is deprecated.
MARK({mark})
Added in Shorewall 5.0.7, MARK requires "Mark in filter table" support in your kernel and iptables.
Normally will set the mark value of the current packet. If preceded by a vertical bar ("|"), the mark value will be logically ORed with the current mark value to produce a new mark value. If preceded by an ampersand ("&"), will be logically ANDed with the current mark value to produce a new mark value.
Both "|" and "&" require Extended MARK Target support in your kernel and iptables.
The mark value may be optionally followed by "/" and a mask value (used to determine those bits of the connection mark to actually be set). When a mask is specified, the result of logically ANDing the mark value with the mask must be the same as the mark value.
NFLOG[(nflog-parameters)]
The nflog-parameters are a comma-separated list of up to 3 numbers:
NFLOG is similar to LOG:NFLOG[(nflog-parameters)], except that the log level is not changed when this ACTION is used in an action or macro body and the invocation of that action or macro specifies a log level.
NFQUEUE[([queuenumber1[:queuenumber2[c]][,bypass]]|bypass)]
Beginning with Shorewall 5.1.0, queuenumber2 may be followed by the letter 'c' to indicate that the CPU ID will be used as an index to map packets to the queues. The idea is that you can improve performance if there's a queue per CPU. Requires the NFQUEUE CPU Fanout capability in your kernel and iptables.
NFQUEUE![([queuenumber1[:queuenumber2[c]][,bypass]]|bypass)]
NONAT
QUEUE
QUEUE!
REJECT[(option)]
Beginning with Shorewall 5.0.8, the type of reject may be specified in the option paramater. Valid IPv4 option values are:
REJECT!
REDIRECT
REDIRECT-
Like REDIRECT but only generates the REDIRECT iptables rule and not the companion ACCEPT rule. Use with IPv6 requires Shorewall 4.5.14 or later.
TARPIT [(tarpit | honeypot | reset)]
TARPIT captures and holds incoming TCP connections using no local per-connection resources.
TARPIT only works with the PROTO column set to tcp (6), and is totally application agnostic. This module will answer a TCP request and play along like a listening server, but aside from sending an ACK or RST, no data is sent. Incoming packets are ignored and dropped. The attacker will terminate the session eventually. This module allows the initial packets of an attack to be captured by other software for inspection. In most cases this is sufficient to determine the nature of the attack.
This offers similar functionality to LaBrea <http://www.hackbusters.net/LaBrea/> but does not require dedicated hardware or IPs. Any TCP port that you would normally DROP or REJECT can instead become a tarpit.
The target accepts a single optional parameter:
tarpit
honeypot
reset
ULOG[(ulog-parameters)]
Similar to LOG:ULOG[(ulog-parameters)], except that the log level is not changed when this ACTION is used in an action or macro body and the invocation of that action or macro specifies a log level.
The target may optionally be followed by ":" and a syslog log level (e.g, REJECT:info or Web(ACCEPT):debug). This causes the packet to be logged at the specified level. Note that if the ACTION involves destination network address translation (DNAT, REDIRECT, etc.) then the packet is logged before the destination address is rewritten.
If the ACTION names an action declared in shorewall-actions[3](5) or in /usr/share/shorewall/actions.std then:
You may also specify ULOG (IPv4 only) or NFLOG (must be in upper case) as a log level.This will log to the ULOG or NFLOG target for routing to a separate log through use of ulogd (shorewall-logging(5)[7]).
Actions specifying logging may be followed by a log tag (a string of alphanumeric characters) which is appended to the string generated by the LOGPREFIX (in shorewall.conf[2](5)).
Example: ACCEPT:info:ftp would include 'ftp ' at the end of the log prefix generated by the LOGPREFIX setting.
SOURCE - source-spec[,...]
source-spec is one of the following:
zone[,...[+]]
zone may also be one of the following:
all[+]
any[+]
none
Similar to with all and any, intra-zone traffic is normally excluded when multiple zones are listed. Intra-zone traffic may be included by following the list with a plus sign ("+").
all and any may be followed by an exclamation point ("!") and a comma-separated list of zone names to be omitted.
zone:[!]interface
Beginning with Shorweall 5.2.1, the interface may be preceded with '!' which matches all interfaces associated with the zone except the one specified.
zone:address[,...]
zone:interface:address[,...]
zone:exclusion
zone:interface:exclusion
Beginning with Shorewall 5.1.0, multiple source-specs may be listed, provided that extended forms of the source-spec are used: zone:(interface)
zone:(address[,...])
zone:(interface:address[,...])
zone:(exclusion)
zone:(interface:exclusion) Examples:
dmz:192.168.2.2
net:155.186.235.0/24
loc:192.168.1.1,192.168.1.2
loc:~00-A0-C9-15-39-78
net:192.0.2.11-192.0.2.17
net:!192.0.2.11-192.0.2.17
net:155.186.235.0/24!155.186.235.16/28
$FW:ð0
loc,dmz
all!dmz
all+!$FW
net:^CN
loc:(eth1:1.2.3.4,2.3.4.5),dmz:(eth2:5.6.7.8,9.10.11.12),net
dmz:[2002:ce7c:2b4:1::2]
net:2001:4d48:ad51:24::/64
loc:[2002:cec792b4:1::2],[2002:cec792b4:1::44]
loc:~00-A0-C9-15-39-78
net:[2001:4d48:ad51:24::]/64![2001:4d48:ad51:24:6::]/80
DEST - dest-spec[,...]
dest-spec is one of the following:
zone[,...[+]]
zone may also be one of the following:
all[+]
any[+]
none
Similar to with all and any, intra-zone traffic is normally excluded when multiple zones are listed. Intra-zone traffic may be included by following the list with a plus sign ("+").
all and any may be followed by an exclamation point ("!") and a comma-separated list of zone names to be omitted.
zone:[!]interface
Beginning with Shorweall 5.2.1, the interface may be preceded with '!' which matches all interfaces associated with the zone except the one specified.
zone:address[,...]
zone:[!]interface:address[,...]
Beginning with Shorweall 5.2.1, the interface may be preceded with '!' which matches all interfaces associated with the zone except the one specified.
zone:exclusion
zone:[!]interface:exclusion
Beginning with Shorweall 5.2.1, the interface may be preceded with '!' which matches all interfaces associated with the zone except the one specified.
[zone]:[server-IP][:port-or-port-range[:random]]
server-IP is not allowed in REDIRECT rules and may be omitted in DNAT[-] rules provided that port-or-port-range is included.
If server-IP is omitted in a DNAT[-] rule, only the destination port number is modified by the rule.
port-or-port-range may be:
If random is specified, port mapping will be randomized.
If the DEST zone is a bport zone, then either:
Beginning with Shorewall 5.1.0, multiple dest-specs may be listed, provided that extended forms of the source-spec are used: zone:(interface)
zone:(address[,...])
zone:(interface:address[,...])
zone:(exclusion)
zone:(interface:exclusion) Multiple dest-specs are not permitted in DNAT[-] and REDIRECT[-] rules.
Examples:
dmz:192.168.2.2
net:155.186.235.0/24
loc:192.168.1.1,192.168.1.2
net:192.0.2.11-192.0.2.17
net:!192.0.2.11-192.0.2.17
net:155.186.235.0/24!155.186.235.16/28
$FW:ð0
loc,dmz
all!dmz
net:^CN
dmz:192.168.10.4:25
loc:(eth1:1.2.3.4,2.3.4.5),dmz:(eth2:5.6.7.8,9.10.11.12),net
PROTO- {-|tcp:[!]syn|ipp2p|ipp2p:udp|ipp2p:all|protocol-number|protocol-name|all}
Beginning with Shorewall 4.4.19, this column can contain a comma-separated list of protocol-numbers and/or protocol names.
DPORT - {-|port-name-number-or-range[,port-name-number-or-range]...|+ipset}
If the protocol is ipp2p, this column is interpreted as an ipp2p option without the leading "--" (example bit for bit-torrent). If no port is given, ipp2p is assumed.
A port range is expressed as lowport:highport.
This column is ignored if PROTO = all but must be entered if any of the following columns are supplied. In that case, it is suggested that this field contain a dash (-).
If your kernel contains multi-port match support, then only a single Netfilter rule will be generated if in this list and the SPORT list below:
1. There are 15 or less ports listed.
2. No port ranges are included or your kernel and iptables contain extended multi-port match support.
Beginning with Shorewall 4.6.0, an ipset name can be specified in this column. This is intended to be used with bitmap:port ipsets.
This column was formerly labelled DEST PORT(S).
SPORT - {-|port-name-number-or-range[,port-name-number-or-range]...|+ipset}
Beginning with Shorewall 4.5.15, you may place '=' in this column, provided that the DPORT column is non-empty. This causes the rule to match when either the source port or the destination port in a packet matches one of the ports specified in DEST PORTS(S). Use of '=' requires multi-port match in your iptables and kernel.
If your kernel contains multi-port match support, then only a single Netfilter rule will be generated if in this list and the DPORT list above:
1. There are 15 or less ports listed.
2. No port ranges are included or your kernel and iptables contain extended multi-port match support.
Beginning with Shorewall 4.6.0, an ipset name can be specified in this column. This is intended to be used with bitmap:port ipsets.
This column was formerly labelled SOURCE PORT(S).
ORIGDEST - [-|address[,address]...[exclusion]|exclusion]
A comma-separated list of addresses may also be used. This is most useful with the REDIRECT target where you want to redirect traffic destined for particular set of hosts. Finally, if the list of addresses begins with "!" (exclusion) then the rule will be followed only if the original destination address in the connection request does not match any of the addresses listed.
Beginning with Shorewall 4.4.17, the primary IP address of a firewall interface can be specified by an ampersand ('&') followed by the logical name of the interface as found in the INTERFACE column of shorewall-interfaces[8] (5).
For other actions, this column may be included and may contain one or more addresses (host or network) separated by commas. Address ranges are not allowed. When this column is supplied, rules are generated that require that the original destination address matches one of the listed addresses. This feature is most useful when you want to generate a filter rule that corresponds to a DNAT- or REDIRECT- rule. In this usage, the list of addresses should not begin with "!".
It is also possible to specify a set of addresses then exclude part of those addresses. For example, 192.168.1.0/24!192.168.1.16/28 specifies the addresses 192.168.1.0-182.168.1.15 and 192.168.1.32-192.168.1.255. See shorewall-exclusion[10](5).
See https://shorewall.org/PortKnocking.html[13] for an example of using an entry in this column with a user-defined action rule.
This column was formerly labelled ORIGINAL DEST.
RATE - limit
rate* is the number of connections per interval (sec or min) and burst* is the largest burst permitted. If no burst is given, a value of 5 is assumed. There may be no no white-space embedded in the specification.
Example: 10/sec:20
When s: or d: is specified, the rate applies per source IP address or per destination IP address respectively. The names may be chosen by the user and specify a hash table to be used to count matching connections. If not given, the name shorewallN (where N is a unique integer) is assumed. Where more than one rule or POLICY specifies the same name, the connections counts for the rules are aggregated and the individual rates apply to the aggregated count. Beginning with Shorewall 5.2.1, the s or d may be followed by a slash ("/") and an integer vlsm. When a vlsm is specified, all source or destination addresses encountered will be grouped according to the given prefix length and the so-created subnet will be subject to the rate limit.
Example: s/24::10/sec
Beginning with Shorewall 4.6.5, two limits may be specified, separated by a comma. In this case, the first limit (name1, rate1, burst1) specifies the per-source IP limit and the second limit specifies the per-destination IP limit.
Example: client:10/sec:20,:60/sec:100
In this example, the 'client' hash table will be used to enforce the per-source limit and the compiler will pick a unique name for the hash table that tracks the per-destination limit.
Beginning with Shorewall 5.2.1, the table name, if any, may be followed by two integers separated by commas and enclosed in parentheses. The first integer (ht-buckets) specifies the number of buckets in the generated hash table. The second integer (ht-max) specifies the maximum number of entries in the hash table.
Example: s:netfw(1024,65536):10/sec
This column was formerly labelled RATE LIMIT.
USER - [!][user-name-or-number][:group-name-or-number][,...]
When this column is non-empty, the rule applies only if the program generating the output is running under the effective user and/or group specified (or is NOT running under that id if "!" is given).
Beginning with Shorewall 4.5.8, multiple user or group names/ids separated by commas may be specified.
Examples:
joe
:kids
!:kids
2001-2099
This column was formerly labelled USER/GROUP.
MARK - [!]value[/mask][:C]
If you don't want to define a test but need to specify anything in the following columns, place a "-" in this field.
!
value
mask
:C
CONNLIMIT - [d:][!]limit[:mask]
By default, the limit is applied to each host but can be made to apply to networks of hosts by specifying a mask. The mask specifies the width of a VLSM mask to be applied to the source address; the number of current connections is then taken over all hosts in the subnet source-address/mask. When ! is specified, the rule matches when the number of connection exceeds the limit.
TIME - timeelement[&timeelement...]
timeelement may be:
timestart=hh:mm[:ss]
timestop=hh:mm[:ss]
contiguous
utc
localtz
kerneltz
weekdays=ddd[,ddd]...
monthdays=dd[,dd],...
datestart=yyyy[-mm[-dd[Thh[:mm[:ss]]]]]
datestop=yyyy[-mm[-dd[Thh[:mm[:ss]]]]]
HEADERS - [!][any:|exactly:]header-list (Optional - Added in Shorewall 4.4.15)
The header-list consists of a comma-separated list of headers from the following list.
auth, ah, or 51
esp, or 50
hop, hop-by-hop or 0
route, ipv6-route or 43
frag, ipv6-frag or 44
none, ipv6-nonxt or 59
proto, protocol or 255
If any: is specified, the rule will match if any of the listed headers are present. If exactly: is specified, the will match packets that exactly include all specified headers. If neither is given, any: is assumed.
If ! is entered, the rule will match those packets which would not be matched when ! is omitted.
SWITCH - [!]switch-name[={0|1}]
The rule is enabled if the value stored in /proc/net/nf_condition/switch-name is 1. The rule is disabled if that file contains 0 (the default). If '!' is supplied, the test is inverted such that the rule is enabled if the file contains 0.
Within the switch-name, '@0' and '@{0}' are replaced by the name of the chain to which the rule is a added. The switch-name (after '@...' expansion) must begin with a letter and be composed of letters, decimal digits, underscores or hyphens. Switch names must be 30 characters or less in length.
Switches are normally off. To turn a switch on:
Beginning with Shorewall 4.5.10, when the switch-name is followed by =0 or =1, then the switch is initialized to off or on respectively by the start command. Other commands do not affect the switch setting.
HELPER - [helper]
In the NEW section, causes the named conntrack helper to be associated with this connection; the contents of this column are ignored unless ACTION is ACCEPT*, DNAT* or REDIRECT*.
In the RELATED section, will only match if the related connection has the named helper associated with it.
The helper may be one of:
Example 1:
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST
ACCEPT dmz net tcp smtp
Example 2:
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST
DNAT net loc:192.168.1.3 tcp ssh,http
Example 3:
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST RATE
DNAT net loc:192.168.1.3 tcp http - - 3/sec:10
Example 4:
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST
REDIRECT loc 3128 tcp www - !192.168.2.2
Example 5:
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST
DNAT net loc:192.168.1.3 tcp 80 - 130.252.100.69
Example 6:
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST
ACCEPT net:130.252.100.69,130.252.100.70 \
$FW tcp 22
Example 7:
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST
DNAT net loc:192.168.1.3:22 tcp 2222
Example 8:
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST
REDIRECT net $FW::81-90:random tcp www
Example 9:
shorewall-zones[4](5):
#ZONE TYPE OPTIONS
fw firewall
net ipv4
dmz ipv4
loc ipv4
shorewall-interfaces[8](5):
#ZONE INTERFACE BROADCAST OPTIONS
net ppp0
loc eth1 detect
dmz eth2 detect
- ppp+ # Addresses are assigned from 192.168.3.0/24
shorewall-host[11](5):
#ZONE HOST(S) OPTIONS
loc ppp+:192.168.3.0/24
rules:
#ACTION SOURCE DEST PROTO DPORT
REDIRECT loc 3128 tcp 80
Note that it would have been tempting to simply define the loc zone entirely in shorewall-interfaces(8):
#******************* INCORRECT *****************
#ZONE INTERFACE BROADCAST OPTIONS
net ppp0
loc eth1 detect
loc ppp+
dmz eth2
This would have made it impossible to run a internet-accessible web server in the DMZ because all traffic entering ppp+ interfaces would have been redirected to port 3128 on the firewall and there would have been no net->fw ACCEPT rule for that traffic.
Example 10:
#ACTION SOURCE DEST PROTO DPORT
ADD(+S:dst,src,dst) net fw tcp 22
Example 11:
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST RATE
SSH(ACCEPT) net all - - - - s:1/min:3
Example 12:
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST RATE USER MARK CONNLIMIT TIME HEADERS SWITCH
DNAT net dmz:$BACKUP tcp 80 - - - - - - - - primary_down
Example 13:
#ACTION SOURCE DEST PROTO DPORT
DROP net:^A1,A2 fw tcp 25
Example 14:
#ACTION SOURCE DEST PROTO DPORT
INLINE $FW net ; -p 6 -m mickey-mouse --name test -m set --match-set set1 src -m mickey-mouse --name test2 -j SECCTX --name test3
The above will generate the following iptables-restore input:
-A fw2net -p 6 -m mickey-mouse --name test -m set --match-set set1 src -m mickey-mouse --name test2 -j SECCTX --name test3
Note that SECCTX must be defined as a builtin action in shorewall-actions[3](5):
#ACTION OPTIONS
SECCTX builtin
Example 15:
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST
ACCEPT net:<2002:ce7c::92b4:1::2,2002:ce7c::92b4:1::22> \
$FW tcp 22
/etc/shorewall/rules
/etc/shorewall6/rules
https://shorewall.org/ipsets.html[14]
https://shorewall.org/configuration_file_basics.htm#Pairs[15]
09/24/2020 | Configuration Files |