Linux v příkazech – práce s Wi-Fi

Bezdrátová síť pro snadný přístup k Internetu je dnes naprosto běžnou záležitostí; ať už doma pro pohodnou práci na notebooku nebo třeba v restauracích s hotspoty. Jak se připojit v Linuxu?

1.11.2006 06:00 | Ondřej Čečák | přečteno 115052×

Once country guy: "We dug 100 ft behind our house and we found telephone cables. That proves that our ancestors used telephones thousands of years ago." Other country guy: "We dug 200 ft behind our house and did not find any cables. That proves that our ancestors used wireless."

Úvod o WiFi a sítích

V dnešní době už asi nemá cenu představovat Wi-Fi (původně Wireless Fidelity), technologii představenou specifikací IEEE 802.11. Kromě použití na například p2p spojích nás dnes bude zajímat, jak se k síti (např. z notebooku) připojit – použijeme-li terminologii z referenčního modelu OSI/ISO, budeme se pohybovat někde kolem fyzické a linkové vrstvy (physical, data link layer).

Pokud by vás zajímalo, jak samotná technologie funguje a jak ji použít, doporučuji už vydaný výborný seriál od vynikajícího autora Začínáme s WiFi.

Protože vás jistě bude zajímat, jak se dostanete po úspěšném připojení na web, odkáži vás na opět už vyšlé články ve stejné kategorii, jako je tento – konfigurace a diagnostika sítě. Ale předem vás možná uklidním, na většině míst, kde je "WiFi konektivita" k dispozici, běží DHCP server, který vám umožní jednoduše získat síťové parametry bez nutnosti složitě konfigurovat síťová rozhraní, směrování a podobně. Vlastně to je zpravidla jeden příkaz.

A nakonec poslední upozornění – alespoň pokud mi je známo, je právní problematika WiFi hotspotů tak trochu křehká; a to v tom smyslu, že je obtížné rozlišit hotspot pro volné použití třeba od špatně nakonfigurovaného domácího AP (Access Point, síťový prvek stojící na druhém konci našeho bezdrátového připojení). Zdůrazňuji to proto, že neznalost zpravidla neomlouvá, každopádně se ale v našem případě budeme připojovat k síti s dobrou vůlí a úmysly.

Nástroje

Tak a pojďme na věc. Na úvod této sekce ještě jedna poznámka – seriál se jmenuje Linux v příkazech, budeme se tedy věnovat připojení k síti pomocí příkazů, což pro běžného uživatele nemusí být komfortní. Proto tu máme grafické nástroje, které snadné připojení umožňují – rád bych zmínil třeba grafickou nadstavbu Network Manageru KNetworkManager (implicitně například v distribuci SUSE 10.1), KWifiManager nebo třeba Wifi Radar (podobných nástrojů je přes desítku, takže pokud by se vám žádný z jmenovaných nelíbil, použijte klidně jiný; existují).

Nás tedy budou v dalším povídání zajímat především programy z balíku Wireless Tools (například v Debianu je získáte instalací balíčku wireless-tools); ty umožňují nastavení Wireless Extension (WE) v Linuxu; WE je obecné rozhraní (API), umožňující nastavování různých parametrů vašeho bezdrátového zařízení a výhodou je především samotná obecnost (takže tolik nezáleží na tom, kterou WiFi kartu v počítači máte), jednotnost (nepotřebujete žádné další nástroje) a možnost předávání on-the-fly (bez nutnost restartu ovladače nebo celého jádra [Linuxu]).

Do Wireless Tools tedy spadá většina programů, o kterých je tento článek, jmenovitě:

Pokud nahlédnete třeba do programů, která vám balíček s Wireless Tools nabízí, zjistíte, že nástrojů je víc; my si ovšem vystačíme s touto dvojicí.

Modelová situace

Pro většinu našeho povídání si vystačíme s jedním modelovým příkladem, řekněme, že jste si zašli do kavárny na šálek výborné kávičky a kavárna disponuje (pro hosty) připojením k Internetu.

Je dobré si uvědomit, že s pokud použijete Linux, jste zpravidla odkázáni sami na sebe. Ať už budete ve zmíněné kavárně nebo na konferenci, znalosti obsluhy budou zpravidla hodně omezené a stupeň abstrakce nad použitím bezdrátového připojení téměř nulový (takže možná zvládnou naklikání ve Windows a vyřešení jednoduchých problémů, po zahlédnutí příkazového interpretu namísto klikacích ikonek ale zpravidla ztratí úplně přehled), což samozřejmě není chyba, ovšem je potřeba s tím počítat.

Kavárník či kavárnice vám tedy ochotně přinese požadovaný nápoj (a účet), později také možná heslo, ale víc od nich čekat nebudeme.

iwlist

Tak a s chutí do toho. Prvním nástrojem, který nám prozradí většinu sítových parametrů je program iwlist, s jeho pomocí proscanujeme pásmo pro Wifi a zjistíme, co vlastně dokážeme chytit.

Určitě je dobré vědět, s čím máme tu čest pracovat:

hostname:~# iwlist --help
Usage: iwlist [interface] scanning
              [interface] frequency
              [interface] channel
              [interface] bitrate
              [interface] rate
              [interface] encryption
              [interface] key
              [interface] power
              [interface] txpower
              [interface] retry
              [interface] ap
              [interface] accesspoints
              [interface] peers
              [interface] event

Vida, iwlist nám pomůže nejenom s prohledáním pásma, ale dokáže nám výsledky rozumně filtrovat podle mnoha kritérií. Základní použití bude ale přesto pouhé prohledání:

hostname:~# iwlist scanning
lo        Interface doesn't support scanning.

eth0      Interface doesn't support scanning.

eth1      No scan results

Teď bohužel nemáme štěstí, žádná síť není v dosahu. Za předpokladu, že nemáte například zapnuté tlačítko pro vypínání vysílacího výkonu bezdrátových zařízení v notebooku, budete chtě nechtě muset změnit pozici, nasměrovat jinam anténu nebo třeba připojit externí; každopádně se tak dostat na místo pokryté použitelným signálem.

V naší kavárně ale signál je, proto teď už najisto spustíme vyhledávání, tentokrát elegantně se zkrácenou verzí příkazu a se zavoláním konkrétního zařízení (které je v mém případě eth1, ovšem u vás může být třeba wlan0):

hostname:~# iwlist eth1 scan
eth1      Scan completed :
          Cell 01 - Address: 00:15:C7:EE:B5:50
                    ESSID:"kavarna"
                    Protocol:IEEE 802.11bg
                    Mode:Master
                    Channel:5
                    Encryption key:off
                    Bit Rate:54 Mb/s
                    Extra: Rates (Mb/s): 1 2 5.5 6 9 11 12 18 24 36 48 54
                    Quality=49/100  Signal level=-83 dBm
                    Extra: Last beacon: 140ms ago
          Cell 02 - Address: 00:15:C7:EE:B4:E0
                    ESSID:"kavarna-secured"
                    Protocol:IEEE 802.11bg
                    Mode:Master
                    Channel:11
                    Encryption key:on
                    Bit Rate:54 Mb/s
                    Extra: Rates (Mb/s): 1 2 5.5 6 9 11 12 18 24 36 48 54
                    Quality=41/100  Signal level=-76 dBm
                    Extra: Last beacon: 49ms ago
          Cell 03 - Address: 00:15:C7:EE:7B:90
                    ESSID:"kavarna-secured2"
                    Protocol:IEEE 802.11bg
                    Mode:Master
                    Channel:1
                    Encryption key:on
                    Bit Rate:54 Mb/s
                    Extra: Rates (Mb/s): 1 2 5.5 6 9 11 12 18 24 36 48 54
                    Quality=53/100  Signal level=-80 dBm 
                    Extra:wpa_ie=db180050e20101000050f20001000050f202010000
                                 50f2002800
                    Extra: Last beacon: 375ms ago

Tak, teď máme vše, co jsme potřebovali, takže se s iwlistem rozloučíme třeba výpisem dostupných rychlostních modů:

hostname:~# iwlist eth1 rate
eth1      12 available bit-rates :
          1 Mb/s
          2 Mb/s
          5.5 Mb/s
          11 Mb/s
          6 Mb/s
          9 Mb/s
          12 Mb/s
          18 Mb/s
          24 Mb/s
          36 Mb/s
          48 Mb/s
          54 Mb/s
          Current Bit Rate=0 kb/s

iwconfig

A směle do připojení. Pro to použijeme nástroj iwconfig:

hostname:~# iwconfig --help
Usage: iwconfig interface [essid {NN|on|off}]
                          [nwid {NN|on|off}]
                          [mode {managed|ad-hoc|...}
                          [freq N.NNNN[k|M|G]]
                          [channel N]
                          [ap {N|off|auto}]
                          [sens N]
                          [nick N]
                          [rate {N|auto|fixed}]
                          [rts {N|auto|fixed|off}]
                          [frag {N|auto|fixed|off}]
                          [enc {NNNN-NNNN|off}]
                          [power {period N|timeout N}]
                          [txpower N {mW|dBm}]
                          [commit]
       Check man pages for more details.

Jako asi první příklad vypíšeme stav bezdrátových zařízení:

hostname:~# iwconfig
lo        no wireless extensions.

eth0      no wireless extensions.

eth1      unassociated  ESSID:"down"
          Mode:Managed  Frequency=2.417 GHz  Access Point: 00:00:00:00:00:00
          Bit Rate=0 kb/s   Tx-Power=20 dBm
          RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality:0  Signal level:0  Noise level:0
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:237   Missed beacon:0

Teď už nám půjde jenom o to, nastavit bezdrátovou kartu tak, aby jednotlivé položky výpisu obsahovaly správné hodnoty, ty, které nám řekl iwlist. Protože se budeme připojovat k AP, zajímá nás režim managed.

mode managed

Tak, nyní se můžeme připojit.

Přepneme bezdrátové zařízení do managed módu:

hostname:~# iwconfig eth1 mode managed

A nastavíme potřebné parametry, které nám prozradil iwlist. V tuto chvíli použijeme první nalezenou síť, kde není nastaveno žádné šifrování (které je představeno o něco níže).

hostname:~# iwconfig essid kavarna

hostname:~# iwconfig channel 5

Elegantně lze celou sérii příkazů napsat na jeden řádek:

hostname:~# iwconfig eth1 mode managed essid kavarna channel 5

Úspěšné připojení poznáte třeba příkazem iwconfig bez zvláštního parametru:

hostname:~# iwconfig eth1
eth1      IEEE 802.11g  ESSID:"kavarna"
          Mode:Managed  Frequency:2.432 GHz  Cell: 02:12:E0:51:5E:48
          Bit Rate=54 Mb/s   Tx-Power=20 dBm
          RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality:55  Signal level:0  Noise level:0
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:237   Missed beacon:0

Kromě teoretické maximální rychlosti se zde také třeba dozvíte, jak kvalitní získáváte signál nebo vysílací výkon.

Zpravidla následuje získání síťových parametrů přes DHCP, to zvládne několik programů, zkusit můžete dhclient nebo pump, pokud je nějaký nainstalovaný, hádám, že to bude jeden z nich.

Tedy:

hostname:~# dhclient eth1

nebo:

hostname:~# pump -i eth1

A konečně, obligátní použití příkazu ping:

hostname:~# ping www.linuxsoft.cz
PING www.linuxsoft.cz (82.208.29.37) 56(84) bytes of data.
64 bytes from ip37.motylek.com (82.208.29.37): icmp_seq=1 ttl=54 time=51.44 ms
64 bytes from ip37.motylek.com (82.208.29.37): icmp_seq=2 ttl=54 time=51.51 ms
64 bytes from ip37.motylek.com (82.208.29.37): icmp_seq=3 ttl=54 time=51.41 ms

--- www.linuxsoft.cz ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 51.419/51.459/51.511/0.058 ms

Nás v tuto chvíli zajímá pouze jak se připojit, pokud už získáte adresu a přesto se na Internet nedostanete, možná provider zvolil jenom jinou taktiku při autentizaci. Například tak můžete narazit na situaci, kdy se připojíte, dostanete síťovou adresu, ale všechny pokusy o přístup k webu jsou přesměrovány na autentizační stránku poskytovatele, kde musíte zadat potřebné údaje.

WEP

I když je (spíše filozofickou) otázkou, zda samotný fyzický/linkový provoz WiFi šifrovat, je možné a obvyklé nějaké šifrování použít. Tím prvním je WEP (Wired Equivalent Privacy), přímá součást standardu IEEE 802.11, ovšem už překonaná a především, triviálně zlomitelná (s běžným nástrojem řekněme do 10 minut), ovšem stále používaná především kvůli její jednoduchosti a široké podpoře zařízení.

WEP pracuje typicky s 40 bitovým klíčem, případně s rozšířenou verzí s délkou 104 bitů (do "kulatých" čísel připočítejte 24 bitový inicializační vektor [IV]), nás především zajímá, že (pokud ho už nemáme) požádáme obsluhu o "heslo pro připojení k síti". V závislosti na použitém šifrování nebo zápisu hesla, můžete dostat na papírku následující řetězce:

Paráda, máme co potřebujeme.

Užitečné bude nejdříve vědět, jak šifrování vypnout:

hostname:~# iwconfig eth1 encryption off

A následně je už předání správných parametrů systému jednoduché, jenom je třeba rozlišovat, jestli se jedná o hexadecimálně zadaný klíč (obsahující pouze znaky 0-9 a A-F, běžně oddělovaný po 4 znacích) nebo řetězec.

V našich případech bude tedy správné:

hostname:~# iwconfig eth1 enc s:segafredo

hostname:~# iwconfig eth1 enc 7365676166

hostname:~# iwconfig eth1 encryption 7365-6761-66

hostname:~# iwconfig eth1 key 7365-6761-6672-6564-6F00-0000-00

Prosím všimněte si, že parametry enc, encryption a key jsou ekvivalenty, prefix s: před heslem znamená, že ho udáváme jako řetězec.

Příkaz pak buďto vložíme do posloupnosti příkazů výše nebo jednoduše část bez iwconfig eth1 přidáme do jednořádkového nastavení. Ovšem samozřejmě použijeme jiný kanál, konkrétně 11 s ESSID kavarna-secured, o kterém nám iwlist prozradil, že používá šifrování.

WPA

V případě WPA se setkáváme s implementací části specifikace IEEE 802.11i, konkrétně se budeme autentizovat proti zařízení implementující IEEE 802.1x, typicky využívající mod PSK (pre-shared key). Pro nás to opět znamená jediné, poprosit o "heslo pro připojení k síti" a dostaneme nejspíš například řetězec:

Paráda, opět máme vše potřebné.

Nutno dodat, že s WPA je situace trošku horší, protože implementace IEEE 802.1x je v Linuxu trošku zvláštní, složí k tomu nástroj WPA Supplicant, který například na Debianu získáte instalací balíčku wpasupplicant.

Nejprve vygenerujeme klíč z hesla, které jsme dostali od obsluhy; SSID/ESSID jsme poznali z výpisu iwlistu výše, že se jedná o použití WEP jsme odhalili z řádek Encryption key:on a Extra:wpa....

hostname:~# wpa_passphrase kavarna-secured2 segafredo

network={
        ssid="kavarna-secured2"
        #psk="segafredo"
        psk=957595b5491edd06331fb43e954664d4e1a0ea3bb4b65ec61b3410123fa22481
}

wpa_passphrase rovnou generuje výstup v syntaxi konfiguračního souboru standardně umístěného v /etc/wpa_supplicant.conf, takže ho vygenerujeme:

hostname:~# wpa_passphrase kavarna-secured2 segafredo > /etc/wpa_supplicant.conf

A necháme wpa_supplicant, ať se předvede:

hostname:~# wpa_supplicant -B -i eth1 -D ipw -w -dd

Pokud byste se ztráceli v konfiguračních možnostech, použijte třeba parametr --help:

hostname:~# wpa_supplicant --help

...

usage:
wpa_supplicant [-BddehLqqvw] -i<ifname> -c<config file> [-D<driver>] \
    [-N -i<ifname> -c<conf> [-D<driver>] ...]

drivers:
hostap = Host AP driver (Intersil Prism2/2.5/3)
prism54 = Prism54.org driver (Intersil Prism GT/Duette/Indigo)
madwifi = MADWIFI 802.11 support (Atheros, etc.)
atmel = ATMEL AT76C5XXx (USB, PCMCIA)
wext = Linux wireless extensions (generic)
ndiswrapper = Linux ndiswrapper
ipw = Intel ipw2100/2200 driver
options:
-B = run daemon in the background
-d = increase debugging verbosity (-dd even more)
-K = include keys (passwords, etc.) in debug output
-t = include timestamp in debug messages
-h = show this help text
-L = show license (GPL and BSD)
-q = decrease debugging verbosity (-qq even less)
-v = show version
-w = wait for interface to be added, if needed
-N = start describing new interface

V našem případě chceme, aby daemon běžel na pozadí a vypisoval při připojování ladící informace, které se hodí třeba v případě, kdy něco nefunguje, jak má.

mode ad-hoc

Stává se, že se hodí spojit se s druhým počítačem třeba pro výměnu souborů, v tom případě najde uplatnění spojení ad-hoc; jde o poměrně snadný a elegantní způsob, rozhodně snazší, než se omezovat dráty:

hostname:~# iwconfig mode ad-hoc essid adhoc channel 7

Není asi potřeba zdůrazňovat, že na druhém počítači zadáte stejný příkaz, ESSID můžete zvolit téměř libovolné, kanál především v závislosti na tom, jak jsou v místě použití využívané.

mode monitor

Celkem užitečnou věcí je také monitorovací mód, kterým vám může pomoci zjistit, co za provoz na bezdrátové síti proudí v místě, kde kvůli bezpečnosti (např. kancelář) žádná být nesmí.

Jednoduše (pokud to ovladač podporuje) přepneme kartu do správného režimu:

hostname:~# iwconfig eth1 mode monitor

Zaktivníme síťové zařízení a pustíme třeba tcpdump:

hostname:~# ifconfig eth1 up
hostname:~# tcpdump -i eth1
...

Závěr

Doufám, že když nic jiného, tak vám článek byl alespoň úvodem do práce s bezdrátovými sítěmi na příkazovém řádku. V běžných případech by ale měl myslím stačit; takže si užijte pohodlného používání. ;)

Zdroje

Online verze článku: http://www.linuxsoft.cz/article.php?id_article=1351