Trước đây mình đã hướng dẫn cách thiết lập WireGuard Client trên router Mikrotik để cấu hình mạng nội bộ ở nhà vượt mùa “đứt cáp”. Hôm nay mình sẽ hướng dẫn cách thiết lập WireGuard Client trên router OpenWRT.
Mục Lục
I. Yêu cầu chuẩn bị
- Router OpenWRT đã được cấu hình cho mạng nội bộ trong nhà.
- 1 VPS đã được thiết lập WireGuard Server. Bạn có thể tham khảo hướng dẫn dưới đây để tạo VPN Server miễn phí
Chú ý: Router mình sử dụng trong hướng dẫn này là GL.iNet Flint 2, cài đặt OpenWrt 21.02-SNAPSHOT. Nếu bạn sử dụng các phiên bản OpenWRT khác, mình sẽ không chắc hướng dẫn bên dưới có sử dụng được không nhé.
II. Cài đặt WireGuard
Bạn có thể thao tác thông qua giao diện dòng lệnhCLI hoặc sử dụng giao diện Luci của OpenWRT
1. Sử dụng CLI
Truy cập vào router bằng terminal. Thay thế 192.168.0.1
bằng địa chỉ IP của Router
ssh root@192.168.0.1
Code language: Nginx (nginx)
Cài đặt WireGuard
opkg update
opkg wireguard-tools luci-app-wireguard luci-proto-wireguard vpn-policy-routing
Code language: Nginx (nginx)
Khởi động lại Router
reboot
2. Sử dụng Luci
Sử dụng trình duyệt web, đăng nhập vào trang quản trị của Router http://192.168.0.1
Di chuyển đến mục Systems -> Software.
- Bấm vào Update lists để cập nhật danh sách phần mềm
- Gõ vào tên package cần cài đặt: wireguard-tools / luci-app-wireguard / luci-proto-wireguard / vpn-policy-routing
- Bấm Install… để cài đặt

Tiếp theo chọn System -> Reboot để khởi động lại Router
III. Cấu hình WireGuard Client
1. Chuẩn bị file Wireguard Client
Trước tiên, bạn cần phải truy cập WireGuard VPN Server để tạo 1 Client mới dành cho Mikrotik và tải file conf về. Nội dung file sẽ tương tự như dưới đây.
[Interface]
PrivateKey = UDbFxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaN9Oms=
Address = 10.6.0.2/24
DNS = 10.2.0.100
[Peer]
PublicKey = e/VZhqIyyyyyyyyyyyyyyyyyyyyyyyyy/4wS37B5x8QMxg=
PresharedKey = 5XvmWvYUm2xxxxxxxxxxxxxxxxxxxxxxxxxxxlgYPoFzj8Q618=
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = 146.xxx.iii.eee:51820
PersistentKeepalive = 0
Chúng ta sẽ dùng thông tin trong file conf này để cấu hình WireGuard client trên router OpenWRT
2. Tạo WireGuard Interface
Trên giao diện Luci, truy cập vào mục Network > Interfaces. Bấm vào nút Add new Interface…

- Name: wg0
- Protocol: Wireguard VPN
Bấm Create interface

- Private Key: Nhập vào Private Key của file cấu hình WireGuard client
- IP Address: Nhập vào địa chỉ IP trong file cấu hình WireGuard client.

Chuyển qua tab Peers
- Public Key & Preshared Key: nhập thông số từ file cấu hình WireGuard client.
- Allow IPs: 0.0.0.0/0
- Endpoint Host: nhập thông số từ file cấu hình WireGuard client.
- Persistent Keep Alive: 25
Bấm Save để lưu lại.

Sau đó bấm nút Save & Apply trên giao diện quản lý Interfaces để lưu và áp dụng thông số mới tạo.
Truy cập vào mục Status > WireGuard để kiểm tra kết nối đã thực hiện thành công hay chưa.

IV. Cấu hình Firewall
1. Tạo Firewall Zone
Truy cập vào mục Network > Firewall. Bấm Add để tạo zone mới

- Name: vpn
- Input: reject
- Output: accept
- Forward: reject
- Cover networks: chọn Wireguard Interface
- Allow forward from source zones: lan.
Bấm Save để lưu lại

Bấm nút Save & Apply trên giao diện quản lý Firewall để lưu và áp dụng thông số mới tạo.
2. Tạo NAT Rules
Vẫn trong mục Firewall, chuyển qua tab NAT Rules. Bấm Add để tạo mới.
Cấu hình như bên dưới và bấm Save để lưu lại.

V. Cấu hình Routing Table
Truy cập vào giao diện CLI của Openwrt. Chỉnh sửa file /etc/iproute2/rt_tables
nano /etc/iproute2/rt_tables
Code language: Nginx (nginx)
Nếu hệ thống báo chưa có nano, bạn cần cài đặt thêm bằng lệnh opkg install nano
Thêm dòng này vào dưới cùng của file và lưu lại (Ctrl + O rồi Ctrl + X)
200 vpn
Code language: YAML (yaml)
Tạo route mặc định cho routing table vpn vừa tạo. Bạn cần thay thế wg0
bằng tên của Wireguard Interface tương ứng
ip route add default dev wg0 table vpn
Code language: Dockerfile (dockerfile)
Tạo thêm rule để sử dụng vpn
routing table cho các gói tin được đánh dấu 0x1
ip rule add fwmark 0x1 table vpn
Code language: Dockerfile (dockerfile)
Hai lệnh ip route
và ip rule
ở trên sẽ bị reset mỗi lần router khởi động lại. Để lưu lại thông số vĩnh viễn, chỉnh sửa file /etc/rc.local
, thêm vào 2 dòng này vào vào lưu lại.
ip route add default dev wg0 table vpn
ip rule add fwmark 0x1 table vpn
Code language: Dockerfile (dockerfile)
VI. Định tuyến cho thiết bị trong mạng nội bộ
Mình sẽ cấu hình cho một số thiết bị trong mạng nội bộ ở nhà đi qua WireGuard VPN bằng cách sử dụng tính năng đánh dấu gói tin của OpenWrt (Bên Mikrotik gọi là Mangle Rule).
Truy cập SSH vào router và nhập vào lệnh này
iptables -t mangle -A PREROUTING -s 192.168.0.111 -j MARK --set-mark 0x1
Code language: YAML (yaml)
Bạn cần thay thế 192.168.0.111
bằng địa chỉ IP của thiết bị cần định tuyến đi qua VPN.
Kiểm tra lại bằng lệnh
iptables -t mangle -L -v -n | grep 192.168.0.111
Code language: YAML (yaml)
Bạn sẽ thấy hiện ra
0 0 MARK all -- * * 192.168.0.111 0.0.0.0/0 MARK set 0x1
Code language: YAML (yaml)
Chuyển qua thiết bị có IP 192.168.0.111
, truy cập vào địa chỉ https://ifconfig.me
, nếu thấy hiện ra địa chỉ IP của Wireguard VPN Server, nghĩa là bạn đã thiết lập thành công. Nếu vẫn hiện ra địa chỉ Public IP của mạng nội bộ, bạn cần kiểm tra lại các bước trước đó.
Để xóa thiết lập định tuyến vừa mới tạo, sử dụng lệnh sau
iptables -t mangle -D PREROUTING -s 192.168.0.111 -j MARK --set-mark 0x1
Code language: YAML (yaml)
VII. Tạo custom command
Theo cách hướng dẫn ở trên, mỗi lần muốn kích hoạt VPN cho thiết bị trong mạng nội bộ, mình phải SSH vào Router, rồi gõ lệnh dài dòng. Để tiết kiệm thời gian mình sẽ tạo toggle script và custom command để có thể tắt / mở truy cập WireGuard VPN bằng trình duyệt web.
1. Tạo Toggle Script
Tạo script tắt mở VPN
nano /usr/bin/vpn-toggle
Code language: Nginx (nginx)
Nhập vào nội dung sau
#!/bin/sh
# Check if an IP address or range is provided
if [ -z "$1" ] || [ -z "$2" ]; then
echo "Usage: $0 {on|off|status} <IP_ADDRESS_OR_RANGE>"
echo "Example: $0 on 192.168.0.108"
echo "Example: $0 off 192.168.0.0/24"
exit 1
fi
ACTION="$1"
IP="$2"
RULE="iptables -t mangle -A PREROUTING -s $IP -j MARK --set-mark 0x1"
DELETE_RULE="iptables -t mangle -D PREROUTING -s $IP -j MARK --set-mark 0x1"
case "$ACTION" in
on)
# Add the rule if it doesn't already exist
if ! iptables -t mangle -C PREROUTING -s "$IP" -j MARK --set-mark 0x1 2>/dev/null; then
$RULE
echo "VPN routing for $IP is ON."
else
echo "VPN routing for $IP is already ON."
fi
;;
off)
# Remove the rule if it exists
if iptables -t mangle -C PREROUTING -s "$IP" -j MARK --set-mark 0x1 2>/dev/null; then
$DELETE_RULE
echo "VPN routing for $IP is OFF."
else
echo "VPN routing for $IP is already OFF."
fi
;;
status)
# Check if the rule exists
if iptables -t mangle -C PREROUTING -s "$IP" -j MARK --set-mark 0x1 2>/dev/null; then
echo "VPN routing for $IP is ON."
else
echo "VPN routing for $IP is OFF."
fi
;;
*)
echo "Invalid action. Usage: $0 {on|off|status} <IP_ADDRESS_OR_RANGE>"
exit 1
;;
esac
Code language: Bash (bash)
Lưu lại và thiết lập quyền thực thi cho file vpn-toggle
chmod +x /usr/bin/vpn-toggle
Code language: Nginx (nginx)
Mình có thể sử dụng script này để tắt mở định tuyến qua Wireguard VPN như sau
Kích hoạt VPN cho IP 192.168.0.111
vpn-toggle on 192.168.0.111
Code language: CSS (css)
Tắt VPN cho IP 192.168.0.111
vpn-toggle off 192.168.0.111
Code language: CSS (css)
Kiểm tra VPN đang tắt hay mở
vpn-toggle status 192.168.0.111
Code language: CSS (css)
2. Cài đặt luci-app-commands
Để có thể kích hoạt tắt mở VPN bằng trình duyệt web, mình sẽ dùng tính năng Custom Commands.
Cài đặt thêm package luci-app-commands
opkg update
opkg install luci-app-commands
Code language: Nginx (nginx)
Khởi động lại LuCi
/etc/init.d/uhttpd restart
Truy cập vào mục System > Custom Commands > Configure, mình tạo các mục như sau
- VPN ON TV:
/usr/bin/vpn-toggle on 192.168.0.108
(Kích hoạt VPN cho Iphone) - VPN OFF TV:
/usr/bin/vpn-toggle off 192.168.0.108
(Tắt VPN)
Bấm chọn thêm vào mục Public Access để có thể tắt mở nhanh bằng URL.
Bấm Save & Apply để lưu lại.

Chuyển qua tab Dashboard.
- Bấm vào nút RUN để kích hoạt command
- Bấm nút LINK để xem URL dùng để kích hoạt command

Vậy là xong. WireGuard VPN đã sẵn sàng phục vụ mỗi khi cần.
Nếu bạn cần hỗ trợ kỹ thuật miễn phí, vui lòng gửi câu hỏi trực tiếp ở phần Thảo luận bên dưới, mình sẽ trả lời trong thời gian sớm nhất.
Bạn cần hỗ trợ kỹ thuật chuyên sâu?
Khám phá các gói dịch vụ giúp bạn tối ưu công việc và vận hành hệ thống hiệu quả hơn. Từ chăm sóc website đến hỗ trợ kỹ thuật, mọi thứ đều linh hoạt và phù hợp với nhu cầu của bạn.