imx6ul之OpenWRT中使用无线网卡做中继器与AP热点6 C+ F* j# g" t2 q; A3 P/ M
" H4 F5 X) H" j中继器与AP的实现这里我们假定中继器完成下面这样的一个功能: Wired Network ---> Wireless Network ---> 上级无线路由器
0 s$ |) e9 Q1 y- v# Q( x
即从外部插入一个网线,通过imx6UL上面的无线网卡将数据转发到上级的路由器上面, 当然也可以完成下面这样的传送:
( y( V3 _5 l" E- R# g/ n/ p Wireless Network(AP mode) --> Wireless Network(Client) --> 上级无线路由器
9 O* E( H8 [1 W, @: @
即设立一个AP热点,相当于一个路由器,然后再将这个AP的数据通过另外一个无线网卡转发到上一级的路由器或者WLAN上面。 用图片来表示如下:
6 B0 X+ {6 v( C5 D要完成这些功能, 我们需要: - 1. 驱动无线网卡
- 2. 建立AP热点
- 3. 其中一个wired或者wireless介入到上一级路由器或者WLAN中
- 4. 使用IPTables来对数据包进行转发3 E2 J' G5 `" x: n0 n0 X! w8 s. F: m F1 z
- D! P7 ?. H! F% H% X* M" k+ w
对于1,我们在前面已经完成,对于Wired Network访问WLAN我们也已经在前面完成。所以这篇我们将完成2与3, 以及4。 ) I5 n* L$ q! q4 M3 U8 E* k
AP热点的建立建立AP热点,我们使用经典的Hostapd工具来完成, 这个在OpenWRT中已经存在, 直接选上,然后build即可。 Hostapd的使用, X. p1 v! M4 L% @' ^2 } {
然后我们可以查看对应的使用帮助 [plain] view plaincopy
8 t' ?* x4 z0 ]; R; D. N' u; b5 c0 @# q( @1 d0 X& n
, z* f: B) Y; w3 I- root@(none):/# hostapd --help
- hostapd: invalid option -- '-'
- hostapd v2.5
- User space daemon for IEEE 802.11 AP management,
- IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
- Copyright (c) 2002-2015, Jouni Malinen <j@w1.fi> and contributors
-
- usage: hostapd [-hdBKtv] [-P <ID file>] [-e <entropy file>] \
- [-g <global ctrl_iface>] [-G <group>] \
- <configuration file(s)>
-
- options:
- -h show this usage
- -d show more debug messages (-dd for even more)
- -B run daemon in the background
- -e entropy file
- -g global control interface path
- -G group for control interfaces
- -P PID file
- -K include key data in debug messages
- -t include timestamps in some debug messages
- -v show hostapd version
4 E9 ~2 U: `4 m$ h4 Z6 ~$ ]
3 ~4 G1 x* k, ^4 f- b! o% t8 Q. V# t. @3 ] |/ x/ Q. C
因此可以确定需要一个config文件, 这个configuration file我们如下填写:! z6 q) {2 m3 n
[plain] view plaincopy, n6 T8 w1 d% k9 s
3 i" U: A. ?! @; y# r' o2 N9 b
: B8 l: b4 D( H# [* g, g- root@(none):/# cat /etc/hostapd_ori.conf
- interface=wlan1
- ssid=TonyOpenWRT
- channel=9
- hw_mode=g
- ignore_broadcast_ssid=0
- auth_algs=1
- wpa=3
- wpa_passphrase=TonyHo123456
- wpa_key_mgmt=WPA-PSK
- wpa_pairwise=TKIP
- rsn_pairwise=CCMP
. F/ ^+ o, b: d/ @5 E5 S5 ^# P' O # n% g. {$ S+ B& @- M# o
即我们创建一个SSID为TonyOpenWRT的热点, wpa_passphrase为密码, 后面的为加密方式, 然后还选择了channel, 这个channel可以通过前面的iw list来查看, 例如其中一个为:$ z* e+ K2 a- ?
[plain] view plaincopy
" q/ }, L2 d! b$ s m5 @# W
5 c5 L {8 Q% c% F2 j. P7 [0 }* ^6 [. K2 S C
- Frequencies:
- * 2412 MHz [1] (20.0 dBm)
- * 2417 MHz [2] (20.0 dBm)
- * 2422 MHz [3] (20.0 dBm)
- * 2427 MHz [4] (20.0 dBm)
- * 2432 MHz [5] (20.0 dBm)
- * 2437 MHz [6] (20.0 dBm)
- * 2442 MHz [7] (20.0 dBm)
- * 2447 MHz [8] (20.0 dBm)
- * 2452 MHz [9] (20.0 dBm)
- * 2457 MHz [10] (20.0 dBm)
- * 2462 MHz [11] (20.0 dBm)
- * 2467 MHz [12] (disabled)
- * 2472 MHz [13] (disabled)
- * 2484 MHz [14] (disabled)
9 M; j( l4 S8 s& l
3 U; y8 ?+ C1 p: s9 H
, ]3 U$ ]/ f3 F后面的【】中的就是channel了。* p u) s0 ?) [7 R' y6 m2 o
建立AP
$ n" l, s3 a( C$ J4 C2 r5 J* x% {然后我们使用后台运行的方式启动hostapd,并且打开debug信息,便于我们查看: [plain] view plaincopy
. ]) G8 {( c! w7 r2 q w- [6 [/ X, L3 `+ b- X1 n$ R3 T$ x
5 O1 O1 c6 M# A2 A* v+ m. q- root@(none):/# hostapd -B -d /etc/hostapd_ori.conf
- random: Trying to read entropy from /dev/random
- Configuration file: /etc/hostapd_ori.conf
- rfkill: Cannot open RFKILL control device
- nl80211: RFKILL status not available
- nl80211: TDLS supported
- nl80211: TDLS external setup
- nl80211: Supported cipher 00-0f-ac:1
- nl80211: Supported cipher 00-0f-ac:5
- nl80211: Supported cipher 00-0f-ac:2
- nl80211: Supported cipher 00-0f-ac:4
- nl80211: Supported cipher 00-0f-ac:6
- nl80211: Using driver-based off-channel TX
- nl80211: Use separate P2P group interface (driver advertised support)
- nl80211: interface wlan1 in phy phy1
- nl80211: Set mode ifindex 9 iftype 3 (AP)
- nl80211: Setup AP(wlan1) - device_ap_sme=0 use_monitor=0
- nl80211: Subscribe to mgmt frames with AP handle 0xcfd5d8
- nl80211: Register frame type=0xb0 (WLAN_FC_STYPE_AUTH) nl_handle=0xcfd5d8 match=
- nl80211: Register frame type=0x0 (WLAN_FC_STYPE_ASSOC_REQ) nl_handle=0xcfd5d8 match=
- nl80211: Register frame type=0x20 (WLAN_FC_STYPE_REASSOC_REQ) nl_handle=0xcfd5d8 match=
- nl80211: Register frame type=0xa0 (WLAN_FC_STYPE_DISASSOC) nl_handle=0xcfd5d8 match=
- nl80211: Register frame type=0xc0 (WLAN_FC_STYPE_DEAUTH) nl_handle=0xcfd5d8 match=
- nl80211: Register frame type=0xd0 (WLAN_FC_STYPE_ACTION) nl_handle=0xcfd5d8 match=
- nl80211: Register frame type=0x40 (WLAN_FC_STYPE_PROBE_REQ) nl_handle=0xcfd5d8 match=
- [ 495.443813] IPv6: ADDRCONF(NETDEV_UP): wlan1: link is not ready
- nl80211: Add own interface ifindex 9
- nl80211: if_indices[16]: 9
- phy: phy1
- BSS count 1, BSSID mask 00:00:00:00:00:00 (0 bits)
- nl80211: Regulatory information - country=00
- nl80211: 2402-2472 @ 40 MHz 20 mBm
- nl80211: 2457-2482 @ 40 MHz 20 mBm (no IR)
- nl80211: 2474-2494 @ 20 MHz 20 mBm (no OFDM) (no IR)
- nl80211: 5170-5250 @ 160 MHz 20 mBm (no IR)
- nl80211: 5250-5330 @ 160 MHz 20 mBm (DFS) (no IR)
- nl80211: 5490-5730 @ 160 MHz 20 mBm (DFS) (no IR)
- nl80211: Added 802.11b mode based on 802.11g information
- Completing interface initialization
- Mode: IEEE 802.11g Channel: 9 Frequency: 2452 MHz
- DFS 0 channels required radar detection
- nl80211: Set freq 2452 (ht_enabled=0, vht_enabled=0, bandwidth=20 MHz, cf1=2452 MHz, cf2=0 MHz)
- * freq=2452
- * vht_enabled=0
- * ht_enabled=0
- RATE[0] rate=10 flags=0x1
- RATE[1] rate=20 flags=0x1
- RATE[2] rate=55 flags=0x1
- RATE[3] rate=110 flags=0x1
- RATE[4] rate=60 flags=0x0
- RATE[5] rate=90 flags=0x0
- RATE[6] rate=120 flags=0x0
- RATE[7] rate=180 flags=0x0
- RATE[8] rate=240 flags=0x0
- RATE[9] rate=360 flags=0x0
- RATE[10] rate=480 flags=0x0
- RATE[11] rate=540 flags=0x0
- hostapd_setup_bss(hapd=0xcfcf50 (wlan1), first=1)
- wlan1: Flushing old station entries
- nl80211: flush -> DEL_STATION wlan1 (all)
- wlan1: Deauthenticate all stations
- nl80211: send_mlme - da= ff:ff:ff:ff:ff:ff noack=0 freq=0 no_cck=0 offchanok=0 wait_time=0 fc=0xc0 (WLAN_FC_STYPE_DEAUTH) nlmode=3
- nl80211: send_mlme -> send_frame
- nl80211: send_frame - Use bss->freq=2452
- nl80211: send_frame -> send_frame_cmd
- nl80211: Frame command failed: ret=-16 (Device or resource busy) (freq=2452 wait=0)
- wpa_driver_nl80211_set_key: ifindex=9 (wlan1) alg=0 addr=(nil) key_idx=0 set_tx=0 seq_len=0 key_len=0
- wpa_driver_nl80211_set_key: ifindex=9 (wlan1) alg=0 addr=(nil) key_idx=1 set_tx=0 seq_len=0 key_len=0
- wpa_driver_nl80211_set_key: ifindex=9 (wlan1) alg=0 addr=(nil) key_idx=2 set_tx=0 seq_len=0 key_len=0
- wpa_driver_nl80211_set_key: ifindex=9 (wlan1) alg=0 addr=(nil) key_idx=3 set_tx=0 seq_len=0 key_len=0
- Using interface wlan1 with hwaddr 94:0c:6d:7c:12:f6 and ssid "TonyOpenWRT"
- Deriving WPA PSK based on passphrase
- SSID - hexdump_ascii(len=11):
- 54 6f 6e 79 4f 70 65 6e 57 52 54 TonyOpenWRT
- PSK (ASCII passphrase) - hexdump_ascii(len=12): [REMOVED]
- PSK (from passphrase) - hexdump(len=32): [REMOVED]
- random: Got 15/20 bytes from /dev/random
- random: Only 15/20 bytes of strong random data available from /dev/random
- random: Not enough entropy pool available for secure operations
- WPA: Not enough entropy in random pool for secure operations - update keys later when the first station connects
- GMK - hexdump(len=32): [REMOVED]
- Key Counter - hexdump(len=32): [REMOVED]
- WPA: Delay group state machine start until Beacon frames have been configured
- nl80211: Set beacon (beacon_set=0)
- nl80211: Beacon head - hexdump(len=62): 80 00 00 00 ff ff ff ff ff ff 94 0c 6d 7c 12 f6 94 0c 6d 7c 12 f6 00 00 00 00 00 00 00 00 00 00 64 00 11 04 00 0b 54 6f 6e 79 4f 70 65 6e 57 52 54 01 08 82 84 8b 96 0c 12 1y
- 01 09
- nl80211: Beacon tail - hexdump(len=65): 2a 01 04 32 04 30 48 60 6c 30 14 01 00 00 0f ac 02 01 00 00 0f ac 04 01 00 00 0f ac 02 00 00 dd 16 00 50 f2 01 01 00 00 50 f2 02 01 00 00 50 f2 02 01 00 00 50 f2 02 7f 08 00
- nl80211: ifindex=9
- nl80211: beacon_int=100
- nl80211: dtim_period=2
- nl80211: ssid - hexdump_ascii(len=11):
- 54 6f 6e 79 4f 70 65 6e 57 52 54 TonyOpenWRT
- * beacon_int=100
- nl80211: hidden SSID not in use
- nl80211: privacy=1
- nl80211: auth_algs=0x1
- nl80211: wpa_version=0x3
- nl80211: key_mgmt_suites=0x2
- nl80211: pairwise_ciphers=0x18
- nl80211: group_cipher=0x8
- nl80211: SMPS mode - off
- nl80211: beacon_ies - hexdump(len=10): 7f 08 00 00 00 00 00 00 00 40
- nl80211: proberesp_ies - hexdump(len=10): 7f 08 00 00 00 00 00 00 00 40
- nl80211: assocresp_ies - hexdump(len=10): 7f 08 00 00 00 00 00 00 00 40
- WPA: Start group state machine to set initial keys
- WPA: group state machine entering state GTK_INIT (VLAN-ID 0)
- GTK - hexdump(len=32): [REMOVED]
- WPA: group state machine entering state SETKEYSDONE (VLAN-ID 0)
- wpa_driver_nl80211_set_key: ifindex=9 (wlan1) alg=2 addr=0x8dc74 key_idx=1 set_tx=1 seq_len=0 key_len=32
- nl80211: KEY_DATA - hexdump(len=32): [REMOVED]
- broadcast key
- nl80211: Set wlan1 operstate 0->1 (UP)
- netlink: Operstate: ifindex=9 linkmode=-1 (no change), operstate=6 (IF_OPER_UP)
- wlan1: interface state UNINITIALIZED->ENABLED
- wlan1: AP-ENABLED
- wlan1: Setup of interface done.
- ctrl_iface not configured! : e* B2 P ^) K& _: V
% w1 G! M, B0 ]3 r/ b4 o9 M9 d! S$ j) f& m( N3 x
其中里面用到了加密时候需要的随机数,这个是使用内核中的random节点来生成的,所以我们在内核这两个还需要添加random驱动。
! W) H0 Z4 T3 J$ ?2 ?验证AP在验证之前,我们需要给我们的这个网卡自己一个IP地址, 因此直接: [plain] view plaincopy9 b8 w8 T) n. N6 S" H
1 Q" m5 i. G- U: } O# u
/ g4 }5 F1 f4 l3 L; A0 R- root@(none):/# ifconfig wlan1 192.168.2.1
- root@(none):/# ifconfig wlan1
- wlan1 Link encap:Ethernet HWaddr 94:0c:6d:7c:12:f6
- inet addr:192.168.2.1 Bcast:192.168.2.255 Mask:255.255.255.0
- inet6 addr: fe80::960c:6dff:fe7c:12f6/64 Scopeink
- UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
- RX packets:131 errors:0 dropped:0 overruns:0 frame:0
- TX packets:106 errors:0 dropped:0 overruns:0 carrier:0
- collisions:0 txqueuelen:1000
- RX bytes:20162 (19.6 KiB) TX bytes:20954 (20.4 KiB) 1 b" M5 q9 s! K9 E+ J* [, q
+ i0 b: C8 E& B9 x t) N F4 X
* v; K- ] K" b: W7 E5 h% ]
然后我们打开手机查看是否可以看到我们的热点:
/ P3 o9 w. A: b" y/ E' z# d; b6 C5 P' D9 I% v [% n1 v; j
然后我们使用手动配置IP方式连接热点! Q* X& f. `& A9 F
3 |% J X) d, u( ?# L( I连接完成后, 我们可以看到已经连接的状态:
1 @# c1 V0 P4 B' s0 h! r/ o0 s! \/ x然后在手机上面可以Ping一把确定是否连通: 0 b: [6 s7 S7 v. f% ^' E/ A
然后在iMX6UL上面也来ping一把这个手机: [plain] view plaincopy* R9 e N- ^" T# S( s( E8 H
' m9 m5 A3 i3 i$ A+ K& y S4 I1 N8 W
- root@(none):/# ping 192.168.2.111
- PING 192.168.2.111 (192.168.2.111): 56 data bytes
- 64 bytes from 192.168.2.111: seq=0 ttl=64 time=90.952 ms
- 64 bytes from 192.168.2.111: seq=1 ttl=64 time=143.093 ms
- 64 bytes from 192.168.2.111: seq=2 ttl=64 time=4.508 ms
- 64 bytes from 192.168.2.111: seq=3 ttl=64 time=46.859 ms
- 64 bytes from 192.168.2.111: seq=4 ttl=64 time=2.539 ms
- 64 bytes from 192.168.2.111: seq=5 ttl=64 time=2.697 ms
- ^C
- --- 192.168.2.111 ping statistics ---
- 6 packets transmitted, 6 packets received, 0% packet loss
- round-trip min/avg/max = 2.539/48.441/143.093 ms
^6 Y6 k7 n7 d) w3 N1 I3 g
4 n' p9 d$ B+ Q$ M8 N: m# l5 o5 F6 A. a( s1 ?1 E
至此,基本的连接就好了, 如果想要自动获取IP地址,那么我们还需要配置DHCPD。9 m9 S$ X& M% j" m
$ P o3 r4 d' o wpa_supplicant的配置前面我们使用其中一个网卡,配置好了AP, 接下来我们使用另外一个Wireless作为上一级router的接入设备。 这个可以参考我以前写的文章: Yocto i.MX6 (TQIMX6) (03) : wifi网卡的相关工具wpa_supplicant与dhcp 9 O9 Z# o: ~ N! s+ b
但是wpa_supplicant的版本升级后, 和hostapd的使用基本一致起来, 因此以前的使用方法稍微有些不同了。 配置创建一个配置文件,写明需要接入的SSID,密码等信息: [plain] view plaincopy
3 ?8 R4 u. s: [9 g% H: t& Z6 V. X8 R9 Q
1 S/ X! v9 w I7 O) n- O9 y- root@(none):/# cat /etc/wpa.conf
- ctrl_interface=/var/run/wpa_supplicant
- network={
- ssid="XXX"
- proto=WPA
- key_mgmt=WPA-PSK
- pairwise=TKIP
- group=TKIP
- psk="ASSWORD"
- } # Y3 M- m" N3 }: k; c3 q2 t- L. C8 H; i
+ E" u( C1 ], @" q/ }& x; U
) g( h O6 j/ s3 _
其中XXX是路由器的热点名字, psk填写Password, 加密方式TKIP需要根据实际情况填写,不明白可以看我以前的文章,或者直接man。9 D2 C. ?7 I2 h
运行先创建一个runtime目录: [plain] view plaincopy
0 g6 ?$ H* c9 m
- ^' B" B9 Y4 X& p6 f5 x
" |/ T# @0 J1 r" u) s- root@(none):/# mkdir /var/run/wpa_supplicant
% u% P! Q( ?7 S0 e7 d : ]2 H: \+ T2 f; X- ?& \& k
# P- c; Z( R2 O9 x4 v2 m4 i然后直接在后台运行:( s6 u' o* W' T0 r% _: _
[plain] view plaincopy3 X+ P$ S( w+ v" ?' Y) f- u1 l
5 k! E9 N* ], ]5 X4 Y/ l" Q- l6 H6 I- v
9 A4 U" o8 }3 I5 Q: J
- root@(none):/# wpa_supplicant -B -iwlan0 -c /etc/wpa.conf
- Successfully initialized wpa_supplicant
- rfkill: Cannot open RFKILL contro[ 172.506937] ieee80211 phy0: rt2x00lib_request_firmware: Info - Loading firmware file 'rt2870.bin'
- l device
- [ 172.527112] ieee80211 phy0: rt2x00lib_request_firmware: Info - Firmware detected - version: 0.29
- [ 173.083412] IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready
- root@(none):/# [ 174.937567] wlan0: authenticate with bc:d1:77:a0:4f:3c
- [ 175.073446] wlan0: send auth to bc:d1:77:a0:4f:3c (try 1/3)
- [ 175.082318] wlan0: authenticated
- [ 175.087051] rt2800usb 1-1.2.1:1.0 wlan0: disabling HT/VHT due to WEP/TKIP use
- [ 175.098735] wlan0: associate with bc:d1:77:a0:4f:3c (try 1/3)
- [ 175.108018] wlan0: RX AssocResp from bc:d1:77:a0:4f:3c (capab=0x411 status=0 aid=5)
- [ 175.129960] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
- [ 175.136678] wlan0: associated
- [ 176.069997] IPv6: wlan0: IPv6 duplicate address fe80::7edd:90ff:feb2:73b1 detected!
/ Q8 d4 u' b( s2 s9 [5 L ^ 5 D) w% R7 O( Y F: u# L) ~& L. t
) j+ |% c) p4 G% u1 n) p r
验证8 t5 T( n- u; _' @- _
使用wpa_cli看查看连接的状态
* p3 W" z1 {- e* w8 b' Z [plain] view plaincopy0 ]( i7 C2 ?# N5 r6 w: J$ _. i
/ W& l' |2 t) @$ i) ?
) o# T6 e) I- B9 n$ @7 q- e3 G
- root@(none):/# wpa_cli status
- Selected interface 'wlan0'
- bssid=bc:d1:77:a0:4f:3c
- freq=2412
- ssid=XXX
- id=0
- mode=station
- pairwise_cipher=TKIP
- group_cipher=TKIP
- key_mgmt=WPA-PSK
- wpa_state=COMPLETED
- address=7c:dd:90:b2:73:b1
- uuid=1e82e362-f927-544e-aa4d-1a229533944c 3 Q6 a! M3 B2 q, N0 T6 ~4 o
n4 b0 {5 b" X/ u2 U7 D, P
status为COMPLETED那么表示连接上了, 然后我们获取IP地址, 并尝试ping国内的某个网站:) f) d# V* Y* a, ?7 S% }: E
[plain] view plaincopy
. G1 w$ i) F# v* n( c3 P/ n: P
4 n! S6 K/ ?' J+ w0 C) E* j2 ?, \6 i7 K; Z$ ]$ v# _) Z+ }) v* v2 p
- root@(none):/# udhcpc -i wlan0
- udhcpc (v1.24.1) started
- Sending discover...
- Sending select for 192.168.1.112...
- Lease of 192.168.1.112 obtained, lease time 86400
- /etc/udhcpc.d/50default: Adding DNS 192.168.1.1
- /etc/udhcpc.d/50default: Adding DNS 0.0.0.0
-
- root@(none):/# ping meitu.com
- PING meitu.com (42.62.69.156): 56 data bytes
- 64 bytes from 42.62.69.156: seq=0 ttl=42 time=44.499 ms
- 64 bytes from 42.62.69.156: seq=1 ttl=42 time=44.956 ms
- 64 bytes from 42.62.69.156: seq=2 ttl=42 time=43.122 ms
- 64 bytes from 42.62.69.156: seq=3 ttl=42 time=43.387 ms
- 64 bytes from 42.62.69.156: seq=4 ttl=42 time=46.467 ms
- 64 bytes from 42.62.69.156: seq=5 ttl=42 time=46.267 ms
- 64 bytes from 42.62.69.156: seq=6 ttl=42 time=43.843 ms
- ^C
- --- meitu.com ping statistics ---
- 7 packets transmitted, 7 packets received, 0% packet loss
- round-trip min/avg/max = 43.122/44.648/46.467 ms - I. E( Y1 K" b6 E* }, M
/ Q1 @' ~8 S x0 ~- X" ?3 K
至此, 我们就完成了基本的配置工作。6 P( J+ i5 g% K; y: ?0 P9 b
3 Y# l2 M& U6 z2 I, S# x t
; D; Y' C% S9 U' s1 Q+ @' W
; `0 g J; O* Q8 V本文链接:https://www.ngui.cc/el/1322000.html
$ P# R+ }' w. N4 X" Z( y: J( B5 {# `; ^' d# a6 V: F( t, q
|