piątek, 2 marca 2007

tips & tricks: dst-port 25

W tym post'cie przedstawię jak skutecznie walczyć z wirusami z własnym silnikiem umożliwiającym im rozsyłanie się za pomocą poczty elektronicznej. Skutecznie .. to znaczy pozbywając się ruchu przez nie generowanego i przy okazji informując klienta o fakcie zainfekowania jego maszyny.

W iptables z modułem recent wystarczy 4 reguły a nawet 2 (bez jump'a do osobnego łańcucha):

iptables -N tcp_dport25 [ent]
iptables -A FORWARD -p tcp --dport 25 -m state --state NEW -j tcp_dport25 [ent]
iptables -A tcp_dport25 -m recent --update --seconds 10 --name smtp -j DROP [ent]
iptables -A tcp_dport25 -m recent --set --name smtp -j ACCEPT [ent]

Co robią powyższe regułki? Pierwsza tworzy nowy łańcuch o nazwie tcp_dport25. Kolejna wysyła do niego ruch wędrujący przez łańcuch FORWARD z portem docelowym 25/tcp oraz stanem połączenia NEW. Następna sprawdza w tabeli smtp czy z danego źródłowego adresu IP, w ciągu ostatnich 10 sekund, była już próba nawiązania połączenia z docelowym portem 25. Jeśli tak, to uaktualnia czas żywotności wpisu informującego o tym fakcie na 10 sekund, oraz DROP'uje próbę nawiązania połączenia. Ostatnia reguła dokonuje wpisu w tabeli smtp świadczącego o tym że z danego IP zanotowano próbę połączenia z zdalnym portem 25, oraz ACCEPT'uje to połączenie.
W tym momencie klient jest w stanie wysłać jednego maila co 10 sekund pod warunkiem że w ciągu tych 10 sekund nie próbował ponownie łączyć się do portu 25. W tym momencie wirusowi, który średnio rozsyła się z częstotliwością kilku prób na sekundę, uda się tylko jedna próba wyjścia na świat z portem docelowym 25. Wszystkie kolejne będą skutecznie blokowane.

A jak powyższy scenariusz zaimplementować w MikroTik'u?

ip firewall filter [ent]
add chain=forward protocol=tcp dst-port=25 connection-state=new action=tcp_dport25 [ent]
add chain=tcp_dport25 src-address-list=smtp address-list=smtp address-list-timeout=10s action=add-src-to-address-list [ent]
add chain=tcp_dport25 src-address-list=smtp action=drop [ent]
add chain=tcp_dport25 action=add-src-to-address-list address-list=smtp address-list-timeout=10s [ent]
add chain=tcp_dport25 action=accept [ent]

Najpierw przechodzimy do konfiguracji tabeli filter firewall'a. Następnie do automatycznie tworzonego łańcucha tcp_dport25 przekierowujemy pakiety rozpoczynające (NEW) połączenie z docelowym portem 25. W kolejnej regule sprawdzamy czy z danego IP były już próby nawiązania połączenia na port 25. Jeśli tak to uaktualniamy wpis. Następnie jeśli nadający host znajduje się już na liście DROP'ujemy połączenie. Jeśli natomiast się na niej nie znajduje dodajemy go do listy na 10 sekund. Ostatnia reguła zezwala na połączenie.

Dodając jeszcze jedną regułę można doprowadzić do tego, że z danego IP można będzie przeglądać strony www pod warunkiem czystego komputera.

ip firewall nat [ent]
add chain=dstnat src-address-list=smtp action=dst-nat to-address=[IP serwera www z stroną informacyjną] to-ports=[port na którym nasłuchuje serwer] [ent]