I have no idea (yet) what im doing.
But this works ( crippled i think but it works)
Can't remember where i got it from :( Sorry original author, and thanks )
However it does timeout my eix-sync and dhclient complains about ipv6 not permitted because of the drop state ( working on that )
Maybe you can figure it out.
#==== TO LIST sudo nft list ruleset #==== TO DISCRIBE PORTS do sudo nft describe tcp dport flush ruleset table inet filter { set tcp_accepted { type inet_service; flags interval; elements = { http, https,rsync, } } set udp_accepted { type inet_service; flags interval; elements = { domain, } } chain base_checks { # allow established/related connections ct state {established, related} accept # early drop of invalid connections ct state invalid log prefix "Invalid Input Connection: " drop } chain input { type filter hook input priority 0; policy drop; jump base_checks # allow from loopback iifname lo accept # allow icmp ip protocol icmp icmp type { echo-request, echo-reply, time-exceeded, parameter-problem, destination-unreachable } accept ip6 nexthdr icmpv6 icmpv6 type { echo-request, echo-reply, time-exceeded, parameter-problem, destination-unreachable, packet-too-big, nd-router-advert, nd-router-solicit, nd-neighbor-solicit, nd-neighbor-advert, mld-listener-query } accept # allow ports #tcp dport @tcp_accepted accept #udp dport @udp_accepted accept # everything else reject with icmpx type port-unreachable } chain forward { type filter hook forward priority 0; policy drop; log prefix "Dropped Forward Connection: " } chain output { type filter hook output priority 0; policy drop; jump base_checks # allow ports tcp dport @tcp_accepted accept udp dport @udp_accepted accept #log prefix "Invalid Output Connection: " Warning : This floods logs } }
I thought I could try help spidark. This is how I incrementally tried to resolve this.
As a first step, before I try fix anything, I simply rewrite these rules so I can understand them better.
I want to read compact clean code. So remove spurious lines.
flush ruleset table inet filter { set tcp_accepted { type inet_service; flags interval; elements = { http, https,rsync, } } set udp_accepted { type inet_service; flags interval; elements = { domain, } } chain base_checks { ct state {established, related} accept ct state invalid log prefix "Invalid Input Connection: " drop } chain input { type filter hook input priority 0; policy drop; jump base_checks iifname lo accept ip protocol icmp icmp type { echo-request, echo-reply, time-exceeded, parameter-problem, destination-unreachable } accept ip6 nexthdr icmpv6 icmpv6 type { echo-request, echo-reply, time-exceeded, parameter-problem, destination-unreachable, packet-too-big, nd-router-advert, nd-router-solicit, nd-neighbor-solicit, nd-neighbor-advert, mld-listener-query } accept reject with icmpx type port-unreachable } chain forward { type filter hook forward priority 0; policy drop; log prefix "Dropped Forward Connection: " } chain output { type filter hook output priority 0; policy drop; jump base_checks tcp dport @tcp_accepted accept udp dport @udp_accepted accept } }
I remove the chains base_checks, and move those rules as-in where they were called.
flush ruleset table inet filter { set tcp_accepted { type inet_service; flags interval; elements = { http, https,rsync, } } set udp_accepted { type inet_service; flags interval; elements = { domain, } } chain input { type filter hook input priority 0; policy drop; ct state {established, related} accept ct state invalid log prefix "Invalid Input Connection: " drop iifname lo accept ip protocol icmp icmp type { echo-request, echo-reply, time-exceeded, parameter-problem, destination-unreachable } accept ip6 nexthdr icmpv6 icmpv6 type { echo-request, echo-reply, time-exceeded, parameter-problem, destination-unreachable, packet-too-big, nd-router-advert, nd-router-solicit, nd-neighbor-solicit, nd-neighbor-advert, mld-listener-query } accept reject with icmpx type port-unreachable } chain forward { type filter hook forward priority 0; policy drop; log prefix "Dropped Forward Connection: " } chain output { type filter hook output priority 0; policy drop; ct state {established, related} accept ct state invalid log prefix "Invalid Input Connection: " drop tcp dport @tcp_accepted accept udp dport @udp_accepted accept } }
This shows us that sets - tcp_accepted and udp_accepted - are probably unnecessary as they are only used the one time. Sets are more useful, if we use them repeatedly many times.
So, I move those sets inline too.
flush ruleset table inet filter { chain input { type filter hook input priority 0; policy drop; ct state {established, related} accept ct state invalid log prefix "Invalid Input Connection: " drop iifname lo accept ip protocol icmp icmp type { echo-request, echo-reply, time-exceeded, parameter-problem, destination-unreachable } accept ip6 nexthdr icmpv6 icmpv6 type { echo-request, echo-reply, time-exceeded, parameter-problem, destination-unreachable, packet-too-big, nd-router-advert, nd-router-solicit, nd-neighbor-solicit, nd-neighbor-advert, mld-listener-query } accept reject with icmpx type port-unreachable } chain forward { type filter hook forward priority 0; policy drop; log prefix "Dropped Forward Connection: " } chain output { type filter hook output priority 0; policy drop; ct state {established, related} accept ct state invalid log prefix "Invalid Input Connection: " drop tcp dport {http,https,rsync} accept udp dport {domain} accept } }
Nothing has changed yet. The ruleset is still the same.
Now I can start modifying the ruleset, as all the logic is inline and not jumping about. Once we have a clean working rulset, we can create additional chains, sets, etc. where necessary to reduce the ruleset further.
Is this easier to understand the logic flow and/or troubleshoot?
[1] Explaining My Configs: nftables
No comments:
Post a Comment