Hi Frank,
Hi all
I came across your posing on netfilter-dev of and i share your
opinion that it would be a cool feature for linux-based firewall.
I'd be glad to hear from you that you still want to implement
this and i'd like to participate.
As I didn't fond anything about your proposal being developped
in the list, i'll continue from this old one
Here are my ideas about to how to do it.
- This should be implemented as target/matching module to allow
people to select connections they want to protect with this feature.
- The modules we could use as examples are the REJECT target
because it generates a new packet and the CONNMARK target
because it stores data in the connection context. Window tracking
patch because it deals with SYN and ACK values.
Working principle(with variations):
0) we match the new incomming syn packet with conventional syntax
1) The COOKIE target will drop the incomming SYN packet and
generate the reply synack packet with the cookie.
usage: -j COOKIE --syn
2) The cookie match module (-m cookie) or the extention of the
state module (-m state --state COOKIE) will match the third packet
of the handshake.
Possible feature: several classes of cookies using different
"salt" in the crypto funtion allowing following
"-j COOKIE --syn --class xx" and then "-m cookie --class xx yy"
where xx is an integer and yy is a mask. This feature would
probabely require a separate matching module.
Beware that lots of classes will weaken cookies.
3) The COOKIE --synack target will register the connection and store
the
cookie we sent (which came came back), we need this because the
server
will answer with it's own ACK number that has to be incremented by
the
cookie-offset. Then this same target will generate the syn packet
sent
to the targeted server.
2)+3) usage:
-m cookie --state SYN -j COOKIE --synack
or
-m state --state COOKIE -j COOKIE --synack
4) Now we need either a couple of module/target to match the synack
packet
comming back from the server to send it back the ack:
-m cookie --state SYNACK -j COOKIE --ack
(and in this case the cookie module would get the option --syn in step
2).
or extend the conntrack/ACCEPT code to do this silently and declare
the
server's synack packet as established:
-m state --state ESTABLISED -j ACCEPT (this one would be good for
performance, but see unanswered quetions
below)
or
-m state --state COOKIE2 -j COOKIE --ack
5) Remaining packets will need to fix their SYN/ACK values because of
the
initial cookie. Again we need to decide between extending conntrack
and creating dedicated match/target.
Extending module would lead to simply have
-m state --state ESTABLISED -j ACCEPT
Using dedicated match/target
-m cookie --state ACK -j COOKIE --fix
Questions that i have no answered yet:
- What to do if the server is down
- How to avoid breaking nat
- How to handle the ACCEPT target if we extend conntrack code to
deal with the third packet from the server and declare it
ESTABLISHED
- Is there a trick that could allow us to not to store context before
receiving the third ack from the server
- What are good(clear) names for matches/targets options: the sequence
(--syn), (SYN => --synack), (SYNACK => --ack), (ACK=> --fix)
is logical, but may be misleading
- What are pitfalls i've missed.
Sorry for my poor english
Best regards,
Michel