3 # nftables ruleset for an End Node acting as a workstation in a LAN.
5 # Copyright (C) 2018 Antonio Ospite <ao2@ao2.it>
6 # SPDX-License-Identifier: MIT
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/
17 define common_open_ports = {
20 5298, # Link-local XMPP, for backward compatibility, XEP-0174
42 type filter hook input priority 0
47 ip protocol icmp icmp type {
52 destination-unreachable
55 # ICMPv6 configuration based on:
56 # https://github.com/intel/intel-iot-refkit/blob/master/meta-refkit-core/recipes-security/nftables-settings-default/files/firewall.template
57 ip6 nexthdr ipv6-icmp icmpv6 type {
62 destination-unreachable,
66 # Allow IPv6 Neighbor Discovery (RFC4861).
67 ip6 nexthdr ipv6-icmp icmpv6 type {
72 } ip6 hoplimit 255 accept
74 # Allow multicast listener discovery on link-local addresses.
75 # RFC2710 specifies that a Hop-by-Hop Options header is used.
76 hbh nexthdr ipv6-icmp icmpv6 type {
79 mld-listener-reduction
80 } ip6 saddr fe80::/10 accept
82 # Allow multicast router discovery messages on link-local addresses (hop limit 1).
83 ip6 nexthdr ipv6-icmp icmpv6 type {
86 } ip6 hoplimit 1 ip6 saddr fe80::/10 accept
88 # Allow IGMPv3 queries.
89 ip protocol igmp ip daddr 224.0.0.1 accept
91 # Stateful filtering for anything else.
92 ct state established,related accept
94 ct state new jump in-new
96 # Silently drop other incoming broadcast and multicast traffic.
97 meta pkttype {broadcast, multicast} drop
99 limit rate 3/minute burst 10 packets log prefix "[INPUT]: "
104 # Silently drop DHCPv4 Discover and Request packets from other clients.
105 ip saddr 0.0.0.0 ip daddr 255.255.255.255 udp sport bootpc udp dport bootps drop
107 # Silently drop DHCPv6 from other clients.
108 ip6 saddr fe80::/64 ip6 daddr fe80::/64 udp sport dhcpv6-client udp dport dhcpv6-server drop
110 # mDNS (ZeroConf/Bonjour)
111 ip daddr 224.0.0.251 udp dport mdns accept
112 ip6 daddr ff02::fb udp dport mdns accept
114 # SSDP: https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol
115 ip daddr 239.255.255.250 udp dport 1900 accept
121 } udp dport 1900 accept
123 tcp dport @tcp_open_ports tcp flags & (fin | syn | rst | ack) == syn accept
124 udp dport @udp_open_ports accept
128 type filter hook forward priority 0
131 limit rate 3/minute burst 10 packets log prefix "[FORWARD]: "
136 type filter hook output priority 0