Re: Explanation of 2 Rules

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 24/08/2020 10:39, Thomas Luening wrote:
Hi David,

Am 22.08.20 um 21:12 schrieb david@xxxxxxxxx:
 > why don't you simplify and just DROP INVALID?
 >
> INVALID drops any possible incorrect combination. You don't need to write anymore as in iptables

thank you for your answer, but that makes it a little more complicated for me now. Now my question has 2 aspects.

The first one is still the syntax question. Detached from the logic (invalid) I would still like to know if I interpreted the syntax of the statement correctly.

Your interpretation appears correct to me.


The second (new) aspect is the ct-state "invalid". To help, I looked at 4 presentations by F. Westphal, 1 by P. Ayuso, 1 by R. Spenneberg, plus man-pages and lots of web sites. In fact, I can't find any better explanation of what marks a package as invalid than in linuxtopia:

https://www.linuxtopia.org/Linux_Firewall_iptables/x1347.html
"The INVALID state means that the packet can't be identified or that it does not have any state. This may be due to several reasons, such as the system running out of memory or ICMP error messages that do not respond to any known connections. Generally, it is a good idea to DROP everything in this state."

Well, why is an xmas packet invalid, if it can be identified and has a status (even several, depending on the view/query).

I am by no means a Netfilter hacker but I think that I can shed some light on this. I didn't see David's post but you should know that the TCP connection tracking code contains a TCP state transition table [1], as well as a table of valid flag combinations [2]. The first is harder to digest, so here are a few examples of how a decision can be made based on its contents. Consider the lines that read as follows:

/*           sNO, sSS, sSR, sES, sFW, sCW, sLA, sTW, sCL, sS2   */
/*synack*/ { sIV, sIV, sSR, sIV, sIV, sIV, sIV, sIV, sIV, sSR },

Now imagine that nf_conntrack observes a SYN-ACK packet completely out of the blue. It has no relationship with any existing flow. As far as the state machine is concerned, the present conntrack state to be ascribed to the packet is NONE (sNO). The first element of the tuple has a value of sIV (INVALID), dictating that it is not possible to transition to any other legitimate state. Instead, the packet must be considered as invalid.

Now consider the second element. If the SYN-ACK packet can be associated with an existing conntrack table entry that is presently in a state of SYN_SENT (sSS), then, again, the packet may not incur a transition to some other legitimate state. Instead, it must be considered as invalid. Why? Because it is not legal for the peer to send SYN-ACK immediately after SYN.

And so it goes on. All of this is supplemented by a general check which prevents packets with obviously incorrect flag combinations from being accepted (before the state transition table is consulted).


BTW, I've been using "invalid" for a long time, but at the moment I can't find out if "state invalid" actually marks xmas packages.

Best Regards, Tom

[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/net/netfilter/nf_conntrack_proto_tcp.c?h=v5.8#n110

[2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/net/netfilter/nf_conntrack_proto_tcp.c?h=v5.8#n700

--
Kerin Millar



[Index of Archives]     [Linux Netfilter Development]     [Linux Kernel Networking Development]     [Netem]     [Berkeley Packet Filter]     [Linux Kernel Development]     [Advanced Routing & Traffice Control]     [Bugtraq]

  Powered by Linux