WireGuard là một giải pháp VPN (Mạng Riêng Ảo) nhẹ, hỗ trợ các kết nối IPv4 và IPv6. VPN cho phép bạn duyệt qua các mạng không tin cậy như thể bạn đang ở trong một mạng riêng tư. Nó mang lại cho bạn sự tự do truy cập Internet một cách an toàn và bảo mật từ điện thoại thông minh hay laptop khi kết nối vào các mạng không tin cậy, chẳng hạn như WiFi tại khách sạn hay quán cà phê. Bạn cũng có thể triển khai VPN để truy cập vào cơ sở hạ tầng của riêng mình, nhờ đó không cần phải mở cổng SSH hay các cổng nhạy cảm khác, tương tự như cách Tailscale hoạt động.
Cơ chế mã hóa của WireGuard dựa trên cặp khóa công khai (Public Key) và khóa bí mật (Private Key) để các peer (điểm kết nối) có thể thiết lập một đường hầm mã hóa giữa chúng. Mỗi phiên bản của WireGuard sử dụng một bộ cipher (bộ thuật toán mã hóa) cụ thể nhằm đảm bảo tính đơn giản, bảo mật và tương thích với các peer.
So sánh lại, các phần mềm VPN khác như OpenVPN và IPSec sử dụng TLS (Transport Layer Security) và chứng chỉ số để xác thực và thiết lập các đường hầm mã hóa giữa các hệ thống. Các phiên bản TLS khác nhau hỗ trợ hàng trăm bộ thuật toán mã hóa, và mặc dù điều này mang lại sự linh hoạt cho việc hỗ trợ nhiều client khác nhau, nó cũng khiến việc cấu hình một VPN sử dụng TLS trở nên tốn thời gian, phức tạp và dễ mắc lỗi.
Trong hướng dẫn này, bạn sẽ cài đặt WireGuard trên một máy chủ chạy Debian 11 và sau đó cấu hình một máy khác kết nối với máy chủ đó dưới dạng một peer, sử dụng cả kết nối IPv4 và IPv6 (được gọi chung là kết nối dual stack). Bạn cũng sẽ học cách định tuyến lưu lượng Internet của peer qua máy chủ WireGuard theo cấu hình gateway, bên cạnh việc sử dụng VPN để tạo đường hầm mã hóa trực tiếp giữa các peer.
Các liên kết tham khảo bổ sung:
Với mục đích của hướng dẫn này, chúng ta sẽ cấu hình một hệ thống Debian 11 khác làm peer (còn được gọi là client) kết nối với máy chủ WireGuard. Các hướng dẫn tiếp theo trong chuỗi bài này sẽ giải thích cách cài đặt và chạy WireGuard trên các hệ thống và thiết bị Windows, macOS, Android và iOS.
Yêu cầu tiên quyết
Để theo dõi hướng dẫn này, bạn cần:
- Một máy chủ Debian 11 với một tài khoản sudo không phải root và đã bật tường lửa. Để thiết lập máy chủ, bạn có thể tham khảo hướng dẫn Initial Server Setup with Debian 11. Trong hướng dẫn này, chúng ta sẽ gọi máy chủ đó là WireGuard Server.
- Một máy client dùng để kết nối tới WireGuard Server. Trong hướng dẫn này, máy client được gọi là WireGuard Peer. Đối với mục đích của hướng dẫn này, bạn nên dùng máy tính cá nhân của mình làm WireGuard Peer, nhưng bạn cũng có thể dùng máy chủ từ xa hoặc điện thoại di động nếu thích. Nếu sử dụng hệ thống từ xa, hãy chắc chắn theo dõi các phần tùy chọn ở dưới để tránh bị khóa truy cập.
Bước 1 — Cài đặt WireGuard và Tạo cặp Khóa
Bước đầu tiên trong hướng dẫn này là cài đặt WireGuard trên máy chủ của bạn. Để bắt đầu, hãy cập nhật chỉ mục gói của WireGuard Server và cài đặt WireGuard bằng các lệnh sau. Bạn có thể được nhắc nhập mật khẩu sudo nếu đây là lần đầu sử dụng sudo trong phiên làm việc hiện tại:
sudo apt update sudo apt install wireguard
Giờ đây, sau khi đã cài đặt WireGuard, bước tiếp theo là tạo cặp khóa riêng (Private Key) và khóa công khai (Public Key) cho máy chủ. Bạn sẽ sử dụng các lệnh tích hợp sẵn wg genkey
và wg pubkey
để tạo khóa, sau đó thêm khóa riêng vào file cấu hình của WireGuard.
Bạn cũng cần thay đổi quyền truy cập cho file khóa vừa tạo bằng lệnh chmod
, vì mặc định file này có thể đọc được bởi bất kỳ người dùng nào trên máy chủ của bạn.
Tạo khóa riêng cho WireGuard và thay đổi quyền truy cập bằng các lệnh sau:
wg genkey | sudo tee /etc/wireguard/private.key sudo chmod go= /etc/wireguard/private.key
Lệnh sudo chmod go= /etc/wireguard/private.key
sẽ xóa bỏ quyền truy cập đối với file đối với các người dùng và nhóm khác ngoài root, đảm bảo chỉ root mới có thể truy cập được khóa riêng.
Bạn sẽ nhận được một dòng đầu ra mã hóa base64, đó chính là Private Key. Một bản sao của đầu ra cũng được lưu tại file /etc/wireguard/private.key
để sử dụng sau này (do lệnh tee). Hãy ghi nhớ khóa riêng này vì bạn sẽ cần thêm nó vào file cấu hình WireGuard ở phần sau.
Bước tiếp theo là tạo khóa công khai tương ứng, được sinh ra từ khóa riêng. Sử dụng lệnh sau để tạo file chứa khóa công khai:
sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
Lệnh trên gồm ba lệnh được nối với nhau bằng toán tử |
(pipe):
sudo cat /etc/wireguard/private.key
: đọc file khóa riêng và xuất ra chuẩn đầu ra.wg pubkey
: nhận đầu ra từ lệnh trước và xử lý để tạo ra khóa công khai.sudo tee /etc/wireguard/public.key
: lấy đầu ra của lệnh tạo khóa công khai và chuyển hướng vào file/etc/wireguard/public.key
.
Khi chạy lệnh, bạn sẽ nhận được một dòng đầu ra mã hóa base64, đó là Public Key của WireGuard Server. Hãy lưu lại vì bạn sẽ cần phân phối khóa công khai này cho bất kỳ peer nào kết nối tới máy chủ.
Bước 2 — Lựa chọn Địa chỉ IPv4 và IPv6
Trong phần trước, bạn đã cài đặt WireGuard và tạo cặp khóa dùng để mã hóa lưu lượng đến và đi từ máy chủ. Trong phần này, bạn sẽ tạo file cấu hình cho máy chủ và thiết lập WireGuard tự động khởi động khi máy chủ reboots. Bạn cũng sẽ định nghĩa các địa chỉ IPv4 và IPv6 riêng tư sử dụng cho WireGuard Server và các peer.
Nếu bạn dự định sử dụng cả địa chỉ IPv4 và IPv6, hãy theo dõi cả hai phần dưới đây. Nếu không, hãy làm theo hướng dẫn tương ứng với nhu cầu mạng của VPN.
Bước 2(a) — Lựa chọn Phạm vi Địa chỉ IPv4
Nếu bạn sử dụng máy chủ WireGuard với các peer sử dụng IPv4, máy chủ cần một phạm vi địa chỉ IPv4 riêng tư để sử dụng cho client và cho giao diện đường hầm. Bạn có thể chọn bất kỳ phạm vi địa chỉ nào từ các khối địa chỉ dành riêng sau (nếu bạn muốn tìm hiểu thêm về cách phân bổ các khối này, hãy xem RFC 1918):
- 10.0.0.0 đến 10.255.255.255 (prefix 10/8)
- 172.16.0.0 đến 172.31.255.255 (prefix 172.16/12)
- 192.168.0.0 đến 192.168.255.255 (prefix 192.168/16)
Trong hướng dẫn này, chúng ta sẽ sử dụng phạm vi 10.8.0.0/24 từ khối IP riêng đầu tiên. Phạm vi này cho phép tối đa 255 kết nối peer và thông thường không bị trùng lặp với các phạm vi IP riêng khác.
Máy chủ WireGuard sẽ sử dụng một địa chỉ IP từ phạm vi này làm địa chỉ tunnel IPv4 riêng. Chúng ta sẽ dùng 10.8.0.1/24 tại đây, nhưng bạn có thể chọn bất kỳ địa chỉ nào từ 10.8.0.1 đến 10.8.0.255. Ghi nhớ địa chỉ bạn chọn nếu bạn dùng địa chỉ khác với 10.8.0.1/24; bạn sẽ cần thêm địa chỉ IPv4 này vào file cấu hình ở Bước 3.
Bước 2(b) — Lựa chọn Phạm vi Địa chỉ IPv6
Nếu bạn sử dụng WireGuard với IPv6, bạn cần tạo một tiền tố địa chỉ IPv6 unicast cục bộ độc nhất dựa trên thuật toán trong RFC 4193. Các địa chỉ dùng với WireGuard Server sẽ được gán cho giao diện đường hầm ảo. Bạn sẽ cần thực hiện vài bước để tạo một tiền tố IPv6 ngẫu nhiên, độc nhất trong khối địa chỉ IPv6 riêng tư fd00::/8
.
Theo RFC, cách khuyến nghị để có được một tiền tố IPv6 độc nhất là kết hợp thời gian hiện tại với một giá trị nhận dạng duy nhất của hệ thống (như số serial hay device ID). Những giá trị này sau đó được băm và cắt ngắn để tạo ra một dãy bit dùng làm địa chỉ độc nhất trong khối fd00::/8
.
Để bắt đầu tạo phạm vi IPv6 cho WireGuard Server, hãy lấy một timestamp 64-bit bằng tiện ích date
với lệnh sau:
date +%s%N
Bạn sẽ nhận được một số như sau, gồm số giây (%s
của lệnh date) và số nano giây (%N
) kể từ 1970-01-01 00:00:00 UTC, được kết hợp lại:
1650301699497770167
Ghi nhớ giá trị timestamp này để sử dụng sau.
Tiếp theo, lấy giá trị machine-id
của máy chủ từ file /var/lib/dbus/machine-id
. Đây là định danh duy nhất của hệ thống và không thay đổi trong suốt thời gian tồn tại của máy chủ:
cat /var/lib/dbus/machine-id
Bạn sẽ nhận được đầu ra như sau:
/var/lib/dbus/machine-id
610cef4946ed46da8f71dba9d66c67fb
Bây giờ, bạn cần kết hợp timestamp
với machine-id
và băm giá trị đó bằng thuật toán SHA-1. Lệnh sẽ có định dạng:
printf <timestamp><machine-id> | sha1sum
Chạy lệnh với timestamp
và machine-id
của bạn, ví dụ:
printf 1650301699497770167610cef4946ed46da8f71dba9d66c67fb | sha1sum
Bạn sẽ nhận được một giá trị băm như sau:
Output
442adea1488d96388dae9ab816045b24609a6c18 -
Lưu ý rằng đầu ra của lệnh sha1sum
ở dạng hệ thập lục phân, với mỗi byte được biểu diễn bởi 2 ký tự (ví dụ: “4f” và “26” là hai byte đầu tiên).
Theo RFC, chỉ cần lấy 40 bit (5 byte) có ý nghĩa thấp nhất (cuối cùng) của đầu ra băm. Sử dụng lệnh cut
để in ra 5 byte cuối cùng (dưới dạng mã hóa thập lục phân):
printf 442adea1488d96388dae9ab816045b24609a6c18 | cut -c 31-
Lệnh -c 31-
yêu cầu lệnh cut
chọn tất cả các ký tự từ vị trí thứ 31 đến hết dòng. Bạn sẽ nhận được đầu ra như sau:
24609a6c18
Trong đầu ra này, các byte là: 24 60 9a 6c 18.
Giờ bạn có thể tạo tiền tố địa chỉ IPv6 độc nhất bằng cách ghép các byte vừa tạo vào tiền tố fd, ngăn cách mỗi 2 byte bằng dấu :
, để tăng tính đọc được. Vì mỗi subnet trong tiền tố độc nhất này có thể chứa tới 18,446,744,073,709,551,616 địa chỉ IPv6, bạn có thể giới hạn subnet với kích thước chuẩn /64 cho đơn giản.
Với các byte đã tạo và kích thước subnet /64, tiền tố địa chỉ IPv6 sẽ là:
Unique Local IPv6 Address Prefix
Tiền tố Địa chỉ IPv6 Cục bộ Độc nhất:
Unique Local IPv6 Address Prefix
fd24:609a:6c18::/64
Phạm vi fd24:609a:6c18::/64 này sẽ được sử dụng để gán địa chỉ IP cho các giao diện tunnel của WireGuard trên máy chủ và các peer. Để cấp một địa chỉ cho máy chủ, thêm số 1 sau dấu ::
. Địa chỉ sẽ thành:
fd24:609a:6c18::1/64
Các peer có thể sử dụng bất kỳ địa chỉ nào trong phạm vi này, thường thì bạn sẽ tăng dần giá trị (ví dụ: fd24:609a:6c18::2/64 cho peer đầu tiên, v.v.). Ghi nhớ địa chỉ này để cấu hình WireGuard Server ở bước tiếp theo.
Bước 3 — Tạo File Cấu Hình cho WireGuard Server
Trước khi tạo file cấu hình cho WireGuard Server, bạn cần chuẩn bị các thông tin sau:
- Chắc chắn rằng bạn đã có Private Key từ Bước 1 (Cài đặt WireGuard và Tạo cặp Khóa).
- Nếu sử dụng WireGuard với IPv4, bạn cần địa chỉ IP mà bạn đã chọn cho máy chủ ở Bước 2(a) – trong ví dụ này là 10.8.0.1/24.
- Nếu sử dụng WireGuard với IPv6, bạn cần địa chỉ IP mà bạn tạo ở Bước 2(b) – trong ví dụ này là fd24:609a:6c18::1/64.
Sau khi đã có khóa riêng và địa chỉ IP cần thiết, tạo file cấu hình mới sử dụng nano (hoặc trình chỉnh sửa yêu thích) bằng lệnh:
sudo nano /etc/wireguard/wg0.conf
Thêm các dòng sau vào file, thay thế base64_encoded_private_key_goes_here bằng khóa riêng của bạn và thay đổi địa chỉ IP trên dòng Address
nếu cần. Bạn cũng có thể thay đổi dòng ListenPort
nếu muốn WireGuard lắng nghe trên cổng khác:
/etc/wireguard/wg0.conf
[Interface] PrivateKey = base64_encoded_private_key_goes_here Address = 10.8.0.1/24, fd24:609a:6c18::1/64 ListenPort = 51820 SaveConfig = true
Dòng SaveConfig = true
đảm bảo rằng khi giao diện WireGuard được tắt, mọi thay đổi sẽ được lưu vào file cấu hình.
Lưu và đóng file /etc/wireguard/wg0.conf
. Nếu dùng nano, nhấn CTRL+X
, sau đó nhấn Y
và ENTER
để xác nhận. Giờ bạn đã có một cấu hình ban đầu cho máy chủ mà bạn có thể mở rộng tùy theo cách bạn sử dụng VPN WireGuard.
Bước 4 — Điều Chỉnh Cấu Hình Mạng của WireGuard Server
Nếu bạn sử dụng WireGuard chỉ để kết nối một peer tới máy chủ nhằm truy cập các dịch vụ trên máy chủ, bạn không cần thực hiện phần này. Nếu bạn muốn định tuyến lưu lượng Internet của WireGuard Peer qua máy chủ, bạn cần cấu hình IP forwarding theo hướng dẫn dưới đây.
Để cấu hình chuyển tiếp, mở file /etc/sysctl.conf
trên WireGuard Server bằng nano (hoặc trình chỉnh sửa bạn thích):
sudo nano /etc/sysctl.conf
Nếu bạn sử dụng IPv4 với WireGuard, thêm dòng sau vào cuối file:
/etc/sysctl.conf
net.ipv4.ip_forward=1
Nếu bạn sử dụng IPv6 với WireGuard, thêm dòng sau vào cuối file:
/etc/sysctl.conf
net.ipv6.conf.all.forwarding=1
Nếu sử dụng cả IPv4 và IPv6, hãy đảm bảo thêm cả hai dòng. Lưu và đóng file sau khi chỉnh sửa.
Để nạp các giá trị mới cho phiên làm việc hiện tại, chạy:
sudo sysctl -p
Ví dụ đầu ra:
net.ipv6.conf.all.forwarding = 1 net.ipv4.ip_forward = 1
Giờ WireGuard Server của bạn đã có khả năng chuyển tiếp lưu lượng từ giao diện ảo của VPN đến các phần khác của máy chủ và ra Internet công cộng. Cấu hình này cho phép bạn định tuyến tất cả lưu lượng web từ WireGuard Peer qua địa chỉ IP của máy chủ, và địa chỉ IP công cộng của client sẽ được ẩn đi.
Tuy nhiên, trước khi lưu lượng được định tuyến qua máy chủ một cách chính xác, bạn cần cấu hình một số quy tắc firewall. Các quy tắc này đảm bảo lưu lượng từ và tới WireGuard Server và các peer được chuyển tiếp đúng cách.
Bước 5 — Cấu Hình Tường Lửa cho WireGuard Server
Trong phần này, bạn sẽ chỉnh sửa cấu hình của WireGuard Server để thêm các quy tắc tường lửa nhằm đảm bảo lưu lượng từ và tới máy chủ và các client được định tuyến đúng. Nếu bạn chỉ sử dụng VPN để kết nối máy chủ với máy chủ (machine-to-machine) nhằm truy cập tài nguyên được hạn chế, bạn có thể bỏ qua phần này.
Để cho phép lưu lượng VPN của WireGuard qua tường lửa của máy chủ, bạn cần bật masquerading – một khái niệm của iptables cho phép thực hiện dịch địa chỉ mạng (NAT) động theo thời gian thực để định tuyến kết nối client một cách chính xác.
Đầu tiên, hãy tìm giao diện mạng công cộng của WireGuard Server bằng lệnh con ip route
:
ip route list default
Giao diện công cộng là chuỗi ký tự nằm sau từ “dev” trong đầu ra của lệnh trên. Ví dụ, nếu đầu ra hiển thị như sau với giao diện tên eth0:
default via 203.0.113.1 dev eth0 proto static
Hãy ghi nhớ tên giao diện này vì bạn sẽ dùng nó trong các quy tắc iptables
ở bước tiếp theo.
Để thêm quy tắc tường lửa vào WireGuard Server, mở lại file /etc/wireguard/wg0.conf
bằng nano (hoặc trình chỉnh sửa khác):
sudo nano /etc/wireguard/wg0.conf
Ở cuối file, sau dòng SaveConfig = true
, dán các dòng sau:
/etc/wireguard/wg0.conf . . . PostUp = ufw route allow in on wg0 out on eth0 PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE PostUp = ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE PreDown = ufw route delete allow in on wg0 out on eth0 PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE PreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
Các dòng PostUp sẽ chạy khi WireGuard Server khởi động đường hầm VPN ảo. Trong ví dụ này, nó sẽ thêm ba quy tắc cho ufw và iptables:
ufw route allow in on wg0 out on eth0
– quy tắc cho phép chuyển tiếp lưu lượng IPv4 và IPv6 từ giao diện VPNwg0
sang giao diện công cộngeth0
. Quy tắc này làm việc cùng với các giá trị sysctlnet.ipv4.ip_forward
vànet.ipv6.conf.all.forwarding
đã được cấu hình ở phần trước.iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
– quy tắc này cấu hình masquerading, chuyển đổi lưu lượng IPv4 từwg0
sao cho có vẻ như nó xuất phát trực tiếp từ địa chỉ IP công cộng của WireGuard Server.ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
– quy tắc tương tự cho lưu lượng IPv6.
Các dòng PreDown chạy khi WireGuard Server tắt đường hầm VPN, loại bỏ các quy tắc chuyển tiếp và masquerading đã được thiết lập.
Tùy chỉnh file này sao cho phù hợp với VPN của bạn; nếu chỉ sử dụng IPv4, bạn có thể loại bỏ các dòng có lệnh ip6tables
, và ngược lại.
Phần cuối của cấu hình tường lửa cho WireGuard Server là cho phép lưu lượng đến và đi của cổng UDP mà WireGuard sử dụng. Nếu bạn không thay đổi cổng trong file /etc/wireguard/wg0.conf
, cổng mặc định sẽ là 51820. Nếu bạn thay đổi, hãy thay thế tương ứng trong lệnh UFW dưới đây.
Trong trường hợp bạn quên mở cổng SSH khi làm theo hướng dẫn yêu cầu, hãy thêm nó vào đây:
sudo ufw allow 51820/udp sudo ufw allow OpenSSH
Lưu ý: Nếu bạn sử dụng tường lửa khác hoặc đã tùy chỉnh cấu hình UFW, bạn có thể cần thêm các quy tắc bổ sung. Ví dụ, nếu bạn quyết định định tuyến toàn bộ lưu lượng qua kết nối VPN, hãy đảm bảo cổng 53 (DNS), 80 (HTTP) và 443 (HTTPS) được mở. Nếu có các giao thức khác, bạn cũng cần thêm quy tắc cho chúng.
Sau khi thêm các quy tắc, hãy tắt và bật lại UFW để nạp lại thay đổi:
sudo ufw disable sudo ufw enable
Bạn có thể kiểm tra lại các quy tắc đã được áp dụng bằng lệnh:
sudo ufw status
Output:
Status: active To Action From -- ------ ---- 51280/udp ALLOW Anywhere 22/tcp ALLOW Anywhere 51280/udp (v6) ALLOW Anywhere (v6) 22/tcp (v6) ALLOW Anywhere (v6)
Giờ WireGuard Server đã được cấu hình để xử lý đúng lưu lượng VPN, bao gồm chuyển tiếp và masquerading cho các peer. Sau khi quy tắc tường lửa đã được thiết lập, bạn có thể khởi động dịch vụ WireGuard để lắng nghe các kết nối từ peer.
Bước 6 — Khởi Động WireGuard Server
WireGuard có thể được cấu hình chạy dưới dạng dịch vụ systemd thông qua script wg-quick
tích hợp. Mặc dù bạn có thể sử dụng lệnh wg
để tạo đường hầm mỗi khi cần dùng VPN, nhưng cách này thủ công và dễ mắc lỗi. Thay vào đó, bạn có thể sử dụng systemctl
để quản lý đường hầm qua wg-quick
.
Việc sử dụng dịch vụ systemd cho phép cấu hình WireGuard tự động khởi động khi máy chủ bật, đảm bảo bạn luôn có thể kết nối VPN khi máy chủ đang chạy. Để làm điều này, kích hoạt dịch vụ wg-quick
cho tunnel wg0
bằng lệnh:
sudo systemctl enable wg-quick@wg0.service
Lưu ý rằng lệnh trên chỉ định tên tunnel là wg0
, ánh xạ tới file cấu hình /etc/wireguard/wg0.conf
.
Cách đặt tên này cho phép bạn tạo nhiều đường hầm VPN riêng biệt trên máy chủ. Ví dụ, bạn có thể có một tunnel với tên prod
và file cấu hình tương ứng là /etc/wireguard/prod.conf
. Mỗi cấu hình tunnel có thể chứa các thiết lập IPv4, IPv6 và firewall khác nhau cho từng kết nối peer.
Giờ khởi động dịch vụ:
sudo systemctl start wg-quick@wg0.service
Kiểm tra lại trạng thái của dịch vụ WireGuard bằng lệnh:
sudo systemctl status wg-quick@wg0.service
Output:
● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0 Loaded: loaded (/lib/systemd/system/wg-quick@.service; enabled; vendor preset: enabled) Active: active (exited) since Mon 2022-04-18 17:22:13 UTC; 2s ago Docs: man:wg-quick(8) man:wg(8) https://www.wireguard.com/ https://www.wireguard.com/quickstart/ https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8 https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8 Process: 98834 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS) Main PID: 98834 (code=exited, status=0/SUCCESS) CPU: 193ms Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] wg setconf wg0 /dev/fd/63 Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip -4 address add 10.8.0.1/24 dev wg0 Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip -6 address add fd24:609a:6c18::1/64 dev wg0 Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip link set mtu 1420 up dev wg0 Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ufw route allow in on wg0 out on ens3 Apr 18 17:22:13 thats-my-jam wg-quick[98890]: Rule added Apr 18 17:22:13 thats-my-jam wg-quick[98890]: Rule added (v6) Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] iptables -t nat -I POSTROUTING -o ens3 -j MASQUERADE Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip6tables -t nat -I POSTROUTING -o ens3 -j MASQUERADE Apr 18 17:22:13 thats-my-jam systemd[1]: Finished WireGuard via wg-quick(8) for wg0.
Các dòng đầu ra trên hiển thị các lệnh ip
được sử dụng để tạo giao diện ảo wg0
và gán địa chỉ IPv4, IPv6 từ file cấu hình. Bạn có thể sử dụng các quy tắc này để kiểm tra và xử lý sự cố đường hầm hoặc sử dụng lệnh wg
để cấu hình VPN thủ công.
Với máy chủ đã được cấu hình và chạy, bước tiếp theo là cấu hình máy client làm WireGuard Peer và kết nối với WireGuard Server.
Bước 7 — Cấu Hình WireGuard Peer
Cấu hình một WireGuard Peer tương tự như cấu hình máy chủ. Sau khi cài đặt phần mềm client, bạn sẽ tạo cặp khóa công khai và khóa riêng, quyết định địa chỉ IP cho peer, tạo file cấu hình cho peer và sau đó khởi động đường hầm bằng script wg-quick
.
Bạn có thể thêm bao nhiêu peer tùy thích cho VPN của mình bằng cách tạo cặp khóa và cấu hình theo các bước dưới đây. Nếu thêm nhiều peer, hãy theo dõi các địa chỉ IP riêng của chúng để tránh trùng lặp.
Để cấu hình WireGuard Peer, đảm bảo rằng bạn đã cài đặt gói WireGuard bằng các lệnh apt sau trên máy peer:
sudo apt update sudo apt install wireguard
Tạo Cặp Khóa cho WireGuard Peer
Tiếp theo, tạo cặp khóa trên peer giống như bạn đã làm trên máy chủ. Trên máy local hoặc máy chủ từ xa làm peer, tạo khóa riêng với các lệnh sau:
wg genkey | sudo tee /etc/wireguard/private.key sudo chmod go= /etc/wireguard/private.key
Bạn sẽ nhận được một dòng đầu ra mã hóa base64, đó là Private Key. Bản sao đầu ra cũng được lưu tại /etc/wireguard/private.key
. Hãy ghi nhớ khóa riêng này vì bạn sẽ cần thêm nó vào file cấu hình của peer sau này.
Sau đó, sử dụng lệnh sau để tạo file chứa Public Key:
sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
Bạn sẽ nhận được một dòng đầu ra mã hóa base64, đó là Public Key của WireGuard Peer. Ghi lại giá trị này vì bạn sẽ cần gửi nó cho WireGuard Server để thiết lập kết nối mã hóa.
Tạo File Cấu Hình cho WireGuard Peer
Sau khi đã có cặp khóa, bạn cần tạo file cấu hình cho peer chứa tất cả thông tin cần thiết để kết nối với WireGuard Server.
Bạn sẽ cần:
- Private Key (khóa riêng) được mã hóa base64 mà bạn tạo trên peer.
- Các phạm vi địa chỉ IPv4 và IPv6 mà bạn đã định nghĩa trên WireGuard Server.
- Public Key của WireGuard Server (mã hóa base64).
- Địa chỉ IP công cộng và số cổng của WireGuard Server. Thông thường, đây là địa chỉ IPv4, nhưng nếu máy chủ có địa chỉ IPv6 và client có kết nối IPv6, bạn có thể sử dụng IPv6.
Với các thông tin này, mở file mới /etc/wireguard/wg0.conf
trên máy WireGuard Peer bằng nano (hoặc trình soạn thảo bạn ưa thích):
sudo nano /etc/wireguard/wg0.conf
Thêm các dòng sau vào file, thay thế các phần được đánh dấu bằng thông tin thích hợp:
/etc/wireguard/wg0.conf
[Interface] PrivateKey = base64_encoded_peer_private_key_goes_here Address = 10.8.0.**2**/24 Address = fd24:609a:6c18::**2**/64 [Peer] PublicKey = U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE= AllowedIPs = 10.8.0.0/24, fd24:609a:6c18::/64 Endpoint = 203.0.113.1:51820
Chú ý:
- Dòng
Address
đầu tiên sử dụng địa chỉ IPv4 từ subnet 10.8.0.0/24 mà bạn đã chọn trước đó. Địa chỉ này có thể là bất kỳ địa chỉ nào trong subnet miễn là khác với địa chỉ của máy chủ. Thông thường, tăng dần số thứ tự cho mỗi peer. - Dòng
Address
thứ hai sử dụng địa chỉ IPv6 từ subnet đã tạo, thường là tăng dần từ địa chỉ của máy chủ (ví dụ: từ fd24:609a:6c18::1 đến fd24:609a:6c18::2). - Dòng
AllowedIPs
chỉ định các phạm vi IPv4 và IPv6 mà peer chỉ gửi lưu lượng qua VPN nếu đích đến nằm trong phạm vi đó. Bạn có thể giới hạn VPN của peer chỉ kết nối với các peer và dịch vụ trong VPN, hoặc cấu hình để định tuyến toàn bộ lưu lượng qua WireGuard Server (ví dụ: dùng 0.0.0.0/0 và ::/0).
Nếu chỉ sử dụng IPv4, bạn bỏ qua phạm vi IPv6 và ngược lại.
(Tùy chọn) Cấu hình Peer để Định tuyến Toàn bộ Lưu lượng Qua Đường Hầm
Nếu bạn chọn định tuyến toàn bộ lưu lượng của peer qua đường hầm (sử dụng 0.0.0.0/0 và ::/0) và peer là hệ thống từ xa, bạn cần hoàn tất các bước sau. Nếu peer là hệ thống cục bộ, bạn có thể bỏ qua phần này.
Đối với peer từ xa truy cập qua SSH hoặc giao thức khác dùng IP công cộng, bạn cần thêm một số quy tắc bổ sung vào file wg0.conf
của peer. Các quy tắc này đảm bảo rằng bạn vẫn có thể kết nối với hệ thống peer từ bên ngoài đường hầm khi VPN được thiết lập. Nếu không, khi đường hầm được mở, toàn bộ lưu lượng xử lý qua giao diện công cộng sẽ không được định tuyến đúng qua giao diện wg0
, dẫn đến hệ thống từ xa không thể truy cập.
Đầu tiên, xác định địa chỉ IP mặc định của gateway mà peer sử dụng bằng lệnh:
ip route list table main default
Output:
ip route list table main default
Ghi nhớ địa chỉ gateway 203.0.113.1 và tên giao diện eth0 (có thể khác trên hệ thống của bạn)
Tiếp theo, xác định địa chỉ IP công cộng của peer bằng cách dùng lệnh:
ip -brief address show eth0
Output:
eth0 UP 203.0.113.5/20 10.20.30.40/16 2604:a880:400:d1::3d3:6001/64 fe80::68d5:beff:feff:974c/64
Trong đầu ra, địa chỉ 203.0.113.5 (không kèm /20) là địa chỉ công cộng của giao diện eth0 mà bạn sẽ cần thêm vào file cấu hình của peer.
Mở lại file /etc/wireguard/wg0.conf
trên peer:
sudo nano /etc/wireguar
Trước phần [Peer]
, thêm 4 dòng sau:
PostUp = ip rule add table 200 from 203.0.113.5 PostUp = ip route add table 200 default via 203.0.113.1 PreDown = ip rule delete table 200 from 203.0.113.5 PreDown = ip route delete table 200 default via 203.0.113.1 [Peer] . . .
Các dòng này tạo quy tắc định tuyến tùy chỉnh để đảm bảo lưu lượng công cộng đến peer sử dụng gateway mặc định.
PostUp = ip rule add table 200 from 203.0.113.5
tạo quy tắc kiểm tra các mục trong bảng định tuyến số 200 khi IP trùng với địa chỉ công cộng của peer.PostUp = ip route add table 200 default via 203.0.113.1
đảm bảo rằng mọi lưu lượng qua bảng 200 đều được định tuyến qua gateway 203.0.113.1.- Các dòng
PreDown
sẽ xóa các quy tắc này khi đường hầm bị tắt.
Lưu ý: Số bảng 200 là tùy ý; bạn có thể sử dụng số từ 2 đến 252, hoặc đặt tên riêng bằng cách thêm nhãn vào file /etc/iproute2/rt_tables
.
Để tìm hiểu thêm về bảng định tuyến trong Linux, hãy tham khảo Routing Tables – Guide to IP Layer Network Administration.
Nếu bạn định tuyến toàn bộ lưu lượng của peer qua VPN, hãy đảm bảo rằng các thiết lập sysctl và iptables trên WireGuard Server (Bước 4 và Bước 5) đã được cấu hình đúng.
(Tùy chọn) Cấu hình Máy khách WireGuard với Các DNS Resolver
Nếu bạn sử dụng WireGuard Server làm gateway VPN cho toàn bộ lưu lượng của peer, bạn cần thêm một dòng vào phần [Interface]
trong file cấu hình của peer để chỉ định các DNS resolver. Nếu không thêm, các yêu cầu DNS có thể không được bảo mật bởi VPN và có thể bị tiết lộ cho nhà cung cấp dịch vụ Internet (ISP) hoặc bên thứ ba.
Nếu bạn chỉ dùng WireGuard để truy cập tài nguyên trên mạng VPN hay cấu hình theo kiểu peer-to-peer, bạn có thể bỏ qua phần này.
Để thêm DNS resolver, trước tiên hãy xác định DNS server mà WireGuard Server sử dụng. Trên WireGuard Server, chạy lệnh sau (thay thế eth0
nếu giao diện của bạn khác):
resolvectl dns eth0
Output:
Link 2 (eth0): 67.207.67.2 67.207.67.3 2001:4860:4860::8844 2001:4860:4860::8888
Các địa chỉ IP xuất ra là DNS resolver mà máy chủ đang sử dụng. Ghi nhớ các địa chỉ bạn muốn sử dụng (bạn có thể chọn dùng IPv4, IPv6 hoặc cả hai).
Trên WireGuard Peer, mở lại file /etc/wireguard/wg0.conf
:
sudo nano /etc/wireguard/wg0.conf
Trước phần [Peer]
, thêm dòng:
DNS = 67.207.67.2 2001:4860:4860::8844
Sau đó file sẽ có dạng:
DNS = 67.207.67.2 2001:4860:4860::8844 [Peer] . . .
Bạn có thể điều chỉnh danh sách DNS theo nhu cầu IPv4/IPv6 của bạn.
Khi kết nối VPN thành công, bạn có thể kiểm tra việc gửi yêu cầu DNS qua VPN bằng cách truy cập các trang như dnsleaktest.com hoặc sử dụng lệnh resolvectl dns
trên peer để kiểm tra.
Bước 8 — Thêm Public Key của Peer Vào WireGuard Server
Trước khi kết nối peer với máy chủ, rất quan trọng phải thêm Public Key của peer vào WireGuard Server. Bước này đảm bảo rằng bạn có thể kết nối và định tuyến lưu lượng qua VPN. Nếu bỏ qua, WireGuard Server sẽ không cho phép peer gửi hay nhận lưu lượng qua đường hầm.
Trên WireGuard Peer, hãy chạy:
sudo cat /etc/wireguard/public.key
Output:
PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
Sau đó, đăng nhập vào WireGuard Server và chạy lệnh sau (thay thế Public Key của peer và địa chỉ IP thích hợp):
sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,fd24:609a:6c18::2
Lưu ý rằng phần allowed-ips
của lệnh nhận danh sách địa chỉ IPv4 và IPv6, phân cách bởi dấu phẩy. Bạn có thể chỉ định một địa chỉ cụ thể hoặc một phạm vi. Không được để hai peer có cùng thiết lập allowed-ips
.
Nếu bạn muốn cập nhật allowed-ips
cho một peer đã có, chạy lại lệnh với các địa chỉ mới. Ví dụ, để thêm một địa chỉ như 10.8.0.100 cho peer đã có (đã có 10.8.0.2 và fd24:609a:6c18::2):
sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,10.8.0.100,fd24:609a:6c18::2
Sau khi thêm peer, kiểm tra trạng thái đường hầm trên máy chủ bằng lệnh:
sudo wg
Output:
interface: wg0 public key: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE= private key: (hidden) listening port: 51820 peer: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed ips: 10.8.0.2/32, fd24:609a:6c18::/128
Lưu ý dòng chứa Public Key của peer và các địa chỉ IP (hoặc phạm vi) mà peer được phép sử dụng.
Bây giờ, với các tham số kết nối của peer đã được định nghĩa trên máy chủ, bước tiếp theo là khởi động đường hầm trên peer.
Bước 9 — Kết Nối WireGuard Peer với Đường Hầm
Khi máy chủ và peer đã được cấu hình hỗ trợ lưu lượng IPv4, IPv6, chuyển tiếp gói tin và cấu hình DNS, đã đến lúc kết nối peer với đường hầm VPN.
Nếu bạn chỉ cần VPN cho một số trường hợp sử dụng nhất định, hãy sử dụng lệnh wg-quick
để thiết lập kết nối thủ công. Nếu bạn muốn tự động khởi động đường hầm như trên máy chủ, hãy làm theo các bước ở Bước 6.
Trong trường hợp bạn định tuyến toàn bộ lưu lượng qua VPN và đã cấu hình chuyển tiếp DNS, bạn cần cài đặt tiện ích resolvconf
trên WireGuard Peer trước khi khởi động đường hầm. Chạy lệnh sau:
sudo apt install resolvconf
Để khởi động đường hầm, chạy lệnh sau trên WireGuard Peer:
sudo wg-quick up wg0
Bạn sẽ nhận được output như sau:
[#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 10.8.0.2/24 dev wg0 [#] ip -6 address add fd24:609a:6c18::2/64 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] resolvconf -a tun.wg0 -m 0 -x
Chú ý các địa chỉ IPv4 và IPv6 mà bạn đã gán cho peer.
Nếu bạn thiết lập AllowedIPs
của peer là 0.0.0.0/0
và ::/0
(hoặc dùng các phạm vi khác), đầu ra sẽ như sau:
[#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 10.8.0.2/24 dev wg0 [#] ip -6 address add fd24:609a:6c18::2/64 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] resolvconf -a tun.wg0 -m 0 -x [#] wg set wg0 fwmark 51820 [#] ip -6 route add ::/0 dev wg0 table 51820 [#] ip -6 rule add not fwmark 51820 table 51820 [#] ip -6 rule add table main suppress_prefixlength 0 [#] ip6tables-restore -n [#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820 [#] ip -4 rule add not fwmark 51820 table 51820 [#] ip -4 rule add table main suppress_prefixlength 0 [#] sysctl -q net.ipv4.conf.all.src_valid_mark=1 [#] iptables-restore -n
Trong ví dụ trên, chú ý các tuyến định tuyến được thêm vào, tương ứng với AllowedIPs
trong cấu hình của peer.
Bạn có thể kiểm tra trạng thái đường hầm trên peer bằng lệnh:
sudo wg
Output:
interface: wg0 public key: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= private key: (hidden) listening port: 49338 fwmark: 0xca6c peer: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE= endpoint: 203.0.113.1:51820 allowed ips: 10.8.0.0/24, fd24:609a:6c18::/64 latest handshake: 1 second ago transfer: 6.50 KiB received, 15.41 KiB sent
Bạn cũng có thể kiểm tra trạng thái trên máy chủ để có đầu ra tương tự.
Để xác nhận rằng peer đang sử dụng VPN, hãy dùng các lệnh ip route
và ip -6 route
. Nếu bạn sử dụng VPN làm gateway cho toàn bộ lưu lượng, hãy kiểm tra giao diện được sử dụng cho lưu lượng hướng đến DNS resolver của CloudFlare (ví dụ: 1.1.1.1 và 2606:4700:4700::1111). Nếu chỉ dùng WireGuard để truy cập tài nguyên VPN, bạn có thể dùng địa chỉ hợp lệ của gateway (ví dụ: 10.8.0.1 hoặc fd24:609a:6c18::1).
Ví dụ, chạy:
ip route get 1.1.1.1
Output:
1.1.1.1 dev wg0 table 51820 src 10.8.0.2 uid 1000 cache
Chú ý giao diện wg0
và địa chỉ IPv4 10.8.0.2 của peer.
Tương tự, với IPv6:
ip -6 route get 2606:4700:4700::1111
Output:
2606:4700:4700::1111 from :: dev wg0 table 51820 src fd24:609a:6c18::2 metric 1024 pref medium
Chú ý giao diện wg0
và địa chỉ IPv6 fd24:609a:6c18::2 của peer.
Nếu trên peer có trình duyệt, bạn cũng có thể truy cập ipleak.net và ipv6-test.com để xác nhận rằng lưu lượng đang được định tuyến qua VPN.
Để ngắt kết nối VPN trên peer, dùng lệnh:
sudo wg-quick down wg0
Bạn sẽ nhận được đầu ra cho biết đường hầm VPN đã được tắt, ví dụ:
[#] ip link delete dev wg0 [#] resolvconf -d tun.wg0 -f
Nếu bạn đã thiết lập AllowedIPs
của peer là 0.0.0.0/0
và ::/0
(hoặc dùng phạm vi khác), đầu ra khi tắt VPN sẽ như sau:
[#] ip rule delete table 200 from 203.0.113.5 [#] ip route delete table 200 default via 203.0.113.1 [#] ip -4 rule delete table 51820 [#] ip -4 rule delete table main suppress_prefixlength 0 [#] ip -6 rule delete table 51820 [#] ip -6 rule delete table main suppress_prefixlength 0 [#] ip link delete dev wg0 [#] resolvconf -d tun.wg0 -f [#] iptables-restore -n [#] ip6tables-restore -n
Các liên kết kiểm tra thêm: ipleak.net, ipv6-test.com.
Để kết nối lại VPN, chỉ cần chạy lại lệnh:
sudo wg-quick up wg0
Nếu bạn muốn loại bỏ hoàn toàn cấu hình của một peer khỏi WireGuard Server, chạy lệnh sau (thay thế Public Key phù hợp):
sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= remove
Thông thường, bạn chỉ cần loại bỏ cấu hình của peer nếu peer không còn tồn tại hoặc nếu khóa mã hóa của nó bị xâm phạm/thay đổi. Nếu không, tốt hơn nên giữ lại cấu hình để peer có thể kết nối lại mà không cần cấu hình lại.
Kết Luận
Trong hướng dẫn này, bạn đã cài đặt gói WireGuard và công cụ trên cả hệ thống máy chủ và máy client (Debian 11). Bạn đã thiết lập các quy tắc tường lửa cho WireGuard và cấu hình kernel để cho phép chuyển tiếp gói tin bằng lệnh sysctl
trên máy chủ. Bạn đã học cách tạo khóa mã hóa riêng tư và công khai của WireGuard, cũng như cách cấu hình máy chủ và peer (hoặc nhiều peer) để kết nối với nhau.
Nếu mạng của bạn sử dụng IPv6, bạn cũng đã học cách tạo phạm vi địa chỉ cục bộ độc nhất để sử dụng cho các kết nối peer. Cuối cùng, bạn đã học cách giới hạn lưu lượng đi qua VPN bằng cách hạn chế các tiền tố mạng mà peer có thể sử dụng, cũng như cách sử dụng WireGuard Server làm gateway VPN để xử lý toàn bộ lưu lượng Internet cho các peer.
Nếu bạn muốn tìm hiểu thêm về WireGuard, bao gồm cách cấu hình các đường hầm nâng cao hoặc sử dụng WireGuard với container, hãy truy cập tài liệu chính thức của WireGuard.