İbrahim Ercan <[email protected]> wrote:
> On Tue, Jun 18, 2019 at 1:40 PM Florian Westphal <[email protected]> wrote:
> >
> > Problem is that we do not keep any state. Syncookes are restricted to 4
> > mss value:
> > static __u16 const msstab[] = {
> > 536,
> > 1300,
> > 1440, /* 1440, 1452: PPPoE */
> > 1460,
> > };
> >
> > So, 1260 forces lowest value supported.
> >
> > The table was based off a research paper that had mss distribution
> > tables. Maybe more recent data is available and if things have changed
> > we could update the table accordingly.
>
> I am confused. So this statement from manual page is just a illusion?
> --mss maximum segment size
> Maximum segment size announced to clients. This must
> match the backend.
?
Your question was about MSS sent to server.
Flow is this:
Client Synproxy Server
-> Syn, mss X
<-Synack,mss M
-> ACK
-> Syn, mss Y
M is what you need to configure via --mss switch.
Because Synproxy keeps no state, it can only send
to real server the MSS that was encoded in syncookie (in synack)
packet. Therefore, X == Y only if the Value from client matches
exactly one for the four values of the mss table, in all other
cases Y is the next lowest available one. In your case thats 536.
> I don't understand why these restriction exist. Why can't we set mss
> value same as what client send to us?
We only have 2 bits out of the 32Bit Sequence number for MSS. Increasing
mss state table reduces security margin of the cookie.