Kategoria: Linux, VoIP

TeamSpeak – Ochrona przed flood

2009 Wrzesień 28 – 12:23

Mimo tego ze TeamSpeak to chyba najgorszy z chatow glosowych, jest bardzo rozpowszechniony (pewnie dlatego ze byl jednym z pierwszych). Jego minusy mozna by dlugo wymieniac, ale ogranicze sie do dwoch najwiekszych:

  • hasla w bazie danych nie sa szyfrowane !!! w ogole !!!
  • lista banow zawiera tylko 20 pozycji
    przy zapchaniu listy, nowe bany nie sa dodawane (nikt nie jest banowany)

Pierwszy problem jest bardzo prosty do rozwiazania, trzeba bardzo uwazac na swoja baze danych uzytkownikow (zwrocic uwage na to kto moze, a kto nie moze tego pliku czytac, kto ma dostep do konta na ktorym biega TS itp).

TeamSpeak AntiFlood

Drugi problem, ktorym zajme sie doglebniej, jest bardzo czestym powodem problemow z serwerem. Mianowicie skuteczne floodowanie serwera uniemozliwa jego prace (20 banow zapelnia sie bardzo szybko), a jesli nawet serwer moze pracowac, to utrudnione jest korzystanie z niego (pelno komunikatow o wchodzacych i wychodzacych uzytkownikach). W najgorszym (ale wcale nie rzadkim) przypadku, serwer zawiesza sie.

Naturalnie mozna pisac skrypty do perl_mod, ale perl_mod potrafi skutecznie zezrec duzo mocy serwera. Najlepiej skorzystac z narzedzi ktore mamy juz dostepne.

iptables prosty TeamSpeak AntiFlood

Wpisanie ponizszych linijek do tablic iptables, spowoduje ze problem floodow prawie przestanie istniec:
iptables -A INPUT -p udp --dport 8767 -m length --length 208 -m state --state NEW -m recent --set --name TS
iptables -A INPUT -p udp --dport 8767 -m recent --update --seconds 30 --hitcount 3 --rttl --name TS -j DROP

Pakiet o dlugosci 208 (wielkosc pakietu logowania) przychodzacy na port UDP 8767 (standardowy port TS), jest zliczany. Jesli z jednego adresu IP przyjda 3 takie pakiety w ciagu 30 sekund, dalsze pakiety sa odrzucane (na okres 30 sekund od czasu przyjscia ostatniego pakietu).
UWAGA: Kazdy kolejny pakiet, przychodzacy w czasie bana odnawia czas bana ! Czyli floodujac bez przerwy przez np 10 minut, przejda jedynie 2 pierwsze pakiety, a potem reszta bedzie blokowana. Ban zostanie zniesiony, jesli przez 30 sekund nie przyjdzie zaden pakiet logowania z danego adresu IP.

iptables zrzucanie duzych pakietow

Wiem ze niektorzy maja wielka radoche z psucia cudzych zabawek. Niestety nie za bardzo istnieje mozliwosc doprowadzenia takiej osoby do pionu, taki wiec w pierszej kolenosci nalezy sie odpowiednio bronic.
Studiujac skrypty do floodowania TS ktore znalazlem w internecie, od razu rzucilo mi sie w oczy ze skrypty te wysylaja pakiety losowej wielkosci od 1 do 65k. Jest to oczywisce poniewaz wiekszych pakietow nie da sie prosto przeslac, a im wiekszy pakiet tym wiecej zajmuje serwerowi czasu, zeby go przejrzec i odpowiedziec.

TeamSpeak nie przesyla pakietow wiekszych niz 1k !!! (z moich badan wynika ze te pakiety nigdy nie sa wieksze niz 600, ale zalozmy pewien margines bezpieczenstwa). Linijka:
iptables -A INPUT -p udp --dport 8767 -m length --length 1000: -j DROP
zalatwia sprawe duzych pakietow. Wszystkie pakiety wyslane na port UDP 8768 wieksze niz 1000 sa odrzucane. W ten sposob serwer TS nie otrzymuje tych pakietow i nie musi sie z nimi meczyc.

iptables logowanie floodow

Aby moc przegladac logi, kiedy ktos nas floodowal, nalezy dodac jedna linijke kodu. Tak wiec cale zapytanie bedzie wygladac nastepujaco:
iptables -A INPUT -p udp --dport 8767 -m length --length 208 -m state --state NEW -m recent --set --name TS
iptables -A INPUT -p udp --dport 8767 -m recent --update --seconds 30 --hitcount 3 --rttl --name TS -m limit --limit 1/hour -j LOG --log-prefix "TS_flood "
iptables -A INPUT -p udp --dport 8767 -m recent --update --seconds 30 --hitcount 3 --rttl --name TS -j DROP

W logach systemu znajdziemy odpowiednie wpisy. Fragment –limit 1/hour oznacza ze logowanie okreslonego flooda bedzie jedynie raz na godzine. Jesli usuniemy ten fragment, logowany bedzie kazdy pakiet ktory spowoduje flooda i w ten sposob zapchamy cale logi serwera.

iptables TeamSpeak AntiFlood na okreslony adres IP

Jesli nasz serwer ma pare adresow IP, a my chcemy filtrowac tylko jeden (np TS chodzi na jednym z nich), to nalezy dodac opcje -d. Naturalnie w zmiennej IPADDR nalezy podac swoj adres IP.
IPADDR=127.0.0.1
iptables -A INPUT -d $IPADDR -p udp --dport 8767 -m recent --update --seconds 30 --hitcount 3 --rttl --name TS -j DROP
iptables -A INPUT -d $IPADDR -p udp --dport 8767 -m length --length 208 -m state --state NEW -m recent --set --name TS

Dla bardziej zaawansowanych wpisow, sugeruje przeczytac manual od iptables.

outlook

Przy filtrowaniu pakietow logowania, mozna by, oprocz wielkosci pakietu, rowniez sprawdzac tresc pakietu. W czasie wielodniowych pomiarow, jedynie pakiet logowania mial wielkosc 208 (razem z naglowkami itp), tak wiec wydalo mi sie to zbedne.
Tak czy owak, pakiet logowania zawiera w sobie bardzo charakterystyczny wpis „TeamSpeak” ktory by ulatwil jego odfiltrowanie, ale to tylko dla nadgorliwych.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *