Úvod

Zaťažuje vám niečo sieť, a vy neviete čo? Účtuje vám provider podozrivo veľa dát? Tu je zopár tipov, ako prísť veci na kĺb.

Kde

V prvom rade si treba uvedomiť kde môžeme sledovať prevádzku na sieti.

Pri sledovaní prevádzky na sieti sa využíva malý trik. Požiadame ovládač sieťovej karty, aby nám podával informácie aj o paketoch, ktoré nie sú určené pre náš počítač. Za normálnych okolností sieťová karta z paketu vyberie cieľovú IP adresu. Porovná ju so svojou a ak nesedí, tak paket ignoruje. Ak však kartu nastavíme do promiskuitného módu, odovzdá operačného systému aj pakety s IP adresou inou. K tomu je, ale potrebné aby paket vôbec prišiel po kábli k nám. To sa napr. nestane, ak je náš počítač pripojený nie na obyčajný HUB, ale na switch.

Situácia je naopak značne lepšia ak náš počítač robí router či gateway. V takom prípade budú cezeň prechádzať pakety celej vnútornej siete.

Kto

Sledovanie prevádzky na sieti znamená, že budeme vidieť informácie, ktoré možno pôvodne neboli určené nám. Ak chceme vidieť viac, musíme vstúpiť do role správcu systému a prihlásiť sa ako root.

Ako

tcpdump

Základom je program tcpdump(1). Je možné ho pustiť aj bez parametrov a vie na štanardný výstup vypisovať hlavičky analyzovaných paketov - konkrétne IP adresu odosielateľa, IP adresu príjemcu, cieľový port, ktorý určuje protokol, príznaky paketu a podobne:

# tcpdump -i lo
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 96 bytes
22:09:52.044246 IP ras.rastos.org > ras.rastos.org: icmp 64: echo request seq 9
22:09:52.044348 IP ras.rastos.org > ras.rastos.org: icmp 64: echo reply seq 9
...

Zopár užitočných prepínačov:

-i
Umožňuje vybrať, na ktorom sieťovom rozhraní budeme prevádzku sledovať. Dôležitý je najmä na počítači s funkciou brány(gateway), na ktorom musíme vybrať či sledujeme prevádzku vnútri siete alebo na pripojení na vonkajšiu sieť. Za prepínačom musí byť uvedené meno rozhrania. Ich zoznam vypíše program iconfig(8).
-n
Vypisovať IP adresy odosielateľa a príjemcu v numerickom formáte. Ak by adresy boli prevádzané na symbolický tvar, tcpdump by sám mohol generovať, keby posielal požiadavky na DNS server.
-w
Zapisovať nedekódované pakety do súboru, odkiaľ môžu byť neskôr načítané a analyzované pomocou prepínača -r.

Okrem prepínačov je, ale dôležitou zbraňou tcpdump-u logický výraz, ktorý filtruje, ktoré pakety tcpdump vypíše a ktoré nie. Tento logický výraz môže obsahovať rôzne kľúčové slová. Tu sú najzaujímavjšie z nich (úplný zoznam nájdete v manuálovej stránke programu tcpdump):

src host
Pakety, poslané z počítača uvedeného za týmito kľúčovým slovami.
dst host
Pakety, ktoré mieria na počítač uvedený za týmito kľúčovými slovami.
src net
Pakety pochádzajúce zo siete uvedenej ako nasledovný parameter.
dst net
Pakety mieriace do siete uvedenej ako nasledovný parameter.
and, or a not
Ako sa dalo očakávať, sú to logické operátory, ktoré umožňujú kombinovať rôzne podmienky a tak vyfiltrovať to čo potrebujeme.

No a po toľkej teórii trocha praxe:

# tcpdump -i eth1 src 192.168.1.100 and not dst net 192.168.1.0
15:27:05.818983 10.0.0.137.ardus-trns > baym-cs109.msgr.hotmail.com.msnp: P 1189387552:1189387557(5) ack 2410608561 win 16658 (DF)
15:27:05.827722 10.0.0.137.34044 > ns.telecom.sk.domain: 60701+ [1au] PTR? 109.106.46.207.in-addr.arpa. (56) (DF)
15:27:05.943265 ns.telecom.sk.domain > 10.0.0.137.34044: 60701 1/5/6 (275) (DF)
15:27:06.043767 baym-cs109.msgr.hotmail.com.msnp > 10.0.0.137.ardus-trns: P 1:9(8) ack 5 win 16834
15:27:06.194852 10.0.0.137.ardus-trns > baym-cs109.msgr.hotmail.com.msnp: . ack 9 win 16650 (DF)
...

Výpis z tcpdump-u teda máme. Medzi najzaujímavejšie údaje, ktoré v ňom nájdeme patrí cieľový port. Ten vlastne napovedá aký druh dát chodí daným sieťovým spojením. Ak ste použili prepínač -n a port je vyjadrený číslom, môžete sa pozrieť do suboru /etc/services, v ktorom nájdete popísanú väčšinu portov. Pozor na to, že tento prevod možno použiť len na cieľový port paketu.

Samozrejme nie každý má chuť si pamätať všetky parametre, ktoré možno použiť pri programe tcpdump. Preto existujú grafické programy, ktoré sú užívateľsky prívetivejšie. Najznámejší je program ethereal.

ethereal screenshot thumb view

Na obrázku je ethereal v činnosti. Najprv zaznamenáva pakety to dočasného súboru a potom ho znova prečíta a zobrazí zachytené sieťové spojenia. Zobrazuje aj popis jednotlivých polí paketov v binárnej aj textovej forme. Dokáže tiež analyzovať a zobraziť informácie z dátovej časti paketov a tak napríklad pre HTTP protokol môžeme vidieť URL a podobne. Podrobnejší popis ethereal-u je mimo rozsah tohoto článku (a mojich vedomostí).

netstat

Keď už vieme, aký druh dát nám chodí po sieti, môžeme sa pozrieť, aký program ich prenáša. Pomôže nám k tomu program netstat(8) a konkrétne jeho prepínač -p, ktorý spôsobí vypísanie PID čísla procesu a meno programu v poslednom stĺpci:

# netstat -t -p
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State    PID/Program name
tcp        0      0 gw.example.org:ssh      foo.example.org:36153   ESTABLISHED 30217/sshd
tcp        0      0 gw.example.org:143      foo.example.org:54419   ESTABLISHED 7407/imapd

Prepínač -t som použil preto aby som dostal len výpis spojení používajúcich TCP protokol. Inak by výpis mohol byť podstatne dlhší. Použiť môžeme tiež prepínač -n, ktorý zariadi vypisovanie adries a portov v číselnej forme. Všimnite si tiež stĺpec State - slovo ESTABLISHED hovorí, že spojenie je vytvorené a stabilné. Môžu sa tam tiež vyskytovať slová TIME_WAIT, ak sa čaká napr. na ukončenie spojenia, či slovo LISTEN, ak nejaký program počúva na danom porte - čaká na vytvorenie spojenia. Pozor tiež na to, že ak tieto programy spúšťate ako obyčajný užívateľ a nie root, môžete dostať len informácie o svojich vlastných spojeniach či procesoch. Ak sme už identifikovali program, ktorý dáta prenáša môžeme využiť program ps(1), ktorý nám môže povedať komu patrí daný proces. V závislosti od nastavení systému je možné, že ten program zaznamenáva svoju činnosť do logu. Konkrétnejšie informácie v tomto smere si už musíte pohľadať sami.

iptables

Ďalším spôsobom sledovania prevádzky po sieti je použitie modulu jadra s menom netfilter, ktorý implementuje firewall a nastavuje sa pomocou iptabels(8). Aby to celé fungovalo musí byť jadro skompilované so správnymi voľbami. Voľby pre netfilter (a podporu pre súborový systém v /proc) nájdeme takto:

Pre jadro 2.6:Pre jadro 2.4:
Device Drivers
  -->  Networking support
    -->  Networking options
      -->  Network packet filtering
        -->  IP: Netfilter Configuration
File systems
  -->  Pseudo filesystems
    -->  /proc file system support 
Networking options
  -->  IP: Netfilter Configuration
File systems
  -->  /proc file system support 




Základom je voľba nazvaná Connection tracking. Oplatí sa tiež voľba LOG target support. Ak ich máte zapnuté a zodpovedajúce moduly (ip_conntrack, ipt_LOG) su nahrané, nájdeme v adresári /proc/net/ súbor s menom ip_conntrack. V ňom sú zaznamenané sieťové spojenia o ktorých systém vie:

# cat /proc/net/ip_conntrack
tcp 6 56 SYN_RECV src=192.168.1.203 dst=68.202.158.96 sport=2938 dport=443 src=68.202.158.96 dst=10.0.0.137 sport=443 dport=2938 use=1
tcp 6 431998 ESTABLISHED src=192.168.1.203 dst=68.202.158.96 sport=2934 dport=16732 src=68.202.158.96 dst=10.0.0.137 sport=16732 dport=2934 [ASSURED] use=1
tcp 6 50 SYN_RECV src=192.168.1.203 dst=68.202.158.96 sport=2936 dport=80 src=68.202.158.96 dst=10.0.0.137 sport=80 dport=2936 use=1
udp 17 2 src=192.168.1.202 dst=192.168.1.255 sport=137 dport=137 [UNREPLIED] src=192.168.1.255 dst=192.168.1.202 sport=137 dport=137 use=1
tcp 6 431996 ESTABLISHED src=192.168.1.202 dst=207.46.107.48 sport=36074 dport=1863 src=207.46.107.48 dst=10.0.0.137 sport=1863 dport=36074 [ASSURED] use=1
udp 17 2 src=192.168.1.199 dst=192.168.1.202 sport=137 dport=137 [UNREPLIED] src=192.168.1.202 dst=192.168.1.199 sport=137 dport=137 use=1
tcp 6 431999 ESTABLISHED src=192.168.1.202 dst=192.168.1.199 sport=36153 dport=22 src=192.168.1.199 dst=192.168.1.202 sport=22 dport=36153 [ASSURED] use=3
udp 17 86 src=192.168.1.202 dst=195.146.128.60 sport=32769 dport=53 src=195.146.128.60 dst=10.0.0.137 sport=53 dport=32769 [ASSURED] use=1
tcp 6 102 TIME_WAIT src=192.168.1.202 dst=212.123.6.48 sport=36130 dport=80 src=212.123.6.48 dst=10.0.0.137 sport=80 dport=36130 [ASSURED] use=1
udp 17 20 src=192.168.1.203 dst=81.202.65.109 sport=39156 dport=31154 src=81.202.65.109 dst=10.0.0.137 sport=31154 dport=39156 use=1
tcp 6 70 SYN_SENT src=192.168.1.203 dst=61.149.202.208 sport=2733 dport=18281 [UNREPLIED] src=61.149.202.208 dst=10.0.0.137 sport=18281 dport=2733 use=1
udp 17 2 src=192.168.1.203 dst=68.202.158.96 sport=39156 dport=16732 src=68.202.158.96 dst=10.0.0.137 sport=16732 dport=39156 use=1
udp 17 20 src=192.168.1.213 dst=68.202.158.96 sport=57220 dport=16732 src=68.202.158.96 dst=10.0.0.137 sport=16732 dport=57220 use=1
tcp 6 431937 ESTABLISHED src=192.168.1.202 dst=195.146.134.62 sport=36071 dport=6667 src=195.146.134.62 dst=10.0.0.137 sport=6667 dport=36071 [ASSURED] use=1

Podrobný popis významu jednotlivých polí možno nájsť na netfilter.org Stručne sa dá povedať, že prvé dve IP adresy sú z hlavičky paketu, ktorý odišiel a druhé dve paketu, ktorý očakávame ako odpoveď. Vo výpise možno tiež vidieť pakety v rôznych stavoch (TIME_WAIT - čakajúce napr. na zánik, SYN_SENT - nadväzujúce spojenie), najzaujímavejšie sú v tomto momente tie, ktoré majú stav ESTABLISHED. Sú to spojenia, na ktorých práve v tomto momente prebieha prenos dát.

Iptables tiež môžu mať vo svojich pravidlách zaradené pravidlo, ktoré spôsobí zapísanie informácie o pakete do systémového logu. Sú to pravidlé, ktoré ako cieľ pravidla majú uvedené rezervované slovo LOG.

iptables -N syslog
iptables -A syslog -j LOG --log-level alert --log-prefix "Zaznamenany paket "

Pakety, ktoré pri prechode cez iptables narazia na takéto pravidlo pošle systém logovaciemo programu syslogd. V konfiguračnom súbore /etc/syslogd.conf potom možno nadefinovať ako budú tieto informácie zaznamenané:

# cat /etc/syslogd.conf
...
kern.alert          -/var/log/firewall
...

Pri takomto nastavení môžeme potom sledovať zaznamenané pakety v súbore /var/log/firewall

# tail /var/log/firewall
Jan 1 14:16:15 foo kernel: Zaznamenany paket IN=ppp0 OUT= MAC= SRC=213.81.194.240 DST=213.81.165.63 LEN=48 TOS=0x00 PREC=0x00 TTL=125 ID=19199 DF PROTO=TCP SPT=4456 DPT=135 WINDOW=8760 RES=0x00 SYN URGP=0
Jan 1 14:16:17 foo kernel: Zaznamenany paket IN=ppp0 OUT= MAC= SRC=213.81.132.239 DST=213.81.165.63 LEN=48 TOS=0x00 PREC=0x00 TTL=125 ID=46827 DF PROTO=TCP SPT=2432 DPT=445 WINDOW=8760 RES=0x00 SYN URGP=0
Jan 1 14:16:17 foo kernel: Zaznamenany paket IN=ppp0 OUT= MAC= SRC=68.54.40.14 DST=213.81.165.63 LEN=48 TOS=0x00 PREC=0x00 TTL=111 ID=48092 DF PROTO=TCP SPT=1130 DPT=4899 WINDOW=64240 RES=0x00 SYN URGP=0
Jan 1 14:16:18 foo kernel: Zaznamenany paket IN=ppp0 OUT= MAC= SRC=213.81.128.90 DST=213.81.165.63 LEN=48 TOS=0x00 PREC=0x00 TTL=123 ID=15690 DF PROTO=TCP SPT=3531 DPT=135 WINDOW=8760 RES=0x00 SYN URGP=0

ntop

ntop je ďalší nástroj, ktorý zobrazuje dianie na sieti. Zo zozbieraných údajov vytvára webové stránky, ktoré si možno prezerať pomocou ľubovoľného web browsera. Dáta zbiera buď priamo, alebo ich číta zo súboru s bežne používaným formátom - napr. pomocou tcpdump. Browseru ich poskytuje pomocou malého web servera. Ten je schopný poskytovať údaje cez http, ale aj cez https. Najviac sa mi na ňom páčilo, že vedel namapovať IP adresy na krajinu, v ktorej sa nachádza. Nepoznám ho tak dobre ako ostatné nástroje, tak vás skúsim nalákať aspoň zopár screenshotmi:

No a to je snáď všetko o nástrojoch, ktoré môžete použiť na sledovanie prevádzky na sieti.