Tạo wifi hotspot với TP-Link WR1043ND, OpenWRT, Nodogsplash
Mình có mua một router wifi TP-Link TL-WR1043ND và cần phát wifi cho một số người dùng. Ngoài việc phát wifi ra mình còn muốn tạo một trang web mặc định mỗi khi người dùng truy cập vào (captive portal) để hiện một số nhắc nhở, thông báo, và kiểm soát lưu lượng theo từng máy để không có máy nào chiếm hết băng thông. Bằng cách sử dụng OpenWRT, Nodogsplash và wshaper, mình đã có thể làm được hết các yêu cầu trên.
Cài đặt OpenWRT cho router
Bạn tải về OpenWRT cho WR1043ND ở đây: http://downloads.openwrt.org/snapshots/trunk/ar71xx/openwrt-ar71xx-generic-tl-wr1043nd-v2-squashfs-factory.bin
Sau đó đăng nhập vào router, phần System Tools -> Firmware Upgrade, bấm `Browse` rồi chọn file vừa tải về. Sau đó bấm `Upgrade`. Sẽ mất một vài phút để router cập nhật firmware, sau đó nó sẽ tự khởi động lại.
Khi router khởi động lại xong, bạn sẽ cần đăng nhập vào router và setup một vài thứ như password root, giao diện web… Trước tiên `telnet` vào router:
telnet 192.168.1.1
Đặt mật khẩu cho root:
passwd
Sau khi đã đặt mật khẩu xong, bạn có thể làm việc qua SSH với router này. Bấm `Ctrl + D` để thoát ra và kết nối SSH bằng mật khẩu bạn vừa tạo:
ssh [email protected]
Sau đó cài đặt giao diện web cho router (LuCI) để bạn có thể quản lý được nhiều thứ trực quan hơn:
opkg update
opkg install luci
/etc/init.d/uhttpd start
/etc/init.d/uhttpd enable
Sau khi đã có giao diện web, chúng ta có thể thao tác với router thông qua địa chỉ: http://192.168.1.1, với user là `root` và mật khẩu bạn đã đặt:
Mặc định sau khi cài đặt, OpenWRT sẽ phát một mạng wifi là `OpenWRT` không có password. Bạn có thể thay đổi cài đặt trong mục Network -> Wifi. Ở đây mình sẽ không đi chi tiết vào việc cài đặt này.
Cài đặt Nodogsplash
Nodogsplash là chương trình giúp tạo captive portal, là trang web mặc định bạn sẽ thấy sau khi đăng nhập vào một hotspot. Trên trang captive portal này cũng có thể yêu cầu bạn nhập thêm username hoặc password để sử dụng được Internet. Để cài đặt, từ cửa sổ kết nối SSH lúc nãy:
opkg install nodogsplash
Cho phép nodogsplash chạy khi router khởi động:
/etc/init.d/nodogsplash enable
Sau đó thay đổi một số thiết lập của Nodogsplash
vim /etc/nodogsplash/nodogsplash.conf
Bạn có thể đọc kỹ hơn các ghi chú trong file config này để tùy chỉnh theo ý mình tốt hơn. Hoặc tham khảo file cấu hình của mình tại đây: https://gist.github.com/minhdanh/14c379a31b71c5a85c02. Có một số điểm cần chú ý:
Block `FirewallRuleSet authenticated-users` thiết lập các rule tường lửa cho những user đã authenticated (tức là nhập vào đúng username/password, hoặc nhấn vào một link trên trang captive portal). Trong config của mình, mình chỉ cho phép user sử dụng dịch vụ Web, DNS, SSH.
Block `FirewallRuleSet preauthenticated-users` cũng tương tự, nhưng áp dụng cho những user chưa authenticated (là chỉ mới đăng nhập vào mạng wifi, chưa “đụng chạm” gì tới trang captive portal). Trong file cấu hình ví dụ, mình cho phép dùng dịch vụ DNS, và cho phép truy cập đến cổng 80, 443 của chính router để người dùng có thể xem được trang splash.
Block `FirewallRuleSet users-to-router` cho phép user truy cập đến cổng nào của router.
`GatewayName Wifi Login`: Thiết lập tên cho gateway là `Wifi Login`. Bạn không dùng được tiếng Việt có dấu đâu nhé.
`MaxClients 50`: Số lượng user tối đa được kết nối vào router.
`ClientIdleTimeout 300`: Thời gian nếu user không hoạt động sẽ phải authenticate lại (300 giây).
`ClientForceTimeout 3600`: Sau một giờ (3600 giây) bắt buộc user phải authenticate lại.
`PasswordAuthentication no`: Bắt buộc user nhập password vào hay không. Nếu có thì bạn cần chỉnh lại mật khẩu ở parameter tiếp theo `Password`.
`UsernameAuthentication yes`: Yêu cầu nhập username hay không. Tương tự như trên.
`GatewayPort 2050`: Cổng mặc định mà nodogsplash chạy. Bạn có thể để mặc định.
Trang web mặc định của nodogplash đặt ở `/etc/nodogsplash/htdocs/splash.html`. Bạn có thể sửa đổi tùy theo ý thích, mà khả năng là bạn sẽ muốn sửa nó vì trang mặc định của nodogsplash rất xấu `>_<`. Mình đã sửa lại thành một trang bootstrap dễ coi hơn, bạn có thể tham khảo tại đây: https://github.com/minhdanh/nodogsplash-splash
Lưu ý: Nodogsplash sử dụng web server không hỗ trợ mime-type text/css, text/javascript nên bạn không bỏ file css, js trong thư mục `/etc/nodogsplash/htdocs/` được. Do đó mình sử dụng thư mục web của LuCI (chạy trên cổng 80):
cd /www
mkdir nodogsplash-static
Sau khi thay đổi cài đặt theo ý muốn, bạn khởi động nodogsplash:
/etc/init.d/nodogsplash start
Để xem tình trạng của nodogsplash:
ndsctl status
NoDogSplash Status
====
Version: 0.9_beta9.9.8
Uptime: 31d 20h 43m 54s
Gateway Name: Wifi Login
Managed interface: br-lan
Managed IP range: 0.0.0.0/0
Server listening: 192.168.1.1:2050
Splashpage: /etc/nodogsplash/htdocs/splash.html
Traffic control: no
Total download: 0 kByte; avg: 2.90588e-09 kbit/s
Total upload: 0 kByte; avg: 0 kbit/s
====
Client authentications since start: 24
Current clients: 8
Client 0
IP: 192.168.1.169 MAC: 8c:0e:e3:xx:xx:xx
Added: Fri Apr 10 10:15:43 2015
Active: Sun Apr 12 10:30:07 2015
Active duration: 2d 0h 14m 24s
Added duration: 2d 0h 14m 24s
Token: 4108a5ad
State: Authenticated
Download: 1259853 kByte; avg: 58.0364 kbit/s
Upload: 69100 kByte; avg: 3.18317 kbit/s
...
====
Blocked MAC addresses: none
Allowed MAC addresses: N/A
Trusted MAC addresses: none
========
Kiểm soát băng thông
Nodogsplash có hỗ trợ việc giới hạn bandwidth, nhưng mình đã thử mà không thành công. Nên mình dùng một package riêng để kiểm soát việc này, đó là `wshaper`:
opkg install wshaper
Sau đó chỉnh lại tốc độ bạn muốn giới hạn
vim /etc/config/wshaper
config 'wshaper' 'settings'
option 'network' 'wan'
option 'downlink' '800'
option 'uplink' '128'
Ở đây mình giới hạn tốc độ download là 800Kb/s, tốc độ upload là 128Kb/s.
Tự chạy wshaper khi khởi động:
/etc/init.d/wshaper enable
Chạy wshaper:
/etc/init.d/wshaper start
Sau đó thử đăng nhập vào mạng wifi bạn vừa cấu hình, trang đăng nhập sẽ hiện ra, và đây là thành quả:
Để kiểm tra tốc độ download:
wget -O /dev/null http://cachefly.cachefly.net/1mb.test
--2015-04-12 16:59:37-- http://cachefly.cachefly.net/1mb.test
Resolving cachefly.cachefly.net... 205.234.175.175
Connecting to cachefly.cachefly.net|205.234.175.175|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1048576 (1.0M) [application/octet-stream]
Saving to: '/dev/null'
/dev/null 100%[==============>] 1.00M 94.0KB/s in 13s
2015-04-12 16:59:51 (78.9 KB/s) - '/dev/null' saved [1048576/1048576]
Xong rồi đó. :)