Bài viết này sẽ giải thích mọi thứ cần biết về WireGuard VPN giúp các bạn có cái nhìn tổng quan hơn. Hãy tìm hiểu thêm cùng Vietnix ngay sau đây!
WireGuard là gì?
WireGuard là một giải pháp VPN (Virtual Private Network) tập trung vào bảo mật. Nó được biết đến ban đầu bởi tính đơn giản và dễ dàng sử dụng. WireGuard sử dụng các giao thức mã hóa và các thuật toán để bảo vệ dữ liệu. Ban đầu, WireGuard được phát triển dành cho Linux. Hiện nay, nó đã phổ biến trên Windows, macOS, BSD, iOS và Android.
Mạng riêng ảo VPN là thành phần không thể thiếu đối với các doanh nghiệp. Họ có thể liên kết các chi nhánh từ xa khác nhau đến mạng chính của công ty. Từ đó cho phép nhân viên sử dụng các ứng dụng nội bộ của công ty. Đồng thời cho phép các cloud server trở thành một phần của mạng, tương tự như các máy chủ on-premises.
Hầu hết các giải pháp VPN trước đây đều tương đối chậm. Mà lại được thiết kế phức tạp quá mức. Mặt khác, WireGuard đặt tính bảo mật và sự đơn giản lên hàng đầu.
Lịch sử hình thành của WireGuard
Nhà nghiên cứu bảo mật và phát triển kernel Jason Donenfeld đã có ý tưởng cho WireGuard vào năm 2017. Khi đó, anh đang cần một giải pháp tunneling lưu lượng một cách bí mật. Từ đó có thể sử dụng chúng trong các cuộc thử nghiệm xâm nhập (penetration testing). Càng xem xét kĩ về các tùy chọn hiện có lúc bấy giờ, anh càng nhận ra rằng những hệ thống VPN như IPsec hay OpenVPN không hoạt động thật sự tốt. Bên cạnh đó nó cũng khó để cấu hình và quản lý đúng cách.
Do đó, Donenfeld bắt đầu tạo ra một giao thức VPN hoàn toàn mới. Anh muốn nó có thể tránh được lối mòn thiết kế của các hệ thống khác. Anh không muốn nó thành các dự án với những code bases khổng lồ. Donenfled cần sự đơn giản!
Ngoài ra, bạn có thể tham khảo về phần mềm VPN khác qua các bài viết sau:
Cách thức mã hóa của WireGuard
Đầu tiên, WireGuard loại trừ tính linh hoạt của mật mã. Đó là việc cung cấp các lựa chọn giữa thuật toán mã hóa, trao đổi key. Sở dĩ vì nó dẫn đến việc triển khai không an toàn với các công nghệ khác. Thay vào đó, giao thức của WireGuard sử dụng một lựa chọn các bản mã hiện đại. Do đó, các lựa chọn mật mã mặc định này đủ mạnh để người dùng không thể thay đổi hoặc cấu hình sai.
WireGuard sử dụng ChaCha20 để mã hóa đối xứng với Polu1305 cho message authentication. Sự kết hợp này hiệu quả hơn AES trên các kiến trúc CPU được nhúng mà không có khả năng tăng tốc phần cứng mật mã (cryptographic hardware acceleration); Curve25519 cho Diffie-Hellman (ECDH). Hay BLAKE2s để hashing, nhanh hơn SHA-3 và 1.5-RTT dựa trên nền tảng Noise. Ngoài ra, nó cũng bao gồm tính năng bảo vệ khỏi giả mạo, từ chối dịch vụ, và replay attack.
Trong giao thức WireGuard, mỗi peer được xác định với những peer khác thông qua các public key. Việc này tương tự với cách xác thức dựa trên khóa trong OpenSSH. Các public key cũng được sử dụng để thiết lập địa chỉ IP nào được chỉ định cho từng peer bên trong tunnel. Nó là một phần trong khái niệm mới được Wireguard gọi là “cryptokey routing”.
Giao thức này không phản hồi với các packet mà nó không nhận ra. Vì vậy quá trình network scanning sẽ không cho thấy WireGuard đang chạy trên server. Hơn nữa, nó có thể hoạt động như cả server lẫn client cùng một lúc.
Khả năng của WireGuard
Trên Linux, WireGuard hoạt động ở kernel space. Do đó, hiệu suất của nó cao hơn nhiều so với OpenVPN – trong userspace và virtual network interface driver. Điểm benchmark của WireGuard cho hiệu suất và tốc độ kết nối cao hơn OpenVPN đến 4 lần. Đồng thời, tốc độ của nó cũng cao hơn so với VPN dựa trên IPsec, trên cùng một phần cứng.
Tuy nhiên, triển khai WireGuard trên Android, iOS, macOS, OpenBSD và Windows được viết bằng Go. Ngoài một số dự án cho Android được cộng đồng hỗ trợ tích hợp WireGuard kernel module, các triển khai không thuộc Linux của WireGuard chạy trong userspace và không hưởng lợi từ hiệu suất tương tự như triển khai ở kernel. Điều này cho thấy WireGuard vẫn có thể quản lý để phù hợp. Đồng thời vẫn vượt trội hơn OpenVPN trong hầu hết mọi mặt.
WireGuard tích hợp với Linux kernel
Kể từ phiên bản 5.6 của Linux Kernel, phát hành vào ngày 29/3/2020, WireGuard đã chính thức là một trong những công nghệ được tích hợp mặc định. Đây cũng được xem là lần phát hành ổn định đầu tiên của WireGuard (phiên bản 1.0.0).
Các kế hoạch sau đó của Donenfled liên quan đến việc hợp nhất một API mã hóa mới, đơn giản hơn vào Linux kernel, gọi là Zinc. Donefled cho rằng Zinc sẽ giúp các developer thực hiện các thao tác mã hóa trong ứng dụng dễ dàng hơn. Việc này đã đánh dấu một bước ngoặt quan trọng trong quá trình upstream của WireGuard vào hệ thống Linux subsystem. Kể từ đó, đã có nhiều bước tiến nhanh chóng, đáng kể trước khi Zinc chính thức được phát hành ổn định.
Windows và một driver TUN mới
Donenfeld mong muốn cải thiện hiệu suất của WireGuard trên Windows. Do đó, anh cùng các developer đã tạo một driver TUN mã nguồn mở mới, gọi là Wintun. Giống như bản thân Zinc và WireGuard, Wintun dường như chú trọng vào tính đơn giản, khả năng kiểm tra và bảo mật.
Hướng dẫn cài đặt Wireguard VPN Server
Quá trình cài đặt Wireguard VPN Server cần trải qua 3 công đoạn
- Cài đặt Wireguard package
- Enable IP Forwarding
- Cấu hình NAT cho iptables
Không bắt buộc: Bạn có thể tắt SElinux & Firewalld (trên CentOS) để quá trình cài đặt và sử dụng dễ dàng hơn
# Tắt SElinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
setenforce 0
# Tắt Firewalld
systemctl stop firewalld
systemctl disable firewalld
Cài đặt Wireguard package
# Dành cho CentOS 7
yum install epel-release elrepo-release -y
yum install yum-plugin-elrepo -y
yum install kmod-wireguard wireguard-tools -y
# Dành cho CentOS 8
yum install elrepo-release epel-release -y
yum install kmod-wireguard wireguard-tools -y
# Dành cho Ubuntu Server
apt install wireguard -y
Load module wireguard vào kernel
modprobe wireguard
Enable ip_forward cho Kernel
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -w net.ipv4.ip_forward=1
sysctl -p
Phần cài đặt các pakage cho Wireguard VPN Server đến đây là hoàn tất, bước tiếp theo cần tạo ra các file config tương ứng cho client và server để có thể bắt đầu sử dụng
Hướng dẫn config Wireguard
Wireguard hoạt động theo mô hình public_key/private_key. Do đó ta cần:
- Tạo cặp public/private key cho Server: Private key sẽ được lưu trữ bí mật trên server, public key sẽ gửi cho client.
- Tạo cặp public/private key cho mỗi Client: Private key sẽ được giữ bởi client, public key sẽ được khai báo trên server
Tạo server keys:
cd /etc/wireguard/keys/
wg genkey | tee server_private.key | wg pubkey > server_public.key
Tạo client keys:
cd /etc/wireguard/keys/
wg genkey | tee client_private.key | wg pubkey > client_public.key
Sau khi tạo xong bộ key cần thiết, ta tiến hành tạo file config cho Wireguard VPN Server và Wireguard VPN Client. Ví dụ, ta sử dụng các thông số như sau cho mô hình VPN của mình:
- SERVER_IP: 123.123.123.123 – Địa chỉ IP public của server
- SERVER_PORT: 56789 – Port của VPN
- DEVICE: ens192 – Tên card mạng chứa địa chỉ IP public của server
- TUNNEL_ADDR_PREFIX: 10.8.0.0/24 – lớp mạng tunnel dùng để kết nối giữa VPN Client và VPN Server. Trong ví dụ, VPN Server (Gateway) mang địa chỉ IP 10.8.0.254
- ROUTES: 0.0.0.0/0 – Danh sách các lớp mạng mà client sẽ connect thông qua VPN (0.0.0.0/0 có nghĩa là đẩy tất cả traffic qua VPN)
Tạo server config:
KEYS_DIR="/etc/wireguard/keys"
cd /etc/wireguard/
# Lấy server private key & client public key đã tạo ở trước trên
server_pri_key=$(cat "${KEYS_DIR}/server_private.key")
client_pub_key=$(cat "${KEYS_DIR}/client_public.key")
# Tạo file config wg0.conf cho server
cat > /etc/wireguard/wg0.conf <<EOF
[Interface]
PrivateKey = $server_pri_key
Address = 10.8.0.254/24
SaveConfig = true
ListenPort = 56789
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o ens192 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o ens192 -j MASQUERADE
[Peer]
PublicKey = $client_pub_key
AllowedIPs = 10.8.0.2
EOF
Đến đây, đã hoàn tất tạo file config cho server tại vị trí: /etc/wireguard/wg0.conf. Khởi chạy dịch vụ Wireguard VPN Server:
wg-quick up wg0
Tạo client config:
KEYS_DIR="/etc/wireguard/keys"
cd /etc/wireguard/
# Lấy server public key & client private key đã tạo ở trước trên
server_pub_key=$(cat "${KEYS_DIR}/server_public.key")
client_pri_key=$(cat "${KEYS_DIR}/client_private.key")
# Tạo file client.conf
cat > "$KEYS_DIR/client.conf" <<EOF
[Interface]
PrivateKey = $client_pri_key
Address = 10.8.0.254/24
DNS = 1.1.1.1, 8.8.8.8
[Peer]
PublicKey = ${server_pub_key}
Endpoint = 123.123.123.123:56789
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 21
EOF
Đến đây, trên server đã tạo ra file /etc/wireguard/keys/client.conf. Để sử dụng, hãy copy file này về máy cần dùng VPN và import vào ứng dụng Wireguard trên thiết bị đó là đã có thể connect.
Toàn bộ quá trình cài đặt và cấu hình Wireguard VPN có thể tự động hóa bằng cách sử dụng Shell Script đã được Vietnix viết sẵn tại: https://github.com/VietnixHosting/wireguard-config-auto
Chúc các bạn thành công.
Cài đặt auto thì làm theo script này tiện hơn cái script auto trong bài