VPN WireGuard cài đặt và sử dụng
WireGuard là một giao thức VPN mới chạy ngay bên trong nhân Linux và sử dụng giao thức mật mã hóa hiện đại. Mặc dù hiện tại đã có nhiều giao thức VPN như là IPSEC, PPTP, OpenVPN, nhưng WireGuard từ khi mới ra đời đã nổi lên như một giao thức VPN mới, nhanh và đáng tin cậy.
Wireguard kết nối 2 thiết bị thông qua cặp 2 “KEY” gồm private key và public key. Nguyên tắc để đặt đúng private key và public key là thiết bị nào sẽ lưu thiết private key của thiết bị đó, public key ứng với private key đó sẽ lưu trên thiết bị kia và ngược lại. Giao thức Wireguard không sử dụng mô hình client server mà sử dụng thuật ngữ peer để kết nối các thiết bị, nhưng để dễ hình dung bài viết này dùng khái niệm server và client để hướng dẫn việc cài đặt.
Chuẩn bị server
Bài viết này thực hiện cài Wireguard VPN trên VPS Ubuntu 18.04, tuy nhiên nó cũng có thể làm việc ở các phiên bản Linux tương tự.
Bạn có thể đăng kí VPS tại digitalocean.com và tạo droplet với cấu hình thấp nhất để chạy Wireguard. Khi bạn đăng kí dưới liên kết của skywirex thì bạn sẽ được miễn phí 50usd sử dụng trong 30 ngày.
Ngoài ra, VPS ở www.vultr.com cũng là một sự chọn lựa tốt. Hiện tại bạn có thể đăng kí để nhận 50usd miễn phí dùng thử trong vòng 30 ngày.
Cài đặt WireGuard
- Nếu lần đầu đọc hướng dẫn ở skywirex mời bạn đọc sơ Qui ước và lưu ý
Hướng dẫn chi tiết cài đặt Wireguard cho các hệ điều hành ở trang chủ. Đối với Ubuntu, WireGuard có PPA repo (Personal Package Archive) riêng, nên chúng ta thêm vào Ubuntu sử dụng các câu lệnh sau để cài đặt phiên bản mới nhất và luôn cập nhật nó.
# add-apt-repository ppa:wireguard/wireguard
# apt-get update
# apt-get install wireguard
Trong quá trình cài đặt Wireguard có thể có xuất hiện một số thông báo lỗi như hình bên dưới nhưng nó sẽ không ảnh hưởng đến kết quả của việc cài đặt
WireGuard hoạt động như một mô-đun nhân Linux được cài đặt bằng DKMS, vì vậy mỗi khi bạn cập nhật nhân Linux thì mô-đun nhân WireGuard cũng được tự động biên dịch và sẵn sàng sử dụng. Để sử dụng mô-đun nhân ngay sau khi cài đặt, bạn phải khởi động lại hoặc chạy modprobe
để kích hoạt:
# modprobe wireguard
Có thể bạn sẽ gặp lỗi sau trong khi chạy lệnh modprobe
root@ubuntu:~# modprobe wireguard
modprobe: FATAL: Module wireguard not found in directory /lib/modules/4.15.0-74-generic
Lúc này bạn cần cài đặt Linux kernel header
cho nhân phiên bản Linux đang sử dụng bằng lệnh
# apt install linux-headers-$(uname -r)
Kiểm tra nhân Linux đã được nạp mô-đun WireGuard hay chưa, sử dụng câu lệnh sau:
# lsmod | grep wireguard
Kết quả tương tự như sau:
root@ubuntu-s-1vcpu-1gb-sgp1-01:~# lsmod | grep wireguard
wireguard 212992 0
ip6_udp_tunnel 16384 1 wireguard
udp_tunnel 16384 1 wireguard
Đến đây việc cài đặt đã sẵn sàng, ta chuẩn bị đi đến phần cấu hình chi tiết WireGuard.
Cấu hình WireGuard
Khởi tạo key
Chuyển đến thư mục wireguard, tạo public key và private key cho server và client sử dụng các câu lệnh sau
# cd /etc/wireguard
# umask 077
# wg genkey | tee server_private_key | wg pubkey > server_public_key
# wg genkey | tee client_private_key | wg pubkey > client_public_key
Lệnh umask 077
đảm bảo những file được tạo ra chỉ đọc được bởi chính bạn. Bốn file server_private_key
, server_public_key
, client_private_key
, client_public_key
được tạo ra. Bạn sử dụng lệnh nano
hoặc vi
để copy nội dung về một file txt để chuẩn bị cho file cấu hình.
Server
Ở VPS server sử dụng lệnh nano /etc/wireguard/wg0.conf
để tạo file wg0.conf
ở thư mục /etc/wireguard/
với nội dung sau đây.
[Interface]
PrivateKey = <nội dung server_private_key ở đây>
Address = 10.10.0.1/24
Address = fd86:ea04:1111::1/64
SaveConfig = true
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = <nội dung client_public_key ở đây>
AllowedIPs = 10.10.0.2/32
Đảm bảo thay thế <nội dung server_private_key ở đây>
bằng server_private_key bạn đã tạo ở trên, 10.10.0.1/24
, fd172.21:12::1/64
là những IP bạn định sử dụng (có thể không cần thay thế), và eth0
bằng broadcast network interface
của server nếu có sự khác nhau giữa thông tin server của bạn và hướng dẫn này. Bạn có thể dùng lệnh ifconfig
hoặc ip a
để kiểm tra thông tin này của server.
Client
[Interface]
PrivateKey = <nội dung client_private_key ở đây>
Address = 10.10.0.2/32
DNS = 1.1.1.1
[Peer]
PublicKey = <nội dung server_public_key ở đây>
Endpoint = <public ip của VPS server>:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 21
Đến đây bạn có thể lưu ý dòng PrivateKey
ở phía server sẽ là privatekey của server và ở phía client là privatekey của client
Kích hoạt WireGuard trên server
Kích hoạt WireGuard và chạy WireGuard khi khởi động lại server
# wg-quick up wg0
# systemctl enable [email protected]
Kết quả trông như sau:
root@ubuntu-s-1vcpu-1gb-sgp1-01:~# wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.10.0.1/24 dev wg0
[#] ip -6 address add fd86:ea04:1111::1/64 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Khi cần chỉnh sửa lại file cấu hình dùng lệnh sau để tắt WireGuard
# wg-quick down wg0
Ngoài ra để đảm bảo file cấu hình an toàn, thiết lập permissions
đúng cho nó bằng câu lệnh sau:
# chmod 600 /etc/wireguard/wg0.conf
Kiểm tra WireGuard đã hoạt động hay chưa ta dùng lệnh lệnh wg
, kết quả trông như sau:
root@ubuntu-s-1vcpu-1gb-sgp1-01:~# wg
interface: wg0
public key: hzS3K+aXcgEGFYDq/AE4FI1QbCg1s0a56azdqi7fnwY=
private key: (hidden)
listening port: 51820
peer: Yej7CzesZyqJBa3x7xEPeCaZxpuJwCdRnj02Zf7xmiQ=
allowed ips: 10.10.0.0/24
Chuyển tiếp lưu lượng (IP forwarding)
Để chuyển tiếp lưu lượng chúng ta sẽ cần khai báo với nhân Linux để NAT trong file cấu hình server hoạt động, chỉnh sửa tệp /etc/sysctl.conf
, thêm hai dòng như bên dưới và cho phép thay đổi bằng lệnh sysctl -p
:
# cat << EOF >> /etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
EOF
# sysctl -p
Kiểm tra kết nối và dùng VPN
Android
Để dùng VPN WireGuard, bạn tải ứng dụng WireGuard hoặc Tunsafe trên Google Play về điện thoại, import file cấu hình sử dụng QR code và bắt đầu kiểm tra VPN. Theo kinh nghiệm của mình nên sử dụng phần mềm Tunsafe vì ứng dụng WireGuard nhiều khi VPN không hoạt động nó vẫn báo kết nối và IP vẫn không thay đổi so với sau kết nối.
Để import file cấu hình vào điện thoại một cách nhanh chóng thì bạn vào trang tạo QR code để tạo QR code ở dạng text và lúc nhập cấu hình trên điện thoại chỉ cần quét mã QR. Rất nhanh và tiện lợi.
Windows
Sau khi kiểm tra VPN đã hoạt động tốt trên điện thoại, bạn có thể vào trang chủ WireGuard để tải client cho các hệ điều hành được hỗ trợ. Đối với Windows, tùy thuộc bạn sử dụng kiến trúc 64 bit hay 32bit mà tải bản WireGuard tương ứng. Sử dụng file cấu hình tương tự như trên Android để kết nối đến server WireGuard.
Chỉnh giờ hệ thống
Việc chỉnh giờ hệ thống giúp bạn ẩn mình tốt hơn, làm cho giờ hệ thống ở server trùng với giờ hệ thống của máy đang sử dụng, qua mặt được các trang kiểm tra về độ tàng hình. Sau khi chỉnh giờ hệ thống bạn có thể vào trang whoer để kiểm tra mức ẩn thân.
Để thực hiện việc chỉnh giờ hệ thống bạn thực hiện các bước sau:
- Kiểm tra timezone hiện tại
# timedatectl
- Cập nhật lại timezone sang
Asia/Ho_Chi_Minh
:
# timedatectl set-timezone Asia/Ho_Chi_Minh
Bạn có thể lựa chọn các timezone khác tại Database Timezones hoặc xem ở /usr/share/zoneinfo/
Slipt-Tunneling trong WireGuard
Slipt-Tunneling là tính năng cho phép sử dụng VPN nhưng vẫn có khả năng kết nối với các thiết bị hoặc máy khác trong mạng nội bộ hiện tại của máy đó. Tôi cần tính năng này ở VPN để có thể sử dụng máy in trong mạng LAN và đồng thời có thể sử dụng public IP của VPN. Hướng dẫn bên dưới cho thấy VPN sử dụng giao thức WireGuard có tính năng này.
https://www.reddit.com/r/selfhosted/comments/b5pymz/split_tunnel_in_wireguard/
https://www.flockport.com/guides/build-wireguard-networks
https://emanuelduss.ch/2018/09/wireguard-vpn-road-warrior-setup/
https://www.linuxbabe.com/debian/wireguard-vpn-server-debian