Wednesday, 30 January 2013

Kết nối wifi bằng dòng lệnh

UPDATED: lỗi format bài viết (phần nội dung file wpa)

NOTE1: bài viết này thực hiện trên ubuntu 12.04 LTS, các phiên bản khác chưa test. Nếu bạn thực hiện thành công trên các phiên bản khác, vui lòng gõ lệnh `lsb_release -a` paste và comment là đã thành công. Cám ơn!
NOTE: bài viết này đòi hỏi có hiểu biết cơ bản về interface, route.

Một trong những câu lệnh rất ít người biết cách dùng đó là lệnh để config mạng wifi, bởi Ubuntu luôn đi kèm với NetworkManager.

Trước hết cần phân biệt loại key mà mạng wireless đó đang sử dụng.
Nếu là WEP: có thể dùng iwconfig
Nếu là WPA: phải dùng wpa_supplicant

hvn@lappy: ~ () $ sudo iwlist wlan0 scan | egrep -i 'ssid|WPA|WEP'
                    ESSID:"Home"
                    IE: WPA Version 1
                    ESSID:"familug"
                    IE: WPA Version 1

                    ESSID:"TP-LINK207"
                    IE: IEEE 802.11i/WPA2 Version 1
                    ESSID:"NGUYENKHOA"
                    IE: IEEE 802.11i/WPA2 Version 1
                    IE: WPA Version 1
                    ESSID:"Tuan Phuong"
                    IE: WPA Version 1
                    IE: IEEE 802.11i/WPA2 Version 1
                    ESSID:"NgaHome"
                    IE: IEEE 802.11i/WPA2 Version 1
                    IE: WPA Version 1
                    ESSID:"Quyen"
                    IE: IEEE 802.11i/WPA2 Version 1
                    IE: WPA Version 1


Mạng nhà tớ dùng chuẩn WPA nên tớ sẽ lấy làm ví dụ luôn:

Đầu tiên phải tạo 1 file chứa tên (ssid) và mật khẩu (passkey) của mạng nhà mình:

tớ đặt file đấy là familug.wpa:

root@lappy: ~/Documents () # cat familug.wpa
network={
    ssid="familug"
    psk="xxxxxxxx"

}

#CHÚ Ý: dấu } không cùng dòng với psk
Sau đó chạy lệnh wpa_supplicant để kết nối mạng:

root@lappy: ~/Documents () # wpa_supplicant -c familug.wpa -i wlan0 -B
ioctl[SIOCSIWENCODEEXT]: Invalid argument
ioctl[SIOCSIWENCODEEXT]: Invalid argument


Giải thích:
-c : config - đường dẫn đến file chứa tên và pass của mạng
-i : interface, ở đây là wlan0
-B : chạy ở chế độ background, sẽ không in ra gì kả
-d : nếu thay -B bằng option này, câu lệnh sẽ in ra terminal các thông số mà nó thu thập / xử lý

Trong /var/log/syslog sẽ có vài dòng như sau:

Jan 30 21:00:13 lappy wpa_supplicant[13910]: Trying to authenticate with c8:3a:35:0e:93:40 (SSID='familug' freq=2412 MHz)
Jan 30 21:00:13 lappy kernel: [ 2444.696805] wlan0: authenticate with c8:3a:35:0e:93:40 (try 1)
Jan 30 21:00:13 lappy wpa_supplicant[13910]: Trying to associate with c8:3a:35:0e:93:40 (SSID='familug' freq=2412 MHz)
Jan 30 21:00:13 lappy kernel: [ 2444.698860] wlan0: authenticated
Jan 30 21:00:13 lappy kernel: [ 2444.699092] wlan0: associate with c8:3a:35:0e:93:40 (try 1)
Jan 30 21:00:13 lappy kernel: [ 2444.702560] wlan0: RX AssocResp from c8:3a:35:0e:93:40 (capab=0x411 status=0 aid=4)
Jan 30 21:00:13 lappy kernel: [ 2444.702569] wlan0: associated
Jan 30 21:00:13 lappy wpa_supplicant[13910]: Associated with c8:3a:35:0e:93:40
Jan 30 21:00:13 lappy kernel: [ 2444.710144] ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
Jan 30 21:00:13 lappy wpa_supplicant[13910]: WPA: Key negotiation completed with c8:3a:35:0e:93:40 [PTK=CCMP GTK=CCMP]
Jan 30 21:00:13 lappy wpa_supplicant[13910]: CTRL-EVENT-CONNECTED - Connection to c8:3a:35:0e:93:40 completed (auth) [id=0 id_str=]


NOTE: chú ý là máy của bạn chỉ nên chạy 1 process wpa_suplicant thôi. Vậy nên trước khi chạy lệnh này, hãy `sudo killall wpa_supplicant`

Sau khi "kết nối" vào mạng rồi, bạn vẫn chưa thể vào internet, bởi còn phải route đường đi cho các gói tin. Mọi thứ có vẻ rắc rối hơn việc dùng giao diện để kết nối, thế nhưng những thứ này chính là những gì mà "giao diện" thực hiện.

root@lappy: ~ () # ip ro add default via 192.168.0.1
root@lappy: ~ () # ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_req=1 ttl=128 time=90.7 ms
^C
--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 90.734/90.734/90.734/0.000 ms

root@lappy: ~ () # ip ro
default via 192.168.0.1 dev wlan0
192.168.0.0/24 dev wlan0  proto kernel  scope link  src 192.168.0.103


Chỗ nào cần giải đáp cứ hỏi :D


PS:
Ví dụ để kết nối mạng WEP có trong `man iwconfig`
iwlist wlan0 scan
iwconfig wlan0 essid NETWORK_ID key WIRELESS_KEY