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.

So sánh phương thức mã hoá WireGuard và các phương thức khác

So sánh phương thức mã hoá WireGuard và các phương thức khác

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

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

Lỗi trong quá trình cài đặt WireGuard

Lỗi trong quá trình cài đặt WireGuard

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.

Kiểm tra kết nối WireGuard sử dụng QR code

Kiểm tra kết nối WireGuard sử dụng QR code

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