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ị

  • 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í

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

Cài đặt WireGuard

Terminal window
opkgupdate
opkgwireguard-toolsluci-app-wireguardluci-proto-wireguardvpn-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…

  • 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

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
200vpn

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
iprouteadddefaultdevwg0tablevpn

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

Terminal window
ipruleaddfwmark0x1tablevpn

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-tmangle-APREROUTING-s192.168.0.111-jMARK--set-mark0x1

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-tmangle-L-v-n|grep192.168.0.111

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

Terminal window
00MARKall--**192.168.0.1110.0.0.0/0MARKset0x1

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-tmangle-DPREROUTING-s192.168.0.111-jMARK--set-mark0x1

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"
exit1
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-tmangle-CPREROUTING-s"$IP"-jMARK--set-mark0x12>/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
ifiptables-tmangle-CPREROUTING-s"$IP"-jMARK--set-mark0x12>/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
ifiptables-tmangle-CPREROUTING-s"$IP"-jMARK--set-mark0x12>/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>"
exit1
;;
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-toggleon192.168.0.111

Tắt VPN cho IP 192.168.0.111

Terminal window
vpn-toggleoff192.168.0.111

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

Terminal window
vpn-togglestatus192.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
opkgupdate
opkginstallluci-app-commands

Khởi động lại LuCi

Terminal window
/etc/init.d/uhttpdrestart

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.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *