Trong các bài viết trước, mình đã chia sẻ hai cách thiết lập WireGuard VPN Server nhanh gọn với PiVPN và WireGuard Road Warrior. Cả hai phương pháp đều có chung đặc điểm là cài đặt trực tiếp lên hệ điều hành Linux và phải quản lý thông tin client bằng dòng lệnh.
Hôm nay mình sẽ giới thiệu thêm 1 cách thiết lập WireGuard VPN Server mới, theo mình là nhanh gọn và dễ sử dụng nhất hiện nay: wg-easy
Mục Lục
I. Giới thiệu wg-easy?
wg-easy là dự án mã nguồn mở (Github) được phát triển bởi Emile Nijssen nhằm đơn giản hoá cách cài đặt và quản lý WireGuard VPN.
wg-easy là một docker image được thiết lập sẵn WireGuard kèm theo 1 giao diện Web UI thân thiện để quản lý tài khoản. Thông qua Web UI, có thể tạo mới / xem thông tin / xoá tài khoản client mà không cần phải truy cập vào SSH và gõ lệnh.
Nhờ sử dụng công nghệ Docker, việc cài đặt và xoá bỏ wg-easy rất nhanh chóng, không gây ảnh hưởng đến hệ điều hành của server.
II. Cài đặt wg-easy
1. Cài đặt Docker & Docker-Compose
wg-easy hoạt động trên nền Docker nên yêu cầu server phải cài đặt sẵn Docker và Docker-Compose. Tham khảo hướng dẫn bên dưới nếu bạn chưa cài.
2. Chuẩn bị
Truy cập SSH vào Linux và chạy lệnh sau
mkdir ~/.wg-easy
cd ~/.wg-easy
wget https://raw.githubusercontent.com/WeeJeWel/wg-easy/master/docker-compose.yml
nano docker-compose.yml
Code language: Nginx (nginx)
Bạn cần đổi thông số WG_HOST=raspberrypi.local
thành địa chỉ Dynamic DNS của bạn.
Ngoài ra, bạn nên thiết lập thêm mật khẩu cho Web UI ở mục PASWORD=foobar123
để tính độ bảo mật. Nếu bạn không thay đổi, bất kỳ ai cũng có thể truy cập vào Web UI để chỉnh sửa client.
Ví dụ nội dung file docker-compose.yml
của mình sẽ giống như dưới đây
version: "3.8"
services:
wg-easy:
environment:
# ⚠️ Required:
# Change this to your host's public address
- WG_HOST=wgeasy.thuanbui.me
# Optional:
- PASSWORD=thuanbuidepchaivodichvutru
# - WG_PORT=51820
# - WG_DEFAULT_ADDRESS=10.8.0.x
# - WG_DEFAULT_DNS=1.1.1.1
# - WG_MTU=1420
# - WG_ALLOWED_IPS=192.168.15.0/24, 10.0.1.0/24
# - WG_PERSISTENT_KEEPALIVE=25
# - WG_PRE_UP=echo "Pre Up" > /etc/wireguard/pre-up.txt
# - WG_POST_UP=echo "Post Up" > /etc/wireguard/post-up.txt
# - WG_PRE_DOWN=echo "Pre Down" > /etc/wireguard/pre-down.txt
# - WG_POST_DOWN=echo "Post Down" > /etc/wireguard/post-down.txt
image: ghcr.io/wg-easy/wg-easy:13
container_name: wg-easy
volumes:
- .:/etc/wireguard
ports:
- "51820:51820/udp"
- "51821:51821/tcp"
restart: unless-stopped
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=1
Code language: YAML (yaml)
Nếu bạn thiết lập wg-easy trên máy VPS của Oracle Cloud, tham khảo bài viết này để sửa lỗi không truy cập được mạng sau khi kết nối vào WireGuard
3. Kích hoạt WireGuard
Kích hoạt WireGuard bằng lệnh
docker compose up -d
Code language: Nginx (nginx)
Bạn truy cập vào Web UI theo địa chỉ http://<Server-IP>:51821
để tạo WireGuard client. Đăng nhập bằng mật khẩu bạn đã thiết lập trong file docker-compose.yml
4. Tạo WireGuard Client
Giao diện Web UI quản lý WireGuard cực kỳ thân thiện và dễ sử dụng.
- Bấm New để tạo client.
- Bấm vào biểu tượng QR để xem QR code dùng để thiết lập WireGuard client trên điện thoại.
- Bấm vào biểu tượng Download để tải file cấu hình, dùng để thiết lập WireGuard client trên máy tính.
- Bấm biểu tượng Thùng Rác để xoá client.
III. Cấu hình NAT Port cho WireGuard
Để có thể kết nối vào WireGuard VPN Server từ bên ngoài, bạn còn phải cấu hình mở port trên router mạng (nếu cài WireGuard trên server ở nhà), hoặc cấu hình tường lửa nếu cài trên máy ảo Oracle Cloud.
1. Mở port trên Router mạng ở nhà
Cấu hình hình mở port trên Router với các thông số như sau
- Protocal: UDP
- Port: 51820
- Address: IP của máy đang chạy wg-easy
2. Cấu hình tường lửa trên máy ảo Oracle Cloud
Nếu cài đặt wg-easy trên máy ảo miễn phí của Oracle, bạn cần phải mở port 51820 trên máy ảo bằng lệnh sau
sudo iptables -I INPUT 6 -m state --state NEW -p udp --dport 51820 -j ACCEPT
sudo netfilter-persistent save
Code language: YAML (yaml)
Sau đó vào tiếp mục Security Lists để mở port 51820. Tham khảo chi tiết trong bài viết dưới đây
[wg-easy] hiện tại là cách cài đặt WireGuard VPN server mình sử dụng thường xuyên nhất bởi sự tiện lợi và thân thiện của nó. Bạn có thể cài đặt wg-easy trên máy tính cài Linux hay Raspberry Pi đều được.
Nếu muốn kết hợp thêm Pi-Hole để chặn quảng cáo, bạn có thể tham khảo sử dụng Wirehole-UI, là sự kết hợp của wg-easy + Pi-Hole + Unbound
Chúc bạn cài đặt thành công!
Bài viết rất bổ ích. Mình chỉ mất tầm 10p là dựng được VPN riêng cho work from mùa dịch 🙂
Bạn cho hỏi hướng dẫn nè có dùng được dsm6.2 không vậy??
Vì mình thực hiện thông quá stack portainer nhưng báo lỗi :
$ wg-quick down wg0
$ wg-quick up wg0
Error: Command failed: wg-quick up wg0
Warning: `/etc/wireguard/wg0.conf’ is world accessible
[#] ip link add wg0 type wireguard
RTNETLINK answers: Not supported
Unable to access interface: Protocol not supported
[#] ip link delete dev wg0
Cannot find device “wg0”
Quá gà mong bác giúp đỡ
Mình không xài DSM nên không chắc nó có chạy được không nhé
Thank you.
Do dốt quá, giờ hiểu dần.
Do mình chạy nas fake chip j1900 nền tảng x86, mà wg-easy nó xây dựng trên nền tảng arm,amd64 nên ẹc
Mới làm quả raspberry đang làm theo wirehole của bác 🙂
thử trên con oracle armv8 không được bác ơi.
Mình cài trên Oracle ARM xài ngon lành, nếu không được có thể bạn làm sai gì đó hoặc chưa chỉnh lại tường lửa rồi. Xem lại bài này nhé: https://thuanbui.me/huong-dan-thiet-lap-vpn-server-mien-phi-voi-oracle-cloud-vps/
thanks bác. mình cài trên vps thường thì khá đơn giản, chạy tốt, nhưng lên ARM thì toang. đọc github thì thấy có gì đó ko ổn thật.
liệu có phải bác cài trên AMD?
Ở đây có nói về ARM trên linux https://github.com/golang/go/issues/36439
Vô trang docker của wg-easy (https://hub.docker.com/r/weejewel/wg-easy/tags) sẽ thấy nó hỗ trợ cho arm64 (armv8) nên chắc chắn là cài được.
Mình đã cài thử lên VPS Oracle AMD lẫn ARM, cả hai đều chạy bình thường. Cài trên Raspberry Pi (cũng là ARM) cũng chạy bình thường. Nên bạn cần xem lại kỹ lại hướng dẫn, có lẽ làm sai hay thiếu gì đó rồi.
Thanks bác. Để mình thử lại xem sao.
Mình mới cài thành công trên ARM của Oracle. Nguyên nhân chính là portainer thiết lập – NET_ADMIN này false, không giống với yml.
cap_add:
– NET_ADMIN
Thanks bác nhiều.
Cho minhf hỏi chút với ạ, sao mình chạy cái này cứ được 1 lúc là lại bị disconected, kênh VPN vẫn còn nhưng ko vào được mạng LAN. Liệu có phải do cái này ko có keepalive=25 ko ạ. Nếu phải thì add vào như nào ạ. Mình đã add vào docker-compose.yml nhưng lúc tạo client vẫn ko có dòng PersistentKeepalive = 25 Thanks
Nếu muốn chỉnh thông số PersistentKeepalive, bạn cần thêm dòng này vào phần environment của docker-compose.yml:
- WG_PERSISTENT_KEEPALIVE=25
. Sau đó kích hoạt lại:docker-compose up -d
. Mình đã thử và thấy file client tải về được cập nhật thông số PersistentKeepalive = 25Mình đã thêm từ đầu, phần client tải về thì có PersistentKeepalive = 25 nhưng xem peer trong wg0.conf thì không có dòng đó ấy
Theo bài viết này (https://www.wireguard.com/quickstart/) thì số persistentkeepalive chỉ cần thiết lập trên file cấu hình cho client, để client liên tục gửi packet về server để duy trì kết nối. Nên trong file wg0.conf của server sẽ không có dòng đó. Vì có thể có nhiều client khác không cần thiết lập thông số này. Nếu bạn vẫn gặp lỗi mất kết nối thì nên lên github tạo issue nhờ tác giả kiểm tra giúp nhé.
Hi anh, cho em hỏi chút
Em có đổi mật khẩu trong docker-compose.yml rồi mà khi truy cập vào webUI lại không yêu cầu mật khẩu là sao ạ?
Em đã làm lại và đăng nhập bằng pw được rồi.
Anh cho em hỏi thêm, chỉ cần cài và chạy được như anh hướng dẫn là các kết nối đã được mã hóa bảo mật từ client đến VPN server rồi phải không ạ?
Em mới tìm hiểu cái này nên gà mờ.
Thanks a~
Cài và chạy được là coi như ổn rồi bạn nhé. Kết nối được mã hóa từ client đến server.
làm sao để giới hạn tốc độ các peers trong wireguard anh, 1 server em share 7 người dùng mà mạng nhà ai cũng 150mbs nên kết nối không ổn định. Em muốn mỗi người được 30mbs thôi. Mong được anh gợi ý.
Ca này quá khó, mình chưa nghiên cứu bao giờ.
Em chào anh, em đã làm theo hướng dẫn và sử dụng bình thường. Tuy nhiên hôm nay nhà em mất điện, sau khi có điện lại, em k thể truy cập vào mạng nội bộ qua VPN từ xa được nữa, không biết anh đã gặp phải trường hợp này bao giờ chưa ạ?
Mình chưa bị bao giờ nhé. Sau mất điện, server khởi động lại và Docker tự động kích hoạt trở lại.
Cho mình hỏi bạn 1 chút ạ. Mình có làm mọi thứ xong rôi nhưng từ dải địa chỉ của ubuntu server (172.16.0.0) ping thử vào dải địa chỉ của wireguard (10.8.0.1) thì không thể ping nổi. Nhưng từ docker 10.8.0.1 thì ping ra được ngoài. Cho mình hỏi cái này là lỗi do phần định tuyến của mình hay như nào ạ. Thanks
Từ ngoài không ping vào wireguard được do routing table nó không biết định tuyến ra sao. Bạn có thể tham khảo bài này: https://thuanbui.me/thiet-lap-wireguard-client-bang-docker-tren-may-chu-linux/#4-chinh-sua-routing-table
Bạn cho mình hỏi chút với. Mình có sử dụng file docker-compose giống như của bạn sau khi run thì dùng một máy khác trong mạng telnet đến port 51821 thì thấy thành công còn telnet đến port 51820 thì bị từ chối không biết vấn đề do đâu. Mong được bạn hỗ trợ. Thanks
Bạn Telnet vào port 51820 nó báo lỗi vì Telnet nó dùng kết nối TCP, còn WireGuard hoạt động trên kết nối UDP của cổng 51820.
Mình có cài thêm nginx proxy manager thì không biết cấu hình như nào. Hiện tại khi sử dụng wgeasy.domain.exapmle để truy cập vào Web UI thì được nhưng máy client không có mạng khi kết nối VPN. Thanks
Bạn có thể dùng tên miền để truy cập vào Web UI (port 51821 TCP) thông qua thiết lập trên NPM. Và phải dùng IP hoặc 1 tên miền khác để dùng cho Wireguard (port 51820 UDP), phải cấu hình port forwarding trên router trỏ về WireGuard server trong mạng nội bộ.
chào bạn,
Cái này nếu bổ sung thêm ipv6 thì sẽ như thế nào nhỉ?
Thanks!
mình đã cài thành công lên docker, đã mở cổng, nhưng khi kết nối điện thoại với vpn thì không truy cập mạng được. có cách xử lý nào không ạ
Bạn tham khảo thử cách khắc phục ở đây: https://thuanbui.me/khac-phuc-loi-wireguard-vpn-wg-easy-khong-hoat-dong-tren-oracle-cloud-vps/
Bạn hướng dẫn chi tiết cách mở port 51820 trên router Mikrotik giúp mình được không ?
Google “mở port mikrotik” ra liền bạn nhé.
Mình đã làm theo hướng dẫn trên đây https://datech.vn/huong-dan-mo-port-tren-router-mikrotik với port 51820, UDP và địa chỉ IP Raspberry Pi chạy wg-easy nhưng vẫn không được.
Bạn xem dùm mình mở port sai chỗ nào nhưng thiết bị bên ngoài vẫn không connect vào VPN được, còn thiết bị sử dụng chung mạng thì đã connect được.
https://imgur.com/a/FysLfiB
DDNS là Address List từ Dynamic DNS.
Phần NAT port bạn làm sai rồi. Phần To Address ở Tab Action phải là địa chỉ IP nội bộ của máy đang cài wg-easy. Coi thêm ở đây: https://cnttshop.vn/blogs/chuyen-muc-ve-mikrotik/cau-hinh-nat-port-tren-mikrotik-voi-ip-wan-dong-hoac-tinh
IP đó là IP tĩnh trong mạng LAN của Raspberry Pi mình đang chạy wg-easy mà.
https://imgur.com/XotqZY0
Chào a, e setup mọi thứ oke hết, khi client (ip client 10.8.0.2) kết nối vpn call ra ngoài internet được, call getway 192.128.1.1 (setup router) được, nhưng e không thể connect ssh tới host bằng ip lan (192.168.1.253, port 22), e test trong mạng lan e ssh vẫn được. Trên server e có config ufw. có cách nào ssh khi conect vpn được không ạ
Status: active
To Action From
— —— —-
[ 1] Anywhere ALLOW IN 192.168.1.0/24
[ 2] Anywhere ALLOW IN 10.8.0.0/24
Có thể bạn cấu hình gì đó trên Server nên không kết nối được. Mình vẫn thường xuyên kết nối WireGuard về nhà và có thể SSH được mọi máy trong mạng LAN ở nhà.
Mình khuyến khích các bạn đổi port của VPN để bảo mật hơn nhé. Để đổi port tì mình phải bật 2 tùy chọn (xóa dấu #) trong
– PORT=xxxx
– WG_PORT=xxxx
ports:
– “xxxx:xxxx/udp”
– “xxxx:xxxx/tcp”