Hello, thanks for answering.
Apologies, I was half on the run and forgot about basic information. Here they are; my current configuration works without issue although I am unsure if anything is messing with SQM/CAKE.
System board:
{
"kernel": "6.6.119",
"hostname": "turris",
"system": "ARMv8 Processor rev 4",
"model": "CZ.NIC Turris Mox Board",
"board_name": "cznic,turris-mox",
"rootfs_type": "btrfs",
"release": {
"distribution": "TurrisOS",
"version": "9.0.2",
"revision": "r29077+93-f415748ba8",
"target": "mvebu/cortexa53",
"description": "TurrisOS 9.0.2 f415748ba8e979757595d8619feddc3ec8aca788",
"builddate": "1765502369"
}
}
Network:
config interface 'loopback'
option device 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'
config globals 'globals'
option ula_prefix '[redacted]'
config interface 'wan'
option proto 'dslite'
option peeraddr '[redacted]'
option peeraddrdomain '[redacted]'
option tunlink 'wan6'
option mtu '1460'
option encaplimit 'ignore'
config interface 'lan'
option macaddr '[redacted]'
option proto 'static'
option ipaddr '192.168.1.1'
option netmask '255.255.255.0'
option _turris_mode 'managed'
option ip6assign '64'
option device 'br-lan'
option delegate '1'
config interface 'guest_turris'
option enabled '1'
option proto 'static'
option device 'br-guest-turris'
option ipaddr '10.111.222.1'
option netmask '255.255.255.0'
option ipv6 '0'
config device 'br_guest_turris'
option name 'br-guest-turris'
option type 'bridge'
option bridge_empty '1'
option igmp_snooping '1'
option multicast_querier '1'
config device 'br_lan'
option name 'br-lan'
option type 'bridge'
list ports 'lan1'
list ports 'lan2'
list ports 'lan3'
list ports 'lan4'
option igmp_snooping '1'
option multicast_querier '1'
config interface 'wan6'
option device 'eth0'
option proto 'dhcpv6'
option reqaddress 'try'
option extendprefix '1'
config device 'dev_wan'
option name 'eth0'
Wireless:
config wifi-device 'radio0'
option type 'mac80211'
option path '[redacted]'
option band '5g'
option channel '36'
option htmode 'VHT80'
option disabled '0'
option country '[redacted]'
config wifi-iface 'default_radio0'
option device 'radio0'
option network 'lan'
option mode 'ap'
option ssid '[redacted]'
option encryption 'sae'
option disabled '0'
option hidden '0'
option wpa_group_rekey '[redacted]'
option key '[redacted]'
config wifi-device 'radio1'
option type 'mac80211'
option path '[redacted]'
option band '5g'
option channel '34'
option htmode 'VHT80'
option disabled '1'
option country '[redacted]'
config wifi-iface 'default_radio1'
option device 'radio1'
option network 'lan'
option mode 'ap'
option ssid '[redacted]'
option encryption 'sae'
option disabled '1'
config wifi-iface 'guest_iface_0'
option disabled '0'
option device 'radio0'
option mode 'ap'
option ssid '[redacted]'
option network 'guest_turris'
option encryption 'sae'
option wpa_group_rekey '[redacted]'
option key '[redacted]'
option ifname 'guest_turris_0'
option isolate '1'
DHCP:
config dnsmasq
option domainneeded '1'
option boguspriv '1'
option filterwin2k '0'
option localise_queries '1'
option rebind_protection '1'
option rebind_localhost '1'
option local '/lan/'
option domain 'lan'
option expandhosts '1'
option nonegcache '0'
option cachesize '1000'
option authoritative '1'
option readethers '0'
option leasefile '/tmp/dhcp.leases'
option resolvfile '/tmp/resolv.conf.d/resolv.conf.auto'
option nonwildcard '1'
option localservice '1'
option ednspacket_max '1232'
option filter_aaaa '0'
option filter_a '0'
option port '0'
config dhcp 'lan'
option interface 'lan'
option start '100'
option limit '150'
option leasetime '12h'
option dhcpv4 'server'
option dhcpv6 'server'
option ra 'server'
option ndp 'relay'
option ra_default '2'
list ra_flags 'managed-config'
list ra_flags 'other-config'
option ra_maxinterval '1800'
option ra_mininterval '600'
option ra_lifetime '3600'
list dhcp_option '6,192.168.1.1'
config dhcp 'wan'
option interface 'wan'
option ignore '1'
config dhcp 'wan6'
option interface 'wan6'
option master '1'
option ra 'relay'
option ndp 'relay'
config odhcpd 'odhcpd'
option maindhcp '0'
option leasefile '/tmp/hosts/odhcpd'
option leasetrigger '/usr/sbin/odhcpd-update'
option loglevel '4'
option piofolder '/tmp/odhcpd-piofolder'
config dhcp 'guest_turris'
option interface 'guest_turris'
option ignore '0'
option start '100'
option limit '150'
option leasetime '12h'
option dhcpv6 'disabled'
option ra 'disabled'
option ndp 'disabled'
list dhcp_option '6,10.111.222.1'
Firewall:
config defaults
option syn_flood '1'
option input 'DROP'
option output 'ACCEPT'
option forward 'REJECT'
config zone
option name 'lan'
list network 'lan'
option input 'ACCEPT'
option output 'ACCEPT'
option forward 'ACCEPT'
config zone 'guest_turris'
option enabled '1'
option name 'tr_guest'
option input 'REJECT'
option forward 'REJECT'
option output 'ACCEPT'
list network 'guest_turris'
config zone
option name 'wan'
list network 'wan'
list network 'wan6'
option input 'REJECT'
option output 'ACCEPT'
option forward 'REJECT'
option masq '1'
option mtu_fix '1'
option sentinel_fwlogs '1'
option sentinel_minipot '1'
config forwarding
option src 'lan'
option dest 'wan'
config forwarding 'guest_turris_forward_wan'
option enabled '1'
option name 'guest to wan forward'
option src 'tr_guest'
option dest 'wan'
config rule
option name 'Allow-DHCP-Renew'
option src 'wan'
option proto 'udp'
option dest_port '68'
option target 'ACCEPT'
option family 'ipv4'
config rule
option name 'Allow-DHCPv6'
option src 'wan'
option proto 'udp'
option dest_port '546'
option family 'ipv6'
option target 'ACCEPT'
config rule
option name 'Allow-IGMP'
option src 'wan'
option proto 'igmp'
option family 'ipv4'
option target 'ACCEPT'
config rule
option name 'Allow-MLD'
option src 'wan'
option proto 'icmp'
option src_ip 'fe80::/10'
list icmp_type '130/0'
list icmp_type '131/0'
list icmp_type '132/0'
list icmp_type '143/0'
option family 'ipv6'
option target 'ACCEPT'
config rule
option name 'Allow-ICMPv6-Critical'
option src 'wan'
option proto 'icmp'
list icmp_type 'destination-unreachable'
list icmp_type 'packet-too-big'
list icmp_type 'time-exceeded'
list icmp_type 'router-solicitation'
list icmp_type 'neighbour-solicitation'
list icmp_type 'router-advertisement'
list icmp_type 'neighbour-advertisement'
option limit '100/sec'
option family 'ipv6'
option target 'ACCEPT'
config rule
option name 'Allow-ICMPv6-Echo'
option src 'wan'
option proto 'icmp'
list icmp_type 'echo-request'
list icmp_type 'echo-reply'
option limit '10/sec'
option limit_burst '20'
option family 'ipv6'
option target 'ACCEPT'
config rule
option name 'Allow-ICMPv6-Errors'
option src 'wan'
option proto 'icmp'
list icmp_type 'bad-header'
list icmp_type 'unknown-header-type'
option limit '50/sec'
option family 'ipv6'
option target 'ACCEPT'
config rule
option name 'Allow-ICMPv6-Forward-Critical'
option src 'wan'
option dest '*'
option proto 'icmp'
list icmp_type 'destination-unreachable'
list icmp_type 'packet-too-big'
list icmp_type 'time-exceeded'
option limit '100/sec'
option family 'ipv6'
option target 'ACCEPT'
config rule
option name 'Allow-ICMPv6-Forward-Echo'
option src 'wan'
option dest '*'
option proto 'icmp'
list icmp_type 'echo-request'
list icmp_type 'echo-reply'
option limit '10/sec'
option limit_burst '20'
option family 'ipv6'
option target 'ACCEPT'
config rule
option name 'Allow-ICMPv6-Forward-Errors'
option src 'wan'
option dest '*'
option proto 'icmp'
list icmp_type 'bad-header'
list icmp_type 'unknown-header-type'
option limit '50/sec'
option family 'ipv6'
option target 'ACCEPT'
config rule 'guest_turris_dns_rule'
option enabled '1'
option name 'guest dns rule'
option src 'tr_guest'
option proto 'tcpudp'
option dest_port '53'
option target 'ACCEPT'
config rule 'guest_turris_dhcp_rule'
option enabled '1'
option name 'guest dhcp rule'
option src 'tr_guest'
option proto 'udp'
option src_port '67-68'
option dest_port '67-68'
option target 'ACCEPT'
config rule
option name 'Drop-ULA-Leak-to-WAN'
option src 'lan'
option dest 'wan'
option src_ip 'fd14:c1b6:c8e8::/48'
option family 'ipv6'
option target 'REJECT'
config rule
option name 'Drop-ULA-Leak-Guest-to-WAN'
option src 'tr_guest'
option dest 'wan'
option src_ip 'fd14:c1b6:c8e8::/48'
option family 'ipv6'
option target 'REJECT'
config rule
option enabled '1'
option name 'Rate-Limit-ICMP-Accept'
option src 'wan'
option proto 'icmp'
option icmp_type 'echo-request'
option family 'ipv4'
option limit '1/sec'
option limit_burst '5'
option target 'ACCEPT'
config rule
option enabled '1'
option name 'Rate-Limit-ICMP-Drop'
option src 'wan'
option proto 'icmp'
option icmp_type 'echo-request'
option family 'ipv4'
option target 'DROP'
config rule
option enabled '1'
option name 'Rate-Limit-ICMPv6-Accept'
option src 'wan'
option proto 'icmp'
option icmp_type 'echo-request'
option family 'ipv6'
option limit '1/sec'
option limit_burst '5'
option target 'ACCEPT'
config rule
option enabled '1'
option name 'Rate-Limit-ICMPv6-Drop'
option src 'wan'
option proto 'icmp'
option icmp_type 'echo-request'
option family 'ipv6'
option target 'DROP'
config include 'user_settings'
option enabled '1'
option fw4_compatible '1'
option type 'script'
option path '/etc/firewall.user'
config include 'bcp38'
option type 'script'
option path '/usr/lib/bcp38/run.sh'
config include 'sentinel_firewall'
option type 'script'
option path '/usr/libexec/sentinel/firewall.sh'
config redirect 'adblock_tr_guest53'
option name 'Adblock DNS (tr_guest, 53)'
option src 'tr_guest'
option proto 'tcp udp'
option src_dport '53'
option dest_port '53'
option target 'DNAT'
option family 'any'
config rule 'adblock_tr_guest853'
option name 'Adblock DNS (tr_guest, 853)'
option src 'tr_guest'
option proto 'tcp udp'
option dest_port '853'
option target 'REJECT'
option dest '*'
config rule 'adblock_tr_guest5353'
option name 'Adblock DNS (tr_guest, 5353)'
option src 'tr_guest'
option proto 'tcp udp'
option dest_port '5353'
option target 'REJECT'
option dest '*'
Also my custom firewall.user for good measure:
#!/bin/sh
nft -f - << 'EOF'
insert rule inet fw4 input position 0 ct state established,related accept comment "Fast-path: established connections"
insert rule inet fw4 forward position 0 ct state established,related accept comment "Fast-path: established forwards"
add rule inet fw4 input ct state invalid counter drop comment "Drop invalid INPUT"
add rule inet fw4 forward ct state invalid counter drop comment "Drop invalid FORWARD"
add rule inet fw4 input tcp flags & (fin|syn|rst|ack) != syn ct state new counter drop comment "Drop non-SYN NEW connections"
add rule inet fw4 input ip saddr { \
0.0.0.0/8, \
# 10.0.0.0/8, \
100.64.0.0/10, \
127.0.0.0/8, \
169.254.0.0/16, \
# 172.16.0.0/12, \
192.0.0.0/24, \
192.0.2.0/24, \
# 192.168.0.0/16, \
198.18.0.0/15, \
198.51.100.0/24, \
203.0.113.0/24, \
224.0.0.0/3 \
} counter drop comment "Drop IP bogons (all interfaces)"
add rule inet fw4 input ip6 saddr fc00::/7 counter drop comment "Drop IPv6 bogons (all interfaces)"
add rule inet fw4 input tcp flags & (fin|syn|rst|psh|ack|urg) == 0x0 counter drop comment "Drop NULL scan"
add rule inet fw4 input tcp flags & (syn|fin) == (syn|fin) counter drop comment "Drop SYN-FIN scan"
add rule inet fw4 input tcp flags & (fin|syn|rst|psh|ack|urg) == (fin|syn|rst|psh|ack|urg) counter drop comment "Drop XMAS scan"
add rule inet fw4 input ip frag-off & 0x1fff != 0 counter drop comment "Drop IPv4 fragments"
add rule inet fw4 input tcp flags syn tcp option maxseg size 1-535 log prefix "MSS_FILTERING: " counter drop comment "Drop suspicious small MSS"
add rule inet fw4 input ct state new limit rate over 60/second burst 100 packets counter drop comment "Rate limit NEW connections"
add set inet fw4 ssh_ratelimit { type ipv4_addr; size 65536; flags dynamic,timeout; timeout 1m; }
add rule inet fw4 input tcp dport 1922 ct state new add @ssh_ratelimit { ip saddr limit rate over 3/minute } log prefix "SSH_BRUTE_FORCE: " drop comment "SSH brute-force protection"
EOF
# Check if nftables commands succeeded
if [ $? -eq 0 ]; then
logger -t firewall "Custom hardening rules applied successfully"
echo "Custom firewall hardening rules applied (nftables)"
else
logger -t firewall -p err "Failed to apply custom hardening rules"
echo "ERROR: Failed to apply custom hardening rules"
fi