Mrznuce FTP
Richard Willmann
mk7ygre33apsq23c at foo.sk
Tue Mar 17 05:18:43 CET 2009
> Je to tak, avsak ked sa prehladaju stavy, tak vysledkom nemusi byt iba
> povol, ale aj zahod. PFko zahadzuje pakety, ktore odpovedaju zaznamu v
> stavovej tabulke, ale prijaty paket neodpoveda zaznamenanemu stavu
> (neocakavane flagy alebo sekvencne cislo). Spominany pripad je taky, podla
> PF ide o uzavrete spojenie a pride paket so SYN flagom - podla PF taky
> paket tu nema co robit, tak ho zahodi.
ano, mas pravdu. pozrel som sa do man pfctl/pf.conf. Je celkom nechutne ze
to moze zahodit. Spravnejsie by asi bolo to nezahodit a pozriet sa do
pravidiel.
> Ano, ak bol pripojeni niekto iny, tak je to jedno. Ale ked sa pripaja ta
> ista IP adresa a pure-ftpd povedal klientovi, ze ma pouzit ten isty port,
> tak by to bol problem, ak by sa zvolil este rovnaky zdrojovy port. Nie su
> klienti za NATom?
su za NAT. Ak tomu spravne rozumiem, toto sa moze stat ak klient aj server
"priliz skoro" pouziju rovnaku dvojicu portov.
Ale vratme sa k nastaveniu PFka. Ty hovoris, ze riesenim by mohlo byt
nizenie tcp.closed na povadzme 20 sekund z povodnych 90.
Ale podla dokumentacie:
tcp.closed - The state after one endpoint sends an RST.
Tam ale predsa nikto neposiela RST...
Podla mna to funguje takto. Server povie klientovi "vezmi si data na porte
XY" a zacne na porte pocuvat. Klient sa pripoji. Prebehne TCP 3W handshake.
Server v cykle zacne data posielat a klient ich prijimat. Ked server posle
vsetko, zavola close() a urobi tzv. aktivny close tj. posle FIN. Cele sa to
dostane do stavu FIN_WAIT_1. Klient posle ACK pripadne aj s FIN. Tj.
spojenie sa moze zavriet v jednom alebo dvoch krokoch na konci ktorych je
ale TIME_WAIT. Ten by mal trvat 2 krat MSL. MSL je pre FreeBSD defaultne 30
sekund (pozrel som to v sysctl).
Cize 60 sekund by kernel nemal pridelit ten isty port lebo cokolvek co nan
pride z toho isteho paru IP/port (soketu) by mohol byt napr. lost duplicate.
K tomuto stavu by sa mal vztahovat PFkovy limit tcp.finwait:
The state after both FINs have been exchanged and the
connec-
tion is closed. Some hosts (notably web servers on
Solaris)
send TCP packets even after closing the connection.
Increas-
ing tcp.finwait (and possibly tcp.closing) can prevent
block-
ing of such packets.
Ten je ale 45 sekund tj. menej nez 2 krat 30.
Jedine co ma napadlo je, ze na vine je pure-ftpd, ktory si vybera porty z
rozsahu, ktory som mu povedal a serie na to, ze nesmie priliz rychlo
znovupouzit tie iste.
Jedno zle riesenie, ktore ma napadlo je nastavit "volne porty" na rovnaky
rozsah ako ten, ktory som povedal pure-ftpd, vynut na nich keep state a
nehovorit pure-ftpd, ktore porty ma pouzit. Toto by malo stacit k tomu, aby
tie porty prideloval kernel.
Budem sa ale musiet pozriet do zdrojakov, ako ich prideluje. Resp. ci v
pripade ak mu nepoviem ze chcem porty z tohoto rozsahu, ci necha ich
pridelenie na kerneli.
V kazdom pripade ma celkom serie, ze ked som teraz nastavil debug misc a
pustil tail -f na messages tak vsetko chodi :)
d~
rwi
More information about the Users-l
mailing list