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, Nodogsplashwshaper, 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.

Cập nhật firmware cho router TP-Link
Cập nhật firmware cho router TP-Link

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:

Đăng nhập giao diện LuCI
Đăng nhập giao diện LuCI

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ả:

Trang splash mới của wifi hotspot
Trang splash mới của wifi hotspot

Để 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%[==============&gt;] 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 đó. :)