Skip to content
Thuan Bui's Blog
Go back

Thiết lập WireGuard Client trên router OpenWRT và định tuyến theo yêu cầu

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.

I. Yêu cầu chuẩn bị

https://thuanbui.me/huong-dan-thiet-lap-vpn-server-mien-phi-voi-oracle-cloud-vps/

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

Terminal window
ssh root@192.168.0.1

Cài đặt WireGuard

Terminal window
opkg update
opkg wireguard-tools luci-app-wireguard luci-proto-wireguard vpn-policy-routing

Khởi động lại Router

Terminal window
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.

  1. Bấm vào Update lists để cập nhật danh sách phần mềm

  2. Gõ vào tên package cần cài đặt: wireguard-tools / luci-app-wireguard / luci-proto-wireguard / vpn-policy-routing

  3. 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/24DNS = 10.2.0.100[Peer]PublicKey = e/VZhqIyyyyyyyyyyyyyyyyyyyyyyyyy/4wS37B5x8QMxg=PresharedKey = 5XvmWvYUm2xxxxxxxxxxxxxxxxxxxxxxxxxxxlgYPoFzj8Q618=AllowedIPs = 0.0.0.0/0, ::/0Endpoint = 146.xxx.iii.eee:51820PersistentKeepalive = 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…

Bấm Create interface

Chuyển qua tab Peers

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

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

Terminal window
nano /etc/iproute2/rt_tables

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)

Terminal window
200 vpn

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

Terminal window
ip route add default dev wg0 table vpn

Tạo thêm rule để sử dụng vpn routing table cho các gói tin được đánh dấu 0x1

Terminal window
ip rule add fwmark 0x1 table vpn

Hai lệnh ip routeip 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

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

Terminal window
iptables -t mangle -A PREROUTING -s 192.168.0.111 -j MARK --set-mark 0x1

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

Terminal window
iptables -t mangle -L -v -n | grep 192.168.0.111

Bạn sẽ thấy hiện ra

Terminal window
0 0 MARK all -- * * 192.168.0.111 0.0.0.0/0 MARK set 0x1

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

Terminal window
iptables -t mangle -D PREROUTING -s 192.168.0.111 -j MARK --set-mark 0x1

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

Terminal window
nano /usr/bin/vpn-toggle

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

Lưu lại và thiết lập quyền thực thi cho file vpn-toggle

Terminal window
chmod +x /usr/bin/vpn-toggle

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

Terminal window
vpn-toggle on 192.168.0.111

Tắt VPN cho IP 192.168.0.111

Terminal window
vpn-toggle off 192.168.0.111

Kiểm tra VPN đang tắt hay mở

Terminal window
vpn-toggle status 192.168.0.111

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

Terminal window
opkg update
opkg install luci-app-commands

Khởi động lại LuCi

Terminal window
/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

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.

Vậy là xong. WireGuard VPN đã sẵn sàng phục vụ mỗi khi cần.


Share this post on:

Previous Post
[wordpress-caddy-docker] - Cài đặt WordPress nhanh gọn, tối ưu hiệu năng
Next Post
Cache Warmer - Plugin tạo sẵn bộ nhớ cache, giúp tăng tốc WordPress