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í

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.1Code language: Nginx (nginx)

Cài đặt WireGuard

opkg update
opkg wireguard-tools luci-app-wireguard luci-proto-wireguard vpn-policy-routingCode 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.

  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/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_tablesCode 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 vpnCode 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 vpnCode 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 vpnCode language: Dockerfile (dockerfile)

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 vpnCode 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 0x1Code 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.111Code 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 0x1Code 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 0x1Code 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-toggleCode 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
        ;;
esacCode 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-toggleCode 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.111Code language: CSS (css)

Tắt VPN cho IP 192.168.0.111

vpn-toggle off 192.168.0.111Code language: CSS (css)

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

vpn-toggle status 192.168.0.111Code 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-commandsCode 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.

Để 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 *


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.