Hello Yves, Thank you for your configuration. I looked over it and see that you are indeed using the "timeout 0s" to achieve what I was looking to achieve. It seems that when I create a rule to do this, the "timeout 0s" simply gets removed. I even copied your entire config and started my nftables with it and as you can see below, all of the places where "timeout 0s" was present in your config, it no longer exists in the actual running configuration. I simply cleared nftables of all rules, than ran "nft -f /path/to/your/config/file" and then "nft list ruleset -nn" and below is the result. Does yours show this as well? When I tested it, any "set update" would simply restart the timeout to 1m. Is your configuration doing this as well? I'm on kernel 4.14.35 and nftables version 0.8.3 in Gentoo. ================================================= table ip Inet4 { set Knocked_1 { type ipv4_addr timeout 10s gc-interval 4s } set Knocked_2 { type ipv4_addr timeout 10s gc-interval 4s } set Knocked_3 { type ipv4_addr timeout 10s gc-interval 4s } set Knocked_4 { type ipv4_addr timeout 2m gc-interval 4s } chain Knock_1 { set add ip saddr @Knocked_1 } chain Unknock_1 { set update ip saddr @Knocked_1 } chain Knock_2 { set update ip saddr @Knocked_1 set add ip saddr @Knocked_2 } chain Unknock_2 { set update ip saddr @Knocked_2 } chain Knock_3 { set update ip saddr @Knocked_2 set add ip saddr @Knocked_3 } chain Unknock_3 { set update ip saddr @Knocked_3 } chain Knock_4 { set update ip saddr @Knocked_3 set add ip saddr @Knocked_4 log prefix "Port-Knock accepted: " } chain RefreshKnock { set update ip saddr timeout 2m @Knocked_4 } chain PortKnock { ct state new ip saddr @Knocked_4 goto RefreshKnock tcp dport 456 ct state new ip saddr @Knocked_3 goto Knock_4 tcp dport 345 ct state new ip saddr @Knocked_3 return ip saddr @Knocked_3 ct state new goto Unknock_3 tcp dport 345 ct state new ip saddr @Knocked_2 goto Knock_3 tcp dport 234 ct state new ip saddr @Knocked_2 return ip saddr @Knocked_2 ct state new goto Unknock_2 tcp dport 234 ct state new ip saddr @Knocked_1 goto Knock_2 tcp dport 123 ct state new ip saddr @Knocked_1 return ip saddr @Knocked_1 ct state new goto Unknock_1 tcp dport 123 ct state new goto Knock_1 } chain FilterIn { type filter hook input priority 0; policy drop; ct state { established, related } accept ct state invalid drop iif "lo" accept ip protocol icmp accept jump PortKnock } chain FilterOut { type filter hook output priority 0; policy accept; } } ================================================= On Fri, Apr 27, 2018 at 08:50:11AM +0200, nft.ml@xxxxxxxx wrote: > Hi rypervenche, > > I have a working port-knocking nft firewall with this setup: > http://yalis.fr/public/knock_nftables.conf > > In this example, the ports to knock are 123 234 345 456.A > I hope this helps. Cheers, > > Yves. > > On Thu, 26 Apr 2018, rypervenche wrote: > > Hello, > > > > I'm looking to set up something of a port knocker in nftables. While I > > can do this with sets with timeouts, I also would like the flexibility > > to be able to remove an IP from one of said sets if the next packet that > > gets sent from the source address is not the port in the specific order > > I have chosen. This way port scanners would not be able to bruteforce all > > of the ports within the timeout that I have chosen. > > > > Would it be possible to request the addition of a "delete" operation to > > the following feature? https://wiki.nftables.org/wiki-nftables/index.php/Updating_sets_from_the_packet_path > > > > If this is not possible, would it be possible to use the "update" > > operation to set the timeout to "0s" and this have it immediately delete > > the element in question? Currently trying to update the element with the > > timeout 0s does not update the timeout, however non-zero timeouts do > > work. > > > > While my syntax is likely not correct here, this is essentially the idea > > in mind: > > > > table inet filter { > > set knock1 { type ipv4_addr; timeout 5s; } > > set knock2 { type ipv4_addr; timeout 5s; } > > set knock3 { type ipv4_addr; timeout 5s; } > > chain input { > > type filter hook input priority 0; policy drop; > > ct state established,related accept > > ... cut for space ... > > meta nfproto ipv4 counter packets 0 bytes 0 jump knock > > meta l4proto tcp counter packets 0 bytes 0 reject with tcp reset > > meta nfproto ipv4 counter packets 0 bytes 0 reject with icmp type prot-unreachable > > counter packets 0 bytes 0 reject > > } > > chain knock { > > tcp dport 1111 ct state new tcp flags & (syn|rst|ack|fin) == syn counter packets 0 bytes 0 set add ip saddr @knock1 reject > > tcp dport != 2222 ip saddr @knock1 counter packets 0 bytes 0 set update ip saddr timeout 0s @knock1 > > tcp dport 2222 ip saddr @knock1 ct state new tcp flags & (syn|rst|ack|fin) == syn counter packets 0 bytes 0 set add ip saddr @knock2 reject > > tcp dport != 3333 ip saddr @knock2 counter packets 0 bytes 0 set update ip saddr timeout 0s @knock2 > > tcp dport 3333 ip saddr @knock2 ct state new tcp flags & (syn|rst|ack|fin) == syn counter packets 0 bytes 0 set add ip saddr @knock3 reject > > tcp dport != 4444 ip saddr @knock3 counter packets 0 bytes 0 set update ip saddr timeout 0s @knock3 > > tcp dport 4444 ip saddr @knock3 ct state new tcp flags & (syn|rst|ack|fin) == syn counter packets 0 bytes 0 accept > > } > > } > > > > Any and all help with this would be greatly appreciated. > > > > Thank you, > > > > rypervenche > > -- > > To unsubscribe from this list: send the line "unsubscribe netfilter" in > > the body of a message to majordomo@xxxxxxxxxxxxxxx > > More majordomo info at http://vger.kernel.org/majordomo-info.html > > -- To unsubscribe from this list: send the line "unsubscribe netfilter" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html