Hướng dẫn cài đặt WireGuard trên DEBIAN 11 | Setup WireGuard Debian 11

WireGuard Debian 11

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ủ.

WireGuard Debian 11

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 timestampmachine-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:

  1. 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).
  2. 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.
  3. 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 VPN wg0 sang giao diện công cộng eth0. Quy tắc này làm việc cùng với các giá trị sysctl net.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.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *