Fix matching ICMPv6 mld-listener-query packets
[config/nftables.git] / nftables-workstation.nft
1 #!/usr/sbin/nft -f
2 #
3 # nftables ruleset for an End Node acting as a workstation in a LAN.
4 #
5 # Copyright (C) 2018  Antonio Ospite <ao2@ao2.it>
6 # SPDX-License-Identifier: MIT
7 #
8 # Based on:
9 # https://wiki.nftables.org/wiki-nftables/index.php/Quick_reference-nftables_in_10_minutes#Simple_IP.2FIPv6_Firewall
10 # https://wiki.archlinux.org/index.php/Nftables#Workstation
11 # https://stosb.com/blog/explaining-my-configs-nftables/
12
13 flush ruleset
14
15 table inet filter {
16
17     define common_open_ports = {
18             xmpp-client,
19             xmpp-server,
20             5298, # Link-local XMPP, for backward compatibility, XEP-0174
21     }
22
23     set tcp_open_ports {
24         type inet_service
25         flags interval
26
27         elements = {
28             $common_open_ports,
29         }
30     }
31
32     set udp_open_ports {
33         type inet_service
34         flags interval
35
36         elements = {
37             $common_open_ports,
38         }
39     }
40
41     chain input {
42         type filter hook input priority 0;
43
44         ct state established,related accept
45         ct state invalid drop
46         ct state new jump in-new
47
48         iif lo accept
49
50         ip protocol icmp icmp type {
51             echo-reply,
52             echo-request,
53             time-exceeded,
54             parameter-problem,
55             destination-unreachable
56         } accept
57
58         # ICMPv6 configuration based on:
59         # https://github.com/intel/intel-iot-refkit/blob/master/meta-refkit-core/recipes-security/nftables-settings-default/files/firewall.template
60         ip6 nexthdr ipv6-icmp icmpv6 type {
61             echo-reply,
62             echo-request,
63             time-exceeded,
64             parameter-problem,
65             destination-unreachable,
66             packet-too-big
67         } accept
68
69         # Allow auto configuration support.
70         ip6 nexthdr ipv6-icmp icmpv6 type {
71             nd-router-advert,
72             nd-router-solicit,
73             nd-neighbor-advert,
74             nd-neighbor-solicit
75         } ip6 hoplimit 255 accept
76
77         # Allow multicast listener discovery on link-local addresses.
78         # RFC2710 specifies that a Hop-by-Hop Options header is used.
79         hbh nexthdr ipv6-icmp icmpv6 type {
80             mld-listener-query,
81             mld-listener-report,
82             mld-listener-reduction
83         } ip6 saddr fe80::/10 accept
84
85         # Allow multicast router discovery messages on link-local addresses (hop limit 1).
86         ip6 nexthdr ipv6-icmp icmpv6 type {
87             nd-router-advert,
88             nd-router-solicit
89         } ip6 hoplimit 1 ip6 saddr fe80::/10 accept
90
91         # Allow IGMPv3 queries.
92         ip protocol igmp ip daddr 224.0.0.1 accept
93
94         # Silently drop other incoming broadcast and multicast traffic.
95         meta pkttype {broadcast, multicast} drop
96
97         limit rate 3/minute burst 10 packets log prefix "[INPUT]: "
98         counter reject
99     }
100
101     chain in-new {
102         # Silently drop DHCPv4 Discover and Request packets from other clients.
103         ip saddr 0.0.0.0 ip daddr 255.255.255.255 udp sport bootpc udp dport bootps drop
104
105         # Silently drop DHCPv6 from other clients.
106         ip6 saddr fe80::/64 ip6 daddr fe80::/64 udp sport dhcpv6-client udp dport dhcpv6-server drop
107
108         # mDNS (ZeroConf/Bonjour)
109         ip  daddr 224.0.0.251 udp dport mdns accept
110         ip6 daddr ff02::fb    udp dport mdns accept
111
112         # SSDP: https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol
113         ip daddr 239.255.255.250 udp dport 1900 accept
114         ip6 daddr {
115             ff02::c,
116             ff05::c,
117             ff08::c,
118             ff0e::c
119         } udp dport 1900 accept
120
121         tcp dport @tcp_open_ports tcp flags & (fin | syn | rst | ack) == syn accept
122         udp dport @udp_open_ports accept
123     }
124
125     chain forward {
126         type filter hook forward priority 0;
127         limit rate 3/minute burst 10 packets log prefix "[FORWARD]: "
128         counter reject
129     }
130
131     chain output {
132         type filter hook output priority 0;
133         counter accept
134     }
135 }