Po dokončení konfigurace sítě se podíváme blíže na diagnostiku.
19.8.2004 08:00 | Ondřej Čečák | přečteno 89580×
How much net work could a network work, if a network could net work?
Nejprve se podíváme, zda vlastní zařízení běží. Vzhledem k tomu,
že často používaný program ifconfig
je už zastaralý,
použijeme program ip
(z balíku iproute).
Podívejme se, která zařízení jsou v systému:
oc@hippo:~$ ip addr list 1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo 2: eth0:< BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:04:75:c4:66:6f brd ff:ff:ff:ff:ff:ff inet 192.168.0.2/24 brd 192.168.0.255 scope global eth0
První síťové zařízení je v tomto případě lokální smyčka (loopback), která slouží pro testování a pro zjednodušení komunikace lokálních síťových procesů.
Druhé síťové zařízení je první síťová karta. Její MAC adresa je obsahem druhého
řádku spolu s adresou, na které přijímá broadcast packety. Na třetím řádku je
nastavená IP adresa s kompaktním zápisem síťové masky a adresa pro
broadcast. Mimochodem, pokud by se vám zdála délka příkazu příliš dlouhá,
můžete ho zkrátit na ip addr ls
, ip a l
nebo dokonce
jenom ip a
.
Dále se můžeme podívat, jestli jsou nějak nastaveny routovací pravidla (kam a
jak se mají packety směrovat). Opět použijeme program ip
.
oc@hippo:~$ ip route ls 192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.2 default via 192.168.0.254 dev eth0
První síťová karta je tedy v síti 192.168.0.x, má adresu 192.168.0.2 a implicitně je síťový provoz směrován na gateway na adrese 192.168.0.254. Směrování se zdá v pořádku, proto se podíváme, jestli síť opravdu funguje.
Nejprve zkusíme spojení pomocí jednoduchého programu ping
(používám ten z balíku netkit, existuje ještě několik různých implementací,
krom té z netkitu třeba také z balíku iputils atd.).
Název programu ping
je zkratkou Packet INternet Gopher a pomocí
protokolu ICMP vysílá žádost o odpověď (typ 8, echo request) a měří jak dlouho
packetu odpovědi (typ 0, echo reply) trvá cesta sítí, počítá kolik packetů se
cestou ztratilo a podobně.
Základní použití je opravdu jednoduché, zkusíme si nejprve otestovat, jestli reaguje druhý počítač v síti.
oc@hippo:~$ ping 192.168.0.1 -c 10 PING 192.168.0.1 (192.168.0.1): 56 data bytes 64 bytes from 192.168.0.1: icmp_seq=0 ttl=64 time=0.6 ms 64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.2 ms 64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=0.2 ms 64 bytes from 192.168.0.1: icmp_seq=3 ttl=64 time=4.0 ms 64 bytes from 192.168.0.1: icmp_seq=4 ttl=64 time=0.2 ms 64 bytes from 192.168.0.1: icmp_seq=5 ttl=64 time=0.2 ms 64 bytes from 192.168.0.1: icmp_seq=6 ttl=64 time=0.2 ms 64 bytes from 192.168.0.1: icmp_seq=7 ttl=64 time=0.2 ms 64 bytes from 192.168.0.1: icmp_seq=8 ttl=64 time=0.2 ms 64 bytes from 192.168.0.1: icmp_seq=9 ttl=64 time=0.2 ms --- 192.168.0.1 ping statistics --- 10 packets transmitted, 10 packets received, 0% packet loss round-trip min/avg/max = 0.2/0.6/4.0 ms
Parametr -c
určuje, kolik packetů se má odeslat. Pokud není
uveden, packety se odesílají až do ukončení pomocí CTRL + C.
Standardně ping posílá 56 bytů (toto nastavení můžete změnit parametrem -s
),
které spolu s 8 bytovou hlavičkou ICMP dávají dohromady 64 bytů.
Mezi vysíláním jednotlivých packetů dělá ping
přestávky, implicitně to je 1
sekunda, ovšem toto nastavení můžete změnit parametrem -i
.
Na obrazovku je průběžně vypisováno, které packety se vrátily, s jakým zpožděním,
případně zda jsou duplikovány nebo poškozeny. V tomto případě přišlo všech 10
packetů v tom pořadí, v jakém byly vyslány s různou odezvou. Na konci
ping
vypíše statistiky – kolik packetů bylo vysláno,
doručeno, procentuální ztrátu a také minimální, maximální a průměrné zpoždění.
Tolik k základnímu použití. Nyní se podíváme na některé další zajímavé volby.
Pokud zapneme parametr -f
(vyžaduje superuživatelské oprávnění,
ostatně základní použití pingu
také, ovšem bývá nainstalován
jako suid),
bude ping
vysílat tolik packetů, kolik jen bude moci. Za
každý vyslaný packet udělá na výstupní zařízení jednu tečku (.) a za každý
doručený packet jednu tečku smaže. Takto se dá ověřit, kolik packetů je
zahazováno při vyšší zátěži.
Další zajímavou volbou je -R
. Ping
pak vypíše cestu,
kterou packety chodí a kontroluje, zda je cesta stále stejná (tato funkce je vlastnost ICMP, který je
formálně na stejné úrovni jako TCP, nicméně prakticky je na úrovni vyššího protokolu).
Dále si můžeme představit ještě jeden velmi zajímavý program –
hping2
.
Hping2
je program s širokou škálou využití a nás bude zajímat
pouze část funkcí. Každopádně vřele doporučuji jeho vyzkoušení.
Rovnou si můžeme uvést příklad:
root@hippo:~# hping2 -I eth0 -S 192.168.0.1 -c 5 -p 22 HPING 192.168.0.1 (eth0 192.168.0.1): S set, 40 headers + 0 data bytes len=46 ip=192.168.0.1 flags=SA DF seq=0 ttl=64 id=0 win=5840 rtt=0.6 ms len=46 ip=192.168.0.1 flags=SA DF seq=1 ttl=64 id=0 win=5840 rtt=0.4 ms len=46 ip=192.168.0.1 flags=SA DF seq=2 ttl=64 id=0 win=5840 rtt=0.4 ms len=46 ip=192.168.0.1 flags=SA DF seq=3 ttl=64 id=0 win=5840 rtt=0.3 ms len=46 ip=192.168.0.1 flags=SA DF seq=4 ttl=64 id=0 win=5840 rtt=0.3 ms --- 192.168.0.1 hping statistic --- 5 packets tramitted, 5 packets received, 0% packet loss
Volba -I
je myslím jasná, specifikuje, přes které zařízení má
komunikace probíhat, -c
určuje, kolik packetů se má odeslat,
-S
nastavuje packetům příznak SYN (program na rozdíl od klasického
pingu
nepoužívá pouze ICMP, ale také potřebuje superuživatelské
oprávnění) a -p
určuje cílový port. Hping2
tedy odeslal
5 packetů s příznakem SA (SYN ACK), které běžně zahajují spojení (3-way handshake),
což pro nás má dva významy – jednak tato činnost může uniknout nějakému
primitnímu bezpečnostnímu software (spíše z historických důvodů se tomu říká stealth
scan) a vzhledem k tomu,
že vracející se packety mají příznak SA, se dá předpokládat, že na portu 22
vzdáleného stroje poslouchá nějaký program (v opačném případě by byly příznaky
vracejících se packetů RA).
Mezi další zajímavé volby patří např. -t
, které nastavuje TTL
(určuje, přes kolik aktivních zařízení může packet projít než bude zahozen).
Pokud je navíc připojen parametr -z
, bude po stisku CTRL + Z
zvýšena tato hodnota o jedničku.
Pokročme dále – podíváme se na program, který nám zobrazí stav naší
sítě. Netstat
je další program, který má velké množství voleb a
jde použít na celou řadu věcí, ale my se podíváme jen na pár základních
použití.
Tou první je použití volby -T
, která zobrazí všechna TCP aktivní
spojení.
oc@hippo:~$ netstat -t Aktivní Internetová spojení (w/o servery) Proto Přích-F Odch-F Místní Adresa Vzdálená Adresa Stav tcp 0 0 192.168.1.1:netbios-ssn 192.168.0.5:3012 SPOJENO tcp 0 0 localhost:7634 localhost:36792 TIME_WAIT tcp 0 0 hippo:36793 mail.linuxsoft.cz:pop3s TIME_WAIT tcp 0 0 localhost:7634 localhost:36791 TIME_WAIT tcp 0 0 hippo:36208 205.188.8.44:5190 SPOJENO
Další pro nás zajímavá volba je -i
, která vypíše tabulku zařízení
jádra. Nejlepší bude opět příklad:
oc@hippo:~$ netstat -i Tabulka rozhraní v jádru Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg eth0 1500 0 757600 0 0 0 901521 0 0 0 BMRU lo 16436 0 12477 0 0 0 12477 0 0 0 LRU
Tak, tuto tabulku si vysvětlíme trošku podrobněji. MTU znamená, jaký největší počet bytů může být najednou poslán přes dané zařízení. Sloupec Met označuje metriku zařízení. Dále tam je několik sloupců, které začínají buď písmeny RX nebo TX. RX označuje příchozí packety, TX naproti tomu odchozí. Příchozí a odchozí packety jsou navíc děleny do skupin – OK znamená, že byl packet přijat/odeslán bez problému, ERR označuje chybný packet, DRP počet zahozených packetů, OVR overrun.
Poslední sloupec označuje příznaky, které v tomto případě u zařízení eth0 znamenají, že zařízení přijímá broadcast packety (B), je v promiskuitním režimu (M, to znamená, že všechny přijaté/odeslané packety jsou zaznamenávány), zařízení běží (R) a je aktivní (U). U lokální smyčky je navíc nastaven příznak, který určuje, že je zařízení lokální smyčka (L).
Netstat
se také dá velmi dobře použít na přehled služeb, které běží.
Použijeme volby -n
(IP nebudou překládány na názvy), -a
(zobrazí vše), -t
(TCP protokol), -u
(UDP protokol)
a -p
(který program je zodpovědný za otevřený port). Tyto volby
jsou sympatické, protože se dají poměrně dobře zapamatovat – třeba jako
-tupan
.
oc@hippo:~$ netstat -natup (Všechny procesy nemohly být identifikovány. Budou vypsány informace pouze o procesech, jichž jste vlastníkem. Aby jste mohl vidět vše, musel byste být superuživatelem.) Aktivní Internetová spojení (servery a navázaná spojení) Proto Přích-F Odch-F Místní Adresa Vzdálená Adresa Stav PID/Program name tcp 0 0 0.0.0.0:515 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:37 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:39693 0.0.0.0:* LISTEN 7346/sim tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:7634 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:33748 0.0.0.0:* LISTEN 6570/artsd tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN - tcp 0 0 192.168.1.1:139 192.168.1.3:3010 SPOJENO - tcp 0 0 192.168.0.2:34103 82.208.29.34:995 TIME_WAIT - tcp 0 0 127.0.0.1:7634 127.0.0.1:34104 TIME_WAIT - tcp 0 0 127.0.0.1:7634 127.0.0.1:34102 TIME_WAIT - tcp 0 0 192.168.0.2:34050 205.188.8.47:5190 SPOJENO 7346/sim tcp 0 12 192.168.2.1:139 192.168.2.128:1035 SPOJENO - udp 0 0 0.0.0.0:517 0.0.0.0:* - udp 0 0 0.0.0.0:518 0.0.0.0:* - udp 0 0 127.0.0.1:32775 0.0.0.0:* - udp 0 0 192.168.2.1:137 0.0.0.0:* - udp 0 0 192.168.0.2:137 0.0.0.0:* - udp 0 0 192.168.1.1:137 0.0.0.0:* - udp 0 0 0.0.0.0:137 0.0.0.0:* - udp 0 0 192.168.2.1:138 0.0.0.0:* - udp 0 0 192.168.0.2:138 0.0.0.0:* - udp 0 0 192.168.1.1:138 0.0.0.0:* - udp 0 0 0.0.0.0:138 0.0.0.0:* - udp 0 0 0.0.0.0:37 0.0.0.0:* - udp 0 0 127.0.0.1:32830 0.0.0.0:* - udp 0 0 0.0.0.0:32832 0.0.0.0:* 7346/sim
Netstat nám nezobrazil názvy všech procesů – jak na začátku oznámil, zobrazil pouze ty procesy, které daný uživatel vlastní. Podle seznamu bežících služeb můžete poměrně jednoduše identifikovat (nejlépe jako superuživatel root), který program kde běží a případně zasáhnout.
Další možností jak zjistit, které služby běží, je zobrazení služeb, které na nějakých portech
poslouchají. K tomu slouží příkaz netstat --inet -l
, v případě, že chcete vědět,
který program je za otevřený port zodpovědný, použijte opět parametr -p
.
oc@hippo:~$ netstat --inet -l Aktivní Internetová spojení (pouze servery) Proto Přích-F Odch-F Místní Adresa Vzdálená Adresa Stav tcp 0 0 *:32769 *:* LISTEN tcp 0 0 *:printer *:* LISTEN tcp 0 0 *:time *:* LISTEN tcp 0 0 *:netbios-ssn *:* LISTEN tcp 0 0 *:www *:* LISTEN tcp 0 0 *:7634 *:* LISTEN tcp 0 0 *:52244 *:* LISTEN tcp 0 0 *:ftp *:* LISTEN tcp 0 0 *:ssh *:* LISTEN udp 0 0 *:32768 *:* udp 0 0 *:talk *:* udp 0 0 *:ntalk *:* udp 0 0 192.168.0.2:netbios-ns *:* udp 0 0 *:netbios-ns *:* udp 0 0 192.168.0.2:netbios-dgm *:* udp 0 0 *:netbios-dgm *:* udp 0 0 *:time *:* raw 0 0 *:icmp *:* 7
Sledování síťového provozu umožňuje nahlédnutí do obsahu samotných packetů. To je umožněno přepnutím síťové karty do tzv. promiskuitního režimu (pozor, při sledování je packet předán vyšší síťové vrstvě i v případě, že tento není pro dané zařízení určen, např. v sítích s HUBy).
Obecně se tyto programy nazývají sniffery (z anglického slova sniff) a mají "oboustranné" využití, protože krom hlaviček (které budou zajímavé pro nás) mohou odchytávat některé (z našeho pohledu) zbytečné informace v datové části, jako třeba uživatelské jména a hesla ;-).
Typický zástupcem této kategorie je program tcpdump
.
Tcpdump
zachytává packety a zaznamenává jejich hlavičky. Spuštění
potřebuje superuživatelské oprávnění a pro jeho příklad stačí tcpdump
jednoduše spustit s parametrem, které že zařízení nás zajímá.
root@hippo~# tcpdump -i eth0 tcpdump: listening on eth0 13:23:38.540041 arp who-has 192.168.0.254 tell 192.168.0.2 13:23:38.540780 arp reply 192.168.0.254 is-at 0:80:48:2b:ed:e6 13:23:38.552194 192.168.0.2.1038 > GWHOREP.domain: 52743+ PTR?254.0.168.192.in-addr.arpa. (44) (DF) 13:24:13.041946 192.168.0.2 > 192.168.0.254: icmp: echo request (DF) 13:24:13.043171 192.168.0.254 > 192.168.0.2: icmp: echo reply (DF) 13:24:14.040934 192.168.0.2 > 192.168.0.254: icmp: echo request (DF) 13:24:14.042053 192.168.0.254 > 192.168.0.2: icmp: echo reply (DF) 13:24:18.040046 arp who-has 192.168.0.254 tell 192.168.0.2 13:24:18.040782 arp reply 192.168.0.254 is-at 0:80:48:2b:ed:e6 13:24:21.858459 192.168.0.2.1103 > 192.168.0.254.telnet: S 3338620162:3338620162(0) win 5840 \ <mss 1460,sackOK,timestamp 533032 0,nop,wscale 0> (DF) [tos 0x10] 13:24:21.860205 192.168.0.254.telnet > 192.168.0.2.1103: S 1820639165:1820639165(0) ack 3338620163 \ win 8192 <mss 1460,nop,wscale 0> 13:24:21.860346 192.168.0.2.1103 > 192.168.0.254.telnet: . ack 1 win 5840 (DF) [tos 0x10] 13:24:21.864083 192.168.0.2.1103 > 192.168.0.254.telnet: P 1:28(27) ack 1 win 5840 (DF) [tos 0x10] 13:24:21.865646 192.168.0.254.telnet > 192.168.0.2.1103: P 1:10(9) ack 28 win 8165 13:24:21.865748 192.168.0.2.1103 > 192.168.0.254.telnet: . ack 10 win 5840 (DF) [tos 0x10] 13:24:21.866087 192.168.0.2.1103 > 192.168.0.254.telnet: P 28:31(3) ack 10 win 5840 (DF) [tos 0x10] 13:24:21.868016 192.168.0.254.telnet > 192.168.0.2.1103: P 10:12(2) ack 31 win 8162 13:24:21.900114 192.168.0.2.1103 > 192.168.0.254.telnet: . ack 12 win 5840 (DF) [tos 0x10] 13:24:21.901452 192.168.0.254.telnet > 192.168.0.2.1103: P 12:83(71) ack 31 win 8162
V tomto příkladu vidíme žádost o odpověď a odpověď, kterou generuje např. výše
zmíněný program ping
. Dále je vidět začátek telnetové komunikace.
Pokud by vás děsil moc podrobný výpis, použijte parametr -q
,
pokud je to přesně naopak, přidejte programu tcpdump
parametr
-v
, popř. -vv
a nebo -vvv
. Samozřejmě
je možné filtrovat podle různých kritérií, které packety se mají zaznamenávat.
Trasování je činnost, díky které zjistíme, přes které stroje naše komunikace
prochází. Základní program traceroute
to dělá tak, že vysílá UDP
packety s různě nastaveným příznakem TTL (Time To Live), který se při
průchodu každým aktivním zařízením snižuje o 1. V případě, že je tato hodnota
rovna 0 dojde k tomu, že stroj packet jednoduše zahodí a vygeneruje chybové
hlášení přes ICMP. A na to traceroute
čeká a průběžně
tento příznak zvyšuje. Vidět to můžeme na následujícím případě, jednotlivé
řádky odpovídají postupně se zvyšujícím hodnotám TTL.
oc@hippo:~$ traceroute www.linuxsoft.cz traceroute to www.linuxsoft.cz (82.208.29.38), 30 hops max, 38 byte packets 1 * * * 2 * * * 3 * * * 4 * * * 5 sp.c2620.st.ja.wlnet.cz (193.165.75.129) 30.441 ms 32.084 ms 32.191 ms 6 ja.c2611.836.tb.wlnet.cz (193.165.79.9) 39.972 ms 39.380 ms 35.485 ms 7 zl.c2651.palcat.ta.wlnet.cz (193.165.72.1) 46.422 ms 54.623 ms 36.695 ms 8 Pha-Ta.bb.skynet.cz (193.165.253.141) 59.549 ms 59.523 ms 58.079 ms 9 nix1.to.cas.ip-anywhere.net (194.50.100.15) 50.252 ms 51.657 ms 51.595 ms 10 henry.casablanca.cz (217.11.224.237) 70.639 ms 56.611 ms 48.762 ms 11 ip38.linuxsoft.cz (82.208.29.38) 55.908 ms 57.809 ms 65.568 ms
Samozřejmě se může stát, že packet zahodí nějaký firewall, v tom případě
vypíše program místo adresy stroje a zpoždění pouze hvězdičku (*). A přesně tohle
řeší program
tcptraceroute
, který místo toho vysílá packety TCP s příznaky
SYN, takže by je firewally měly propustit.
oc@hippo:~$ /usr/sbin/tcptraceroute -f 2 linuxsoft.cz smtp Selected device eth0, address 192.168.0.2, port 33134 for outgoing packets Tracing the path to linuxsoft.cz (82.208.29.38) on TCP port 25, 30 hops max 2 192.168.99.254 (192.168.99.254) 9.125 ms 8.713 ms 8.620 ms 3 unirov.pacov.net.75.165.193.in-addr.arpa (193.165.75.6) 18.509 ms 18.136 ms 17.950 ms 4 ns.pacov.net (193.165.75.241) 17.769 ms 18.035 ms 18.213 ms 5 pa.c2620.st.ja.wlnet.cz (193.165.75.225) 34.087 ms 26.319 ms 25.624 ms 6 ja.c2611.836.tb.wlnet.cz (193.165.79.9) 36.668 ms 38.294 ms 33.364 ms 7 zl.c2651.palcat.ta.wlnet.cz (193.165.72.1) 60.656 ms 38.718 ms 48.954 ms 8 Pha-Ta.bb.skynet.cz (193.165.253.141) 67.087 ms 65.291 ms 58.226 ms 9 nix1.to.cas.ip-anywhere.net (194.50.100.15) 83.545 ms 86.258 ms 69.052 ms 10 henry.casablanca.cz (217.11.224.237) 54.099 ms 58.291 ms 72.913 ms 11 ip38.linuxsoft.cz (82.208.29.38) [closed] 62.297 ms 63.101 ms 62.888 ms
A co že jsme to vlastně udělali? Příkaz trasoval spojení na adresu linuxsoft.cz, díky parametru -f
se začalo
rovnou druhým skokem a smtp
na konci znamená, že se program bude snažit spojit s portem pro odesílání
elektronické pošty (obvykle 25), to pouze z důvodu, aby nedošlo k problémům při trasování (např. při použití proxy serveru atp.).
Scanováním portů se obvykle rozumí testovaní, zda na daném portu běží nějaká služba. Díky tomu můžete otestovat nastavení svého firewallu a podobně.
Jedním z nejznámějších programů je zřejmě
nmap
. Nmap
nabízí daleko více možností
než pouhé scanování portů pomocí volání funkce connect() (což je bohužel
jediné, co může uživatel bez práv superuživatele dělat).
Opět vám předvedu typické použití programu nmap
:
root@hippo:~# nmap 192.168.0.1 -O -sS Starting nmap 3.55 ( http://www.insecure.org/nmap/ ) at 2004-07-10 22:13 CEST Interesting ports on zlabatka (192.168.0.1): (The 1658 ports scanned but not shown below are in state: closed) PORT STATE SERVICE 22/tcp open ssh 1024/tcp open kdm MAC Address: 00:E0:7D:BA:20:73 (NETRONIX) Device type: general purpose Running: Linux 2.4.X|2.5.X OS details: Linux 2.4.0 - 2.5.20 Uptime 0.509 days (since Sat Jul 10 10:00:00 2004) Nmap run completed -- 1 IP address (1 host up) scanned in 6.271 seconds
Nejprve k volbám: -sS
určuje, že typ scanování bude SYN
stealth scan (popsáno výše) a -O
podle určitých specifických
znaků v packetech poměrně přesně (díky obsáhlé databázi) určí, jaké operační
systém na stroji asi běží a v našem případě dokonce i uptime. Kromě stealth
scanu můžete použít celou řadu dalších, jako příklad se dají uvést např. volby
-sN
(posílá packety bez příznaků) nebo -sX
(Xmas Tree,
packety mají příznaky FIN, URG a PUSH). Program standardně testuje základní
rozsah portů, na kterých by mohlo běžet něco zajímavého, v případě, že chcete
testovat nějaký vlastní rozsah, použijte parametru -p
.
Za konzultace bych chtěl poděkovat Honzovi Houšťkovi.