Lemat, strona domowa

Przeciwdziałanie wirusom w sieci LAN

Stronę dedykuję tym, którzy ostanimi czasy dostają komunikat podczas wysyłania poczty np. z konta na wp.pl:
Odpowiedź serwera: 550 [IP:x.x.x.x] Twoj adres IP znajduje sie na publicznej czarnej liscie CBL - zobacz strone http://cbl.abuseat.org/lookup.cgi?ip=x.x.x.x oraz http://profil.wp.pl/polityka_antyspamowa.html / your IP address is blacklisted - see http://cbl.abuseat.org/lookup.cgi?ip=x.x.x.x and http://profil.wp.pl/bulk_email_policy.html

Według tych instrukcji należy odwirusować własne sieci i zabezpieczyć je. Stanowczo odradzam zawracanie gitary maintainerom listy CBL, bo i tak nic nie wskóracie

Te wszystkie fajne nowoczesne wirusy mają własne silniki do rozsyłania się, rozsyłania spamu, skanowania portów innych kompów oraz inne ciekawe rzeczy np. DDOSowanie.

Jest to to bardzo trudne aby utrzymać wszystkie komputery w sieci LAN czyste (pomijając fakt, że niektóre wirusy trzeba rozpakować z zipa podając hasło - a to już musi zrobić blondynka).

Ale jest pewien sposób: dzięki regułkom iptables można znacznie ograniczyć rozprzestrzenianie się wirusów poza sieć LAN, oraz w miarę szybko wykrywać zawirusowanie któregoś z kompów. Poniżej podaję kawałek mojego skryptu budującego firewalla.

$pub to nazwa interfacju zewnetrznego (eth0,eth1,ppp...)
zmienne *_DENY_FORWARD zawierają listę portów, ktore wypadałoby blokować - należy zaglądać na strony antywirusowe i uaktualniać je.

SMTP_SERVERS="tu podajemy IP serwerow SMTP rozdzielone spacjami, używanych przez userów np. poczta.onet.pl, mail.lemat.priv.pl"
TCP_DENY_FORWARD="135:139 445 1080 3127 3128 6588 8080 194 529 994 6665:6669 3531 2745 1025 6129 17300 901"
UDP_DENY_FORWARD="135:139 445"

iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

for port in ${TCP_DENY_FORWARD} ; do
   iptables -A FORWARD -p tcp -o ${pub} --dport ${port} -j DROP
done
for port in ${UDP_DENY_FORWARD} ; do
   iptables -A FORWARD -p udp -o ${pub} --dport ${port} -j DROP
done

# zakladamy lancuch do logowania poczty wychodzacej
iptables -N ESEMTEPE 2> /dev/null
iptables -F ESEMTEPE

iptables -A FORWARD -p tcp -s ${net} -o ${pub} --dport 25 -j ESEMTEPE

iptables -A ESEMTEPE -m limit --limit 12/minute --limit-burst 12 -j LOG --log-level info --log-prefix "smtp "
for adr in ${SMTP_SERVERS} ; do
   iptables -A ESEMTEPE -d ${adr} -m limit --limit 2/minute --limit-burst 2 -j ACCEPT
done
iptables -A ESEMTEPE -j DROP

Jak widać na załączonym obrazku, taki skrypt zręcznie wkomponowany w istniejące regułki firewalla na ruterze linuxowym zabrania połączeń z niektórymi portami - tymi portami, które są używane przez wirusy np. jako backdoory.

Dodatkowo robiąc listę serwerów poczty pozwalamy na wysyłanie poczty przez te serwery i ograniczamy rozsyłanie poczty gdzie popadnie.

Dzięki temu oszczędzamy pasmo (!) a dzięki regułce logującej możemy zaobserwować w logach kto w LANie ma zawirusowanego kompa. Siedzimy sobie wygodnie na czterech literach i ze 2 razy dziennie zaglądamy w logi.

Natomiast jeżeli mamy dużo userów i nie mają oni stałej listy serwerów SMTP to można zastosowac trick z modułem recent - podobnie jak w moim artykule opisującym blokowanie skanowania ftp.

modprobe ipt_recent ip_list_tot=32
iptables -A FORWARD -m state --state RELATED, ESTABLISHED -j ACCEPT
iptables -A FORWARD -p tcp --dport 25 -m recent --name SMTP --seconds 60 --update -j DROP
iptables -A FORWARD -p tcp --dport 25 -m limit --limit 1/second --limit-burst 5 -j LOG --log-level info --log-prefix "smtp "
iptables -A FORWARD -p tcp --dport 25 -m recent --name SMTP --set -j ACCEPT

powyższe regułki ograniczają wysyłanie mejli do jednego na 60s przy czym, jeżeli w trakcie tych 60 sekund będzie znowu próba połączenia się to czas jest liczony od nowa - w ten sposób wirusy będą w stanie nawiązać tylko jedno (pierwsze) połączenie a reszta będzie DROPowana.

Środkowa regułka loguje nam do /var/log/kernel/info wszystkie próby połączenia do serwerów SMTP. Zawartość pliku /proc/net/ipt_recent/SMTP powie nam, który komp w sieci LAN prawdopodobnie jest zarażony.

Często tu zaglądają ludzie, co to postawili już ruter/NAT i nagle urodzili się z ręką w nocniku - po kilku dniach spokoju ktoś z ich sieci załapał wirusa, który teraz się rozsyła. Gorzej - dzwoni do nich Tepsa, mówiąc, że jak nie przestanie (on) wysyłać wirusów to mu odetną łącze (zgodnie z regulaminem - tak te małe literki co to się podpisywało pod nimi) ;)

Jak wykryć wirusa we własnej sieci mając dostęp (administracyjny) do rutera?:

iptables -I FORWARD -p tcp --dport 25 --syn -m limit --limit 1/second --limit-burst 5 -j LOG --log-level info --log-prefix "smtp "

następnie należy się wygodnie rozsiąść i obserwować logi. Interesuje nas źródłowy IP - ten pochodzący z naszej sieci. Po namierzeniu gościa:

iptables -I FORWARD -p tcp --dport 25 -s $IP -j DROP
ewentualnie:
iptables -I FORWARD -s $IP -j DROP
w tym drugim przypadku za ~5 sekund będziemy mieć go na linii ;)

Ważna uwaga (by Jacek Zapala): użytkownicy mogą używać portu 587 albo połączenia szyfrowanego (port 465) zamiast 25. Oczywiście ich serwery pocztowe muszą to wspierać.

Data utworzenia : 2004-07-30, data aktualizacji :2007-03-21
Skomentuj ten tekst
2010-07-31 02:44:57Blondi AKA żona infola
;)
lemat # shutdown -h now # ;-)
2008-12-07 18:22:38Just
ok dzieki
a mam jeszcze jedno pytanie troche nie w tym temacie ale mam nadzieje ze odpowiesz lub pomozesz troche... Zalozmy ze mamy siec lokalna tam router z linuxem ktory ma powiedzmy 50 userow przez ktorego wszyscy sie lacza i wychodza na swiat.... jak najlepiej zablokowac mozliwosc skanowania portow w sieci lan i na zew, wszyscy sa poza natem nikt nie wychodzi globalnie oczywiscie przy pomocy iptables connlimit? Czy moze masz lepszy pomysl?? Pozdrawiam
Odp.: można każdemu userowi przydzielić własną sieć np. 192.168.0.4/30 czyli 192.168.0.5 to adres rutera, 192.168.0.6 to adres usera, 192.168.0.7 to adres rozgłoszeniowy. Wtedy ruch z 192.168.0.6 do 192.168.0.10 musiałby się odbywać przez router - czyli wystarczy pozwalać na ruch sieć usera -> świat i nie pozwalać na ruch pomiędzy sieciami userów.
2008-12-07 12:44:09Just
hmmmm
a co jesli po zastosowaniu tego, ktos na sieci bedzie uzywal narzedzia do wysylania e-mail np outlook i bedzie chcial wyslac 1 majla do 5 osob na raz czy ta regula zablokuje to? czy potraktuje jako jeden pakiet wyslany w ciagu 60sek i prepusci na fw pozdrawiam
Odp.: nie, outlook wykonuje wtedy jedno połączenie do serwera. Dodatkowo nie musisz ufać facetowi przebranemu za księdza i samemu dobrać odpowiedni czas lub też whitelistować używane serwery poczty.
2007-05-09 11:38:08natan
Linux vs wirusy
No z tego co zauwazylem to blokujesz tez port proxy 3128 rozwiazanie albo zmienic u siebie num portu albo ustawic ograniczanie przez connlimit ilosci polaczen dla usera do tego mozna zrobic jakis skrypt php itp i miec w logach ze ten i ten user ma tyle i tyle polaczen jezeli user niema netu - problem jego ;) no i no jezeli ten stan trwa np okreslony timestump mozna kolesia przyciac o polowe i go zmusic do naprawy wiem ze to troche agresywne ale dziala oczywiscie wszystkie inne blokowanie portow jakie podales sa jak najbardzij na miejscu
2006-12-18 21:27:45Opti
Inny sposób na wykrywanie
Wydaje mi sie, że moja propozycja wykrywania jest: 1) prostsza (nie trzeba usuwać regułki z iptables - a jej nie usuniecie szybko spowoduje ze logi bardzo spuchną) 2)wydaje mi sie czytelniejsza dla admina tcpdump -i eth1 port 25 P.S. Gratuluje poziomu stronki i dziekuje za opieprzenie mnie kiedyś mailem za spamowanie :)
Odp.: 1) logrotate 2) i nie trzeba siedzieć cały czas na konsoli + jest archiwum poczynań danego delikwenta (jakby zaczął brąchać)
wszystkie opinie »
[Nospam-PL.NET]
UWAGA lisy roznoszą wściekliznę!
Protected by spf
© Lemat 2004 - ∞ engine:Lemat
info@seminar.pl.ua przedstawicielstwo@tiscali.it