Detekcja ruchu BitTorrent z wykorzystaniem zapory warstwy 7

Każdy na pewno spotkał się z protokołem BitTorrent lub prościej tzw. Torrentami. Teoretycznie wygodny protokół komunikacji P2P umożliwiający wymianę plików. W praktyce jednak wykorzystywany często do pobierania materiałów udostępnianych nielegalnie. Jednak nie o to w tym artykule chodzi. Pokażę tutaj jak wykorzystać funkcjonalność systemu RouterOS do wykrywania takiego ruchu.


Artykuł został przygotowany przy użyciu systemu RouterOS w wersji 6.43.8 (stable).

Firewall warstwy 7

Na początku musimy zdefiniować wyrażenie którym będzie sprawdzany każdy pakiet. Robimy to wchodząc w menu IP->Firewall i przechodzimy do zakładki „Layer7 Protocols”. Dodajemy nowy wpis, nazwę ustalamy dowolną natomiast w polu Regexp wpisujemy:

^.(get|GET).+(torrent|thepiratebay|isohunt|entertane|demonoid|btjunkie|mininova|flixflux|torrentz|vertor|h33t|btscene|bitunity|bittoxic|thunderbytes|entertane|zoozle|vcdq|bitnova|bitsoup|meganova|fulldls|btbot|flixflux|seedpeer|fenopy|gpirate|commonbits|\x13bittorrent protocol|azver\x01$|get /scrape\?info_hash=get /announce\?info_hash=|get /client/bitcomet/|GET /data\?fid=)|d1:ad2:id20:|\x04\x17\x27\x10\x19\x80'7P).$

Powyższe wyrażenie nie jest mojego autorstwa. Pochodzi ono z oficjalnego forum MikroTik’a – LINK.

Jednak należy zwrócić uwagę że użycie takiego rozwiązania jest bardzo bardzo „procesorożerne”. Powinno się więc go używać na mocnych platformach dopasowanych do ilości ruchu przepuszczanego przez reguły L7.


Dodanie reguły do filtrów firewall’a

Fakt że utworzyliśmy wpis z wyrażeniem regularnym nie powoduje że jest on w jakikolwiek sposób wykorzystywany. Aby to zmienić dodajemy nową regułę w zakładce „Filter Rules” gdzie w zakładce Advanced w polu „Layer7 Protocol” wybieramy nazwę naszego wyrażenia.

Przykładowo chcemy wykryć użytkowników korzystających z torretów którzy są w sieci z adresacją 192.168.100.0/24. Wówczas nasza reguła będzie wyglądać tak:

/ip firewall filter
add action=add-src-to-address-list address-list=torrent address-list-timeout=none-dynamic chain=forward layer7-protocol=torrent src-address=192.168.100.0/24

Modyfikując wartość parametru „address-list-timeout” możemy ustawić czas po którym adres zniknie z listy. Ustawienie z powyższego przykładu powoduje że adresy są na liście do czasu restartu routera. Można też zastosować zamiast „none-dynamic” wartość „none-static” wówczas adresy pozostaną na liście cały czas do chwili ręcznego usunięcia.

Zalecam zawsze wpisywanie adresów źródłowych nawet jeśli jest to np. nasza jedyna sieć lokalna. Wykluczy to sytuację gdzie do listy trafi adres IP hosta zdalnego.


Trochę MikroTik’owej skryptologii 🙂

Na koniec pokażę swój prosty skrypt który wyśle co nas maila i poinformuje jaki host korzysta z torrentów.

:if ([/ip firewall address-list find list=torrent] != "") do={
:local body "Lista hostow pobierajacych torrenty: \r\n";

:foreach a in=[/ip firewall address-list find where list=torrent] do={
:local ip [/ip firewall address-list get $a address];
:local mac "";
:local hostname "";
:do {
:set mac [/ip dhcp-server lease get value-name=mac-address number=[/ip dhcp-server lease find address=$ip]];
} on-error={
:do {
:set mac [/ip arp get value-name=mac-address number=[/ip arp find where address=$ip]];
} on-error={}
}
:do {
:set hostname [/ip dhcp-server lease get value-name=host-name number=[/ip dhcp-server lease find address=$ip]];
} on-error={}
:set $body "$body$ip $mac $hostname\r\n";
/ip firewall address-list remove numbers=[/ip firewall address-list find list=torrent address=$ip];
}

/tool e-mail send to="mail@example.com" subject="Torrenty" body="$body";
}

Link

Skrypt pobiera adresy z listy, sprawdza czy nie ma więcej informacji o tym adresie w dzierżawach DHCP lub ARP. Następnie wysyła maila z listą hostów.

Przykładowy mail wygląda tak: