|
|
Myšlenky k budoucím implementaci TCP stacku pro použití v DNS serveru poslouchajícím po TCP na XDP rozhraní. Cílem je splnění všech požadavků TCP a zároveň odolnost proti slow-loris a podobným útokům.
|
|
|
|
|
|
## Kontext spojení
|
|
|
|
|
|
TODO vymyslet co nejmenší datovou strukturu, která bude udržovat informace o spojení.
|
|
|
|
|
|
TODO bude se lišit kontext teprve navazovaného (po SYN) a už navázaného spojení? (Ochrana proti SYN flood)
|
|
|
|
|
|
Kontexty spojení se budou udržovat v hešovací tabulce.
|
|
|
|
|
|
TODO najít vhodnou hešovací funkci, která na zadanou čtveřici src+dst addr+port vrátí číslo z rozsahu 1..N, kde N lze nastavit.
|
|
|
|
|
|
TODO romyslet ošetření hešovacích konfliktů. Je lepší spoják nebo obsazení dalšího políčka?
|
|
|
|
|
|
## Obecně k bufferům
|
|
|
|
|
|
Kdykoli je potřeba ke spojení udržovat nějaký typ bufferu (viz dále), bude se to dělat následujícím způsobem.
|
|
|
|
|
|
Buffer pool pro uričtý typ bufferů bude mít konfigurovatelnou max velikost jednoho bufferu a max číslo jejich počtu, a to tak, aby při běžném provozu byl zaplněný jen třeba z desetiny. Při útoku, když buffery dojdou, se:
|
|
|
- nikdy neodmítne vytvoření nového bufferu
|
|
|
- k jeho vytvoření se uvolní náhodně vybraný starý buffer (náhodnost zajistí hešovací funkce), přičemž se ještě "koukne vedle" jestli není lepší kandidát na uvolnění. Bude tudíž velice pravděpodobné, že útočník si vytvořením nového problematického spojení jen zabije jedno ze svých vlastních předchozích spojení.
|
|
|
- staré buffery se nebudou mazat na základě časovače aka `tcp-remote-io-timeout` (to by vyžadovalo nějaký takový časovač / garbage collector implementovat) ale jen v následujících situacích:
|
|
|
* data v bufferu byla úspěšně zpracována
|
|
|
* celé TCP spojení bylo uzavřeno (např. `tcp-idle-timeout`)
|
|
|
* buffer uvolněn z důvodu vytvoření nového bufferu
|
|
|
|
|
|
## Konkrétně k bufferům
|
|
|
|
|
|
Bude potřeba mít následující buffer pooly:
|
|
|
- na uložení dat z out-of-order packetů
|
|
|
- na uložení DNS zpráv, které nepřijdou najednou ale budou roztahané po více TCP rámcích
|
|
|
- na uložení odchozích dat, které nebude protistrana dost rychle přijímat |
|
|
\ No newline at end of file |