Trang chủHướng dẫnCách thiết lập WireGuard trên Ubuntu 22.04
Chuyên gia

Cách thiết lập WireGuard trên Ubuntu 22.04

CyStack blog 28 phút để đọc
CyStack blog25/08/2025
Locker Avatar

Chris Pham

Technical Writer

Locker logo social
Reading Time: 28 minutes

WireGuard là mạng riêng ảo (VPN) gọn nhẹ hỗ trợ kết nối IPv4 và IPv6. VPN cho phép bạn truy cập các mạng không đáng tin cậy như thể bạn đang ở trong một mạng nội bộ an toàn. Nó giúp bạn truy cập Internet một cách an toàn từ điện thoại hoặc laptop khi kết nối với mạng không đáng tin cậy như WiFi ở khách sạn hoặc quán cà phê.

Cách thiết lập WireGuard trên Ubuntu 22.04

WireGuard sử dụng cơ chế mã hóa dựa trên cặp khóa công khai (public key) và khóa riêng (private key) để thiết lập đường hầm mã hóa giữa các thiết bị (peers). Mỗi phiên bản của WireGuard sử dụng một bộ mã hóa được xác định sẵn để đảm bảo đơn giản, bảo mật và khả năng tương thích.

Trong khi đó, các phần mềm VPN khác như OpenVPN và IPSec sử dụng Transport Layer Security (TLS) và chứng chỉ để 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 khác nhau của TLS hỗ trợ hàng trăm bộ thuật toán và giao thức mã hóa khác nhau. Mặc dù điều này mang lại sự linh hoạt lớn để hỗ trợ nhiều loại client khác nhau, nhưng nó cũng khiến việc cấu hình một VPN sử dụng TLS trở nên mất thời gian, phức tạp và dễ xảy ra lỗi.

Trong hướng dẫn này, bạn sẽ thiết lập WireGuard trên máy chủ Ubuntu 22.04, sau đó cấu hình một máy khác để kết nối như một đồng đẳng (peer), sử dụng cả địa chỉ IPv4 và IPv6 (thường gọi 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 thông qua máy chủ WireGuard như một gateway, ngoài chức năng tạo đường hầm mã hóa ngang hàng.

Chúng ta cũng sẽ cấu hình một hệ thống Ubuntu 22.04 khác làm peer (hay còn gọi là client) để kết nối với WireGuard Server. Các hướng dẫn tiếp theo trong loạt bài này sẽ trình bày cách cài đặt và sử dụng WireGuard trên các hệ điều hành khác như Windows, macOS, Android và iOS.

Lưu ý: Nếu bạn định cài đặt WireGuard trên một DigitalOcean Droplet, hãy nhớ rằng xin lưu ý rằng chúng tôi, giống như nhiều nhà cung cấp dịch vụ lưu trữ khác, sẽ tính phí nếu bạn vượt quá băng thông cho phép. Vì vậy, hãy theo dõi lượng lưu lượng mà máy chủ của bạn sử dụng. Xem trang này để biết thêm thông tin.

Điều kiện tiên quyết

Để làm theo hướng dẫn này, bạn sẽ cần:

  • Một máy chủ Ubuntu 22.04 với người dùng không phải root có quyền sudo, và firewall đã được bật. Bạn có thể làm theo hướng dẫn để chuẩn bị. Trong tài liệu này, ta gọi máy chủ này là WireGuard Server.
  • Bạn sẽ cần một máy client để kết nối đến WireGuard Server. Trong hướng dẫn này, chúng ta sẽ gọi máy đó là WireGuard Peer. Để thuận tiện, bạn nên sử 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 làm client nếu muốn. Nếu bạn sử dụng một hệ thống từ xa, hãy chắc chắn thực hiện đầy đủ các phần tùy chọn được đề cập sau trong hướng dẫn này, nếu không bạn có thể sẽ bị khóa khỏi hệ thống của chính mình.
  • Nếu muốn sử dụng WireGuard với IPv6, bạn cần đảm bảo rằng máy chủ đã được cấu hình để hỗ trợ lưu lượng IPv6. Nếu bạn sử dụng DigitalOcean Droplet, tham khảo hướng dẫn. Bạn có thể thêm hỗ trợ IPv6 khi tạo Droplet, hoặc sau đó bằng cách sử dụng hướng dẫn trên trang đó.

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. Trước tiên, hãy cập nhật danh sách gói (package index) trên WireGuard Server và cài đặt WireGuard bằng các lệnh sau. Nếu đây là lần đầu tiên bạn sử dụng sudo trong phiên làm việc này, hệ thống có thể sẽ yêu cầu bạn nhập mật khẩu của người dùng sudo:

$ sudo apt update
$ sudo apt install wireguard

Bây giờ bạn đã cài đặt xong WireGuard, bước tiếp theo là tạo một cặp khóa riêng và khóa công khai cho máy chủ. Bạn sẽ sử dụng các lệnh tích hợp sẵn wg genkeywg pubkey để tạo khóa, sau đó thêm khóa riêng vào tệp cấu hình của WireGuard.

Bạn cũng cần thay đổi quyền truy cập của tệp khóa vừa tạo bằng lệnh chmod, vì theo mặc định tệp này có thể bị đọc bởi bất kỳ người dùng nào trên máy chủ.

Hãy 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=... sẽ loại bỏ mọi quyền truy cập vào tệp đối với các người dùng và nhóm khác ngoài người dùng root, nhằm đảm bảo chỉ root mới có thể truy cập khóa riêng này.

Bạn sẽ nhận được một dòng đầu ra được mã hóa bằng base64, đó chính là khóa riêng. Một bản sao của đầu ra này cũng sẽ được lưu vào tệp /etc/wireguard/private.key để tham khảo sau này, nhờ vào phần tee trong lệnh. Hãy ghi lại cẩn thận khóa riêng này vì bạn sẽ cần thêm nó vào tệp cấu hình của WireGuard trong phần tiếp theo.

Bước tiếp theo là tạo khóa công khai tương ứng, được tạo ra từ khóa riêng. Hãy sử dụng lệnh sau để tạo tệp chứa khóa công khai:

$ sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

Lệnh này bao gồm ba lệnh riêng biệt được kết hợp với nhau bằng toán tử | (pipe):

  • sudo cat /etc/wireguard/private.key: lệnh này đọc nội dung của tệp khóa riêng và xuất ra standard output (dòng lệnh).
  • wg pubkey: lệnh thứ hai nhận đầu vào từ lệnh đầu tiên (tức là khóa riêng) và xử lý nó để tạo ra khóa công khai.
  • sudo tee /etc/wireguard/public.key: lệnh cuối cùng nhận đầu ra từ quá trình tạo khóa công khai và ghi nó vào tệp có tên /etc/wireguard/public.key.

Khi bạn chạy lệnh này, bạn sẽ nhận được một dòng đầu ra được mã hóa theo chuẩn base64, đây chính là khóa công khai cho WireGuard Server của bạn. Hãy sao chép và lưu lại khóa này ở nơi an toàn, vì bạn sẽ cần chia sẻ khóa công khai này cho bất kỳ peer nào muốn kết nối đến máy chủ.

Bước 2 – Chọn địa chỉ IPv4 và IPv6

Ở phần trước, bạn đã cài đặt WireGuard và tạo một cặp khóa để mã hóa lưu lượng đến và đi từ máy chủ. Trong phần này, bạn sẽ tạo một tệp cấu hình cho máy chủ và thiết lập để WireGuard tự động khởi động mỗi khi máy chủ được reboot. Bạn cũng sẽ xác định các địa chỉ IPv4 và IPv6 riêng tư để sử dụng với WireGuard Server và các peer.

Nếu bạn dự định sử dụng cả địa chỉ IPv4 và IPv6, hãy làm theo cả hai phần dưới đây. Nếu không, hãy làm theo hướng dẫn trong phần phù hợp với nhu cầu mạng VPN của bạn.

Bước 2(a) – Chọn dải địa chỉ IPv4

Nếu bạn đang sử dụng máy chủ WireGuard với các peer dùng IPv4, máy chủ cần một dải địa chỉ IPv4 riêng để dùng cho các client và cho giao diện tunnel. Bạn có thể chọn bất kỳ dải địa chỉ nào từ các khối địa chỉ được dành riêng sau đây (nếu bạn muốn tìm hiểu thêm về cách các khối này được phân bổ, hãy xem đặc tả RFC 1918):

  • 10.0.0.0 đến 10.255.255.255 (tiền tố 10/8)
  • 172.16.0.0 đến 172.31.255.255 (tiền tố 172.16/12)
  • 192.168.0.0 đến 192.168.255.255 (tiền tố 192.168/16)

Trong hướng dẫn này, chúng ta sẽ sử dụng dải 10.8.0.0/24 từ khối địa chỉ đầu tiên. Dải này cho phép tối đa 255 kết nối peer khác nhau và nhìn chung sẽ không bị trùng hoặc xung đột với các dải IP riêng tư khác. Nếu dải ví dụ này không phù hợp với cấu hình mạng của bạn, bạn có thể chọn dải địa chỉ phù hợp khác.

WireGuard Server sẽ sử dụng một địa chỉ IP trong dải này cho địa chỉ tunnel IPv4 riêng của nó. Ở đây, chúng ta sẽ dùng 10.8.0.1/24, nhưng bạn có thể dùng bất kỳ địa chỉ nào trong khoảng từ 10.8.0.1 đến 10.8.0.255. Hãy ghi chú lại địa chỉ IP bạn chọn nếu khác với 10.8.0.1/24. Bạn sẽ thêm địa chỉ IPv4 này vào tệp cấu hình trong Bước 3 -Tạo tệp cấu hình WireGuard Server.

Bước 2(b) – Chọn dải địa chỉ IPv6

Nếu bạn đang sử dụng WireGuard với IPv6, bạn sẽ cần tạo một tiền tố địa chỉ unicast IPv6 cục bộ duy nhất dựa trên thuật toán trong RFC 4193. Các địa chỉ mà bạn sử dụng với WireGuard sẽ được gán cho giao diện tunnel ảo. Bạn cần thực hiện vài bước để tạo một tiền tố IPv6 ngẫu nhiên và duy nhất trong khối địa chỉ riêng fd00::/8.

Theo RFC, cách khuyến nghị để tạo một tiền tố IPv6 duy 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 từ hệ thống như số serial hoặc ID thiết bị. Những giá trị này sau đó sẽ được băm (hash) và rút gọn để tạo ra một tập hợp các bit có thể dùng làm địa chỉ duy nhất trong khối IP riêng fd00::/8.

Để bắt đầu tạo một dải IPv6 cho WireGuard Server của bạn, hãy thu thập 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 dãy số như sau, đây là số giây (%s trong lệnh date) và nano giây (%N) kể từ 1970-01-01 00:00:00 UTC được ghép lại:

Output
1650301699497770167

Hãy ghi lại giá trị này để sử dụng sau. Tiếp theo, sao chép giá trị machine-id của máy chủ từ tệp /var/lib/dbus/machine-id. ID này là duy nhất cho hệ thống của bạn và sẽ không thay đổi chừng nào máy chủ còn tồn tại.

$ cat /var/lib/dbus/machine-id

Bạn sẽ nhận được đầu ra tương tự như sau:

/var/lib/dbus/machine-id
610cef4946ed46da8f71dba9d66c67fb

Giờ bạn cần kết hợp timestamp với machine-id và băm (hash) giá trị thu được bằng thuật toán SHA-1. Lệnh sẽ sử dụng định dạng sau:

printf <timestamp><machine-id> | sha1sum

Chạy lệnh và thay thế giá trị timestamp và machine-id của bạn:

$ 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 hexadecimal, tức là mỗi byte dữ liệu được biểu diễn bằng hai ký tự. Ví dụ, 4f26 trong ví dụ đầu ra là hai byte đầu tiên của dữ liệu đã được băm.

Thuật toán trong RFC chỉ yêu cầu 40 bit ít quan trọng nhất (cuối chuỗi), tức là 5 byte cuối cùng trong chuỗi băm. Sử dụng lệnh cut để lấy 5 byte cuối cùng (dưới dạng mã hóa hex) từ chuỗi:

$ printf 442adea1488d96388dae9ab816045b24609a6c18 | cut -c 31-

Tham số -c yêu cầu lệnh cut chỉ chọn một tập hợp ký tự nhất định. 31- có nghĩa là in 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:

Output
24609a6c18

Trong ví dụ này, tập hợp byte là: 24 60 9a 6c 18.

Bây giờ bạn có thể tạo tiền tố mạng IPv6 duy nhất của mình bằng cách ghép 5 byte này với tiền tố fd, và chèn dấu : sau mỗi 2 byte để dễ đọc. Vì mỗi subnet trong tiền tố duy nhất này có thể chứa đến 18,446,744,073,709,551,616 địa chỉ IPv6, bạn có thể thu hẹp subnet lại với kích thước chuẩn /64 để đơn giản hóa.

Sử dụng các byte đã tạo với subnet size /64, tiền tố mạng sẽ là:

Unique Local IPv6 Address Prefix
fd24:609a:6c18::/64

Dải fd24:609a:6c18::/64 là dải địa chỉ bạn sẽ dùng để gán địa chỉ IP riêng cho giao diện tunnel WireGuard trên máy chủ và các peer. Để gán địa chỉ IP cho máy chủ, thêm số 1 sau dấu ::. Kết quả là:

fd24:609a:6c18::1/64. Các peer có thể sử dụng bất kỳ địa chỉ IP nào trong dải này, nhưng thường bạn sẽ tăng thêm một giá trị mỗi khi thêm một peer, ví dụ: fd24:609a:6c18::2/64. Hãy ghi chú lại địa chỉ IP này và tiếp tục cấu hình WireGuard Server trong phần tiếp theo của hướng dẫn.

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:

  • Đảm bảo bạn đã có khóa riêng từ Bước 1 – Cài đặt WireGuard và tạo cặp khóa.
  • Nếu bạn dùng WireGuard với IPv4, bạn sẽ cần địa chỉ IP mà bạn đã chọn cho server trong Bước 2(a) – Chọn dải địa chỉ IPv4, ví dụ trong hướng dẫn này là 10.8.0.1/24.
  • Nếu bạn dùng WireGuard với IPv6, bạn sẽ cần địa chỉ IP mà bạn đã tạo cho server trong Bước 2(b) – Chọn dải địa chỉ IPv6. Trong ví dụ này là fd24:609a:6c18::1/64.

Sau khi đã có đủ khóa riêng và các địa chỉ IP cần thiết, hãy tạo một file cấu hình mới bằng cách sử dụng nano hoặc trình soạn thảo yêu thích của bạn với lệnh sau:

$ sudo nano /etc/wireguard/wg0.conf

Thêm các dòng sau vào file, thay thế phần base64_encoded_private_key_goes_here bằng khóa riêng của bạn, và thay thế dòng Address bằng địa chỉ IP phù hợp mà bạn đã chọn ở Bước 2. Bạn cũng có thể thay đổi cổng trong dòng ListenPort nếu muốn WireGuard lắng nghe trên một 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 đảm bảo rằng khi một interface của WireGuard bị tắt, mọi thay đổi sẽ được lưu lại vào file cấu hình.

Hãy lưu và đóng file /etc/wireguard/wg0.conf. Nếu bạn đang dùng nano, có thể làm như sau: nhấn CTRL + X, sau đó nhấn Y, rồi nhấn ENTER để xác nhận. Tới đây, bạn đã có một cấu hình máy chủ cơ bản mà bạn có thể tiếp tục bổ sung và điều chỉnh tuỳ theo cách bạn muốn sử dụng máy chủ WireGuard VPN của mình.

Bước 4 – Điều chỉnh cấu hình mạng cho máy chủ WireGuard

Nếu bạn sử dụng WireGuard chỉ để kết nối một peer với máy chủ WireGuard nhằm truy cập các dịch vụ trên chính máy chủ đó, thì bạn không cần thực hiện bước này.

Tuy nhiên, nếu bạn muốn định tuyến toàn bộ lưu lượng Internet của WireGuard Peer thông qua máy chủ WireGuard, thì bạn cần bật tính năng IP forwarding bằng cách làm theo hướng dẫn dưới đây.

Để cấu hình IP forwarding, hãy mở file /etc/sysctl.conf bằng nano hoặc trình soạn thảo mà bạn ưa thích:

$ sudo nano /etc/sysctl.conf

Nếu bạn đang sử dụng IPv4 với WireGuard, hãy thêm dòng sau vào cuối file:

/etc/sysctl.conf
net.ipv4.ip_forward=1

Nếu bạn đang sử dụng IPv6 với WireGuard, hãy thêm dòng sau vào cuối file:

/etc/sysctl.conf
net.ipv6.conf.all.forwarding=1

Nếu bạn sử dụng cả IPv4 và IPv6, hãy đảm bảo bạn thêm cả hai dòng cấu hình vào file /etc/sysctl.conf.

Sau khi chỉnh sửa xong, hãy lưu và đóng file.

Để nạp lại nội dung file và áp dụng các giá trị cấu hình mới cho phiên làm việc hiện tại, chạy lệnh sau:

$ sudo sysctl -p
Output
net.ipv6.conf.all.forwarding = 1
net.ipv4.ip_forward = 1

Bây giờ, WireGuard Server của bạn sẽ có khả năng chuyển tiếp lưu lượng truy cập đến từ thiết bị mạng ảo VPN (ethernet ảo) sang các thiết bị hoặc dịch vụ khác trên máy chủ, và từ đó ra Internet công cộng. Với cấu hình này, bạn có thể chuyển hướng toàn bộ lưu lượng web từ thiết bị Peer thông qua địa chỉ IP của máy chủ, giúp ẩn địa chỉ IP công khai của thiết bị khách.

Tuy nhiên, trước khi lưu lượng có thể được định tuyến đúng cách qua máy chủ, bạn sẽ cần cấu hình một số quy tắc tường lửa (firewall rules). Những quy tắc này sẽ đảm bảo lưu lượng giữa WireGuard Server và các Peer được lưu thông một cách chính xác.

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 máy chủ WireGuard để thêm các quy tắc tường lửa, nhằm đảm bảo lưu lượng giữa máy chủ và các client được định tuyến đúng cách. Cũng như phần trước, bạn có thể bỏ qua bước này nếu chỉ sử dụng WireGuard VPN cho kết nối giữa hai máy để truy cập tài nguyên bị giới hạn trong mạng VPN.

Để cho phép lưu lượng VPN của WireGuard đi qua tường lửa của máy chủ, bạn cần bật masquerading (ẩn địa chỉ gốc), một khái niệm trong iptables cung cấp khả năng dịch địa chỉ mạng (NAT) động theo thời gian thực, giúp định tuyến các kết nối từ client một cách chính xác.

Trước tiên, hãy xác định giao diện mạng công cộng (public network interface) của máy chủ WireGuard bằng cách sử dụng lệnh con ip route:

$ ip route list default

Giao diện mạng công cộng là chuỗi xuất hiện trong kết quả của lệnh này, nằm ngay sau từ “dev”. Ví dụ, kết quả sau đây cho thấy giao diện có tên là eth0, được tô đậm bên dưới:

Output
default via 203.0.113.1 dev eth0 proto static

Hãy ghi nhớ tên thiết bị của bạn vì bạn sẽ cần thêm nó vào các quy tắc iptables trong bước tiếp theo.

Để thêm các quy tắc tường lửa vào máy chủ WireGuard, hãy mở lại tệp cấu hình /etc/wireguard/wg0.conf bằng nano hoặc trình soạn thảo mà bạn ưa thích.

$ sudo nano /etc/wireguard/wg0.conf

Ở cuối tệp, ngay sau dòng SaveConfig = true, hãy 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ẽ được thực thi khi máy chủ WireGuard khởi động đường hầm VPN ảo. Trong ví dụ này, các dòng đó sẽ thêm ba quy tắc cho ufwiptables:

  • ufw route allow in on wg0 out on eth0 – Quy tắc này cho phép chuyển tiếp lưu lượng IPv4 và IPv6 đi vào qua giao diện VPN wg0 đến giao diện mạng eth0 trên máy chủ. Quy tắc này hoạt động kết hợp với các giá trị sysctl mà bạn đã cấu hình ở phần trước: net.ipv4.ip_forwardnet.ipv6.conf.all.forwarding.
  • iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE – Quy tắc này thiết lập tính năng masquerading, dùng để viết lại lưu lượng IPv4 đi vào từ giao diện wg0 sao cho trông như thể nó được gửi trực tiếp từ địa chỉ IPv4 công cộng của máy chủ WireGuard.
  • ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE – Quy tắc này cũng thiết lập masquerading, nhưng dành cho lưu lượng IPv6. Nó viết lại lưu lượng đi vào từ wg0 sao cho trông như đến từ địa chỉ IPv6 công cộng của máy chủ WireGuard.

Các dòng PreDown sẽ được thực thi khi máy chủ WireGuard dừng đường hầm VPN ảo. Những quy tắc này là ngược lại với các dòng PostUp, và có chức năng gỡ bỏ các quy tắc chuyển tiếp và masquerading đã thiết lập cho giao diện VPN khi VPN bị tắt.

Trong cả hai trường hợp, bạn nên chỉnh sửa cấu hình để bao gồm hoặc loại trừ các quy tắc cho IPv4 và IPv6 sao cho phù hợp với cấu hình VPN của bạn. Ví dụ, nếu bạn chỉ sử dụng IPv4, thì có thể bỏ qua các dòng chứa lệnh ip6tables.

Ngược lại, nếu bạn chỉ dùng IPv6, hãy chỉnh sửa cấu hình sao cho chỉ giữ lại các dòng ip6tables. Các dòng ufw nên được giữ lại trong mọi trường hợp, dù bạn dùng IPv4, IPv6 hay cả hai. Sau khi chỉnh sửa xong, hãy lưu và đóng tệp cấu hình.

Phần cuối cùng trong việc cấu hình tường lửa cho máy chủ WireGuard là cho phép lưu lượng đi đến và đi từ cổng UDP mà WireGuard sử dụng. Nếu bạn không thay đổi cổng trong tệp cấu hình /etc/wireguard/wg0.conf trên máy chủ, thì cổng cần mở là 51820. Nếu bạn đã chọn một cổng khác khi chỉnh sửa cấu hình, hãy thay thế bằng cổng đó trong lệnh UFW dưới đây.

Trong trường hợp bạn quên mở cổng SSH khi thực hiện theo hướng dẫn trước đó, hãy thêm nó vào tại bước này luôn:

$ sudo ufw allow 51820/udp
$ sudo ufw allow OpenSSH

Lưu ý: Nếu bạn đang sử dụng một 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 tường lửa bổ sung. Ví dụ, nếu bạn quyết định chuyển hướng toàn bộ lưu lượng mạng qua kết nối VPN, bạn cần đảm bảo rằng lưu lượng qua cổng 53 được cho phép để xử lý các yêu cầu DNS. Ngoài ra, cần mở cổng 80443 để truy cập các trang web sử dụng giao thức HTTP và HTTPS tương ứng. Nếu bạn sử dụng các giao thức khác thông qua VPN, bạn cũng cần thêm các quy tắc tương ứng cho những giao thức đó. Sau khi thêm các quy tắc đó, hãy tắt và bật lại UFW để khởi động lại tường lửa và áp dụng các thay đổi từ tất cả các tệp mà bạn đã chỉnh sửa:

$ sudo ufw disable
$ sudo ufw enable

Bạn có thể xác nhận rằng các quy tắc đã được áp dụng bằng cách chạy lệnh ufw status. Hãy thực hiện lệnh này, và bạn sẽ nhận được kết quả đầu ra tương tự như sau:

$ 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)

Máy chủ WireGuard của bạn hiện đã được cấu hình để xử lý đúng lưu lượng VPN, bao gồm cả việc chuyển tiếp và masquerading cho các thiết bị peer. Với các quy tắc tường lửa đã được thiết lập, bạn có thể khởi động dịch vụ WireGuard để bắt đầu lắng nghe các kết nối từ peer.

Bước 6 – Khởi động máy chủ WireGuard

WireGuard có thể được cấu hình để chạy dưới dạng một dịch vụ systemd thông qua script tích hợp sẵn là wg-quick. Mặc dù bạn có thể sử dụng lệnh wg để tạo đường hầm VPN một cách thủ công mỗi khi cần kết nối, cách làm này thủ công, dễ gây lặp lại và dễ xảy ra lỗi. Thay vào đó, bạn có thể dùng systemctl để quản lý đường hầm VPN thông qua script wg-quick, giúp việc bật/tắt và khởi động VPN trở nên dễ dàng hơn.

Việc sử dụng dịch vụ systemd cũng cho phép bạn cấu hình WireGuard khởi động cùng hệ thống, giúp bạn có thể kết nối VPN bất kỳ lúc nào miễn là máy chủ đang chạy. Để làm điều này, hãy bật dịch vụ wg-quick cho đường hầm wg0 mà bạn đã định nghĩa bằng cách thêm nó vào systemctl:

$ sudo systemctl enable wg-quick@wg0.service

Lưu ý rằng lệnh trên sử dụng tên của thiết bị đường hầm (tunnel) wg0 như một phần của tên dịch vụ. Tên này tương ứng với tệp 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 cùng một máy chủ tùy theo nhu cầu.

Ví dụ, bạn có thể tạo một đường hầm có tên là prod, và tệp cấu hình tương ứng sẽ là /etc/wireguard/prod.conf. Mỗi cấu hình đường hầm có thể chứa các thiết lập riêng biệt về IPv4, IPv6 và quy tắc tường lửa cho các client. Nhờ đó, bạn có thể hỗ trợ nhiều kết nối peer khác nhau, mỗi kết nối có địa chỉ IP và quy tắc định tuyến riêng biệt, rất hữu ích khi cần phân chia môi trường như dev, staging, production hoặc hỗ trợ nhiều nhóm người dùng khác nhau.

Bây giờ hãy bắt đầu dịch vụ:

$ sudo systemctl start wg-quick@wg0.service

Kiểm tra lại xem dịch vụ WireGuard có đang hoạt động hay không bằng lệnh sau. Bạn nên thấy dòng active (running) trong phần kết quả:

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

Kết quả đầu ra sẽ hiển thị các lệnh ip được sử dụng để tạo thiết bị ảo wg0 và gán cho nó các địa chỉ IPv4 và IPv6 mà bạn đã thêm trong tệp cấu hình. Bạn có thể dùng các dòng lệnh này để kiểm tra và xử lý sự cố cho đường hầm, hoặc kết hợp với lệnh wg nếu bạn muốn thử cấu hình giao diện VPN một cách thủ công.

Sau khi máy chủ đã được cấu hình và chạy ổn định, bước tiếp theo là cấu hình máy client của bạn làm một peer trong mạng WireGuard và kết nối đến máy chủ WireGuard.

Bước 7 – Cấu hình một Peer WireGuard

Việc cấu hình một peer trong WireGuard tương tự như khi thiết lập máy chủ WireGuard. Sau khi bạn đã cài đặt phần mềm client, bạn sẽ tạo một cặp khóa publicprivate, chọn địa chỉ IP hoặc nhiều địa chỉ cho peer, tạo tệp cấu hình cho peer, và sau đó khởi động đường hầm VPN bằng script wg-quick.

Bạn có thể thêm bao nhiêu peer tùy thích vào mạng VPN của mình bằng cách tạo cặp khóa và tệp cấu hình cho từng peer theo các bước sau. Nếu bạn thêm nhiều peer vào VPN, hãy đảm bảo theo dõi cẩn thận các địa chỉ IP nội bộ để tránh bị xung đột.

Để cấu hình một WireGuard Peer, trước tiên hãy đảm bảo rằng bạn đã cài đặt gói WireGuard bằng cách sử dụng các lệnh apt sau. Trên thiết bị peer (client), chạy:

$ sudo apt update
$ sudo apt install wireguard

Tạo cặp khóa cho Peer WireGuard

Tiếp theo, bạn cần tạo cặp khóa trên peer bằng cách thực hiện các bước giống như đã làm trên máy chủ. Từ máy tính cục bộ hoặc máy chủ từ xa mà bạn sẽ sử dụng làm peer, hãy tiến hành tạo khóa riêng cho peer bằng các lệnh sau:

$ wg genkey | sudo tee /etc/wireguard/private.key
$ sudo chmod go= /etc/wireguard/private.key

Một lần nữa, bạn sẽ nhận được một dòng đầu ra được mã hóa base64, đó chính là khóa riêng (private key). Bản sao của khóa này cũng được lưu tại tệp /etc/wireguard/private.key. Hãy lưu ý cẩn thận khóa riêng này vì bạn sẽ cần thêm nó vào tệp cấu hình của WireGuard ở phần sau.

Tiếp theo, sử dụng lệnh sau để tạo tệp chứa khóa công khai:

$ 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 được mã hóa base64, đây chính là khóa công khai (public key ) của Peer WireGuard. Hãy sao chép và lưu lại khóa này ở nơi an toàn, vì bạn sẽ cần gửi khóa công khai này cho máy chủ WireGuard để thiết lập kết nối mã hóa giữa peer và server.

Tạo tệp cấu hình cho Peer WireGuard

Bây giờ bạn đã có cặp khóa, bạn có thể tạo tệp cấu hình cho peer, tệp này sẽ chứa tất cả thông tin cần thiết để thiết lập kết nối với máy chủ WireGuard.

Bạn sẽ cần chuẩn bị một vài thông tin để điền vào tệp cấu hình:

  • Khóa riêng đã được mã hóa base64 mà bạn vừa tạo trên peer.
  • Dải địa chỉ IPv4 và IPv6 mà bạn đã định nghĩa trên máy chủ WireGuard.
  • Khóa công khai được mã hóa base64 từ Máy chủ WireGuard.
  • Địa chỉ IP công cộng và cổng (port) của máy chủ WireGuard. Thông thường sẽ là địa chỉ IPv4, nhưng nếu máy chủ của bạn có địa chỉ IPv6 và máy client cũng có kết nối IPv6 ra internet, bạn có thể dùng IPv6 thay vì IPv4.

Với tất cả thông tin này, hãy mở một tệp mới có tên /etc/wireguard/wg0.conf trên máy Peer WireGuard bằng nano hoặc trình soạn thảo mà bạn ưa thích:

$ sudo nano /etc/wireguard/wg0.conf

Thêm các dòng sau vào tệp, thay thế các phần được đánh dấu bằng dữ liệu tương ứng mà bạn đã chuẩn bị:

/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

Hãy lưu ý rằng dòng Address đầu tiên sử dụng địa chỉ IPv4 thuộc dải 10.8.0.0/24 mà bạn đã chọn trước đó. Địa chỉ IP này có thể là bất kỳ địa chỉ nào trong dải, miễn là khác với địa chỉ IP của máy chủ. Tăng địa chỉ lên 1 mỗi lần bạn thêm một đối tác thường là cách dễ nhất để phân bổ IP.

Tương tự, dòng Address thứ hai sử dụng địa chỉ IPv6 từ dải mà bạn đã tạo trước đó và cũng tăng thêm một đơn vị so với địa chỉ của máy chủ. Một lần nữa, bạn có thể sử dụng bất kỳ địa chỉ nào trong phạm vi này nếu bạn quyết định sử dụng một địa chỉ khác.

Một phần đáng chú ý khác trong tệp cấu hình là dòng AllowedIPs cuối cùng. Hai dải địa chỉ IPv4 và IPv6 này hướng dẫn peer chỉ gửi lưu lượng mạng qua VPN nếu địa chỉ đích nằm trong một trong hai dải IP đó. Thông qua chỉ thị AllowedIPs, bạn có thể giới hạn peer chỉ kết nối đến các peer khác và dịch vụ nằm trong mạng VPN, hoặc bạn có thể cấu hình để toàn bộ lưu lượng mạng đi qua VPN và sử dụng máy chủ WireGuard như một cổng mạng.

Nếu bạn chỉ sử dụng IPv4, hãy bỏ qua phần dải fd24:609a:6c18::/64 phía sau (bao gồm cả dấu phẩy ,). Ngược lại, nếu bạn chỉ sử dụng IPv6, chỉ cần giữ lại prefix fd24:609a:6c18::/64 và loại bỏ dải IPv4 10.8.0.0/24.

Trong cả hai trường hợp, nếu bạn muốn chuyển toàn bộ lưu lượng mạng của peer qua VPN và sử dụng máy chủ WireGuard làm cổng truy cập mặc định, bạn có thể sử dụng 0.0.0.0/0 cho toàn bộ không gian địa chỉ IPv4, và ::/0 cho toàn bộ không gian địa chỉ IPv6

(Tùy chọn) Cấu hình Peer để định tuyến toàn bộ lưu lượng qua đường hầm VPN

Nếu bạn chọn chuyển toàn bộ lưu lượng của peer qua đường hầm VPN bằng cách sử dụng các route 0.0.0.0/0 (cho IPv4) hoặc ::/0 (cho IPv6), và peer là một hệ thống từ xa, thì bạn cần thực hiện thêm các bước trong phần này. Nếu peer là một hệ thống cục bộ (local), tốt nhất bạn nên bỏ qua phần này.

Đối với các peer từ xa mà bạn truy cập qua SSH hoặc giao thức khác sử dụng địa chỉ IP công cộng, bạn cần thêm một số quy tắc bổ sung vào tệp wg0.conf của peer. Những quy tắc này sẽ đảm bảo bạn vẫn có thể kết nối từ bên ngoài vào hệ thống ngay cả khi VPN đang được thiết lập. Nếu không có những quy tắc này, khi đường hầm được kích hoạt, toàn bộ lưu lượng, vốn lẽ ra sẽ được xử lý qua giao diện mạng công cộng sẽ bị định tuyến sai qua giao diện wg0, khiến hệ thống từ xa trở nên không thể truy cập được.

Trước tiên, bạn cần xác định địa chỉ IP mà hệ thống sử dụng làm cổng mặc định. Chạy lệnh ip route sau:

$ ip route list table main default

Bạn sẽ nhận được kết quả đầu ra tương tự như sau:

Output
default via 203.0.113.1 dev eth0 proto static

Lưu ý địa chỉ IP được đánh dấu của cổng là 203.0.113.1 để sử dụng sau này và thiết bị eth0. Tên thiết bị của bạn có thể khác. Nếu vậy, hãy thay thế eth0 trong các lệnh sau.

Tiếp theo, hãy tìm IP công khai cho hệ thống bằng cách kiểm tra thiết bị bằng lệnh ip address show:

$ ip -brief address show eth0

Bạn sẽ nhận được kết quả đầu ra tương tự như sau:

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 ví dụ đầu ra này, địa chỉ IP 203.0.113.5 được đánh dấu (không có phần cuối /20) là địa chỉ công khai được gán cho thiết bị eth0 mà bạn sẽ cần thêm vào cấu hình WireGuard.

Bây giờ, hãy mở tệp cấu hình /etc/wireguard/wg0.conf của Peer WireGuard bằng nano hoặc trình soạn thảo mà bạn ưa thích.

$ sudo nano /etc/wireguard/wg0.conf

Trước dòng [Peer], hãy thêm 4 dòng sau vào tệp cấu hình:

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 cấu hình này sẽ tạo một quy tắc định tuyến tùy chỉnh và thêm một tuyến đường (route) riêng biệt, nhằm đảm bảo rằng lưu lượng công cộng đến hệ thống sẽ tiếp tục sử dụng gateway mặc định.

  • PostUp = ip rule add table 200 from 203.0.113.5 – Lệnh này tạo ra một quy tắc kiểm tra mọi mục định tuyến trong bảng số 200 khi IP khớp với địa chỉ công khai 203.0.113.5 của hệ thống.
  • PostUp = ip route add table 200 default via 203.0.113.1 – Lệnh này đảm bảo rằng mọi lưu lượng được xử lý bởi bảng 200 sẽ sử dụng gateway 203.0.113.1 để định tuyến, thay vì đi qua giao diện WireGuard.

Các dòng PreDown sẽ xóa quy tắc và tuyến đường tùy chỉnh khi đường hầm bị tắt.

Lưu ý: Số hiệu bảng định tuyến 200 trong các quy tắc trên chỉ là giá trị tùy chọn. Bạn có thể sử dụng bất kỳ giá trị nào trong khoảng từ 2 đến 252, hoặc dùng tên tùy chỉnh bằng cách thêm một nhãn vào tệp /etc/iproute2/rt_tables, rồi tham chiếu đến tên đó thay vì dùng giá trị số.

Để tìm hiểu thêm về cách hoạt động của bảng định tuyến trong Linux, bạn có thể tham khảo phần Routing Tables trong tài liệu Guide to IP Layer Network Administration with Linux.

(Tùy chọn) Cấu hình bộ giải quyết DNS của WireGuard Peer

Nếu bạn chỉ sử dụng WireGuard để truy cập các tài nguyên trong mạng VPN hoặc theo mô hình peer-to-peer, thì có thể bỏ qua phần này. Tuy nhiên, nếu bạn đang dùng máy chủ WireGuard làm VPN gateway để định tuyến toàn bộ lưu lượng của peer, bạn sẽ cần thêm một dòng vào phần [Interface] trong tệp cấu hình của peer để chỉ định DNS resolvers (trình phân giải tên miền). Nếu bạn không thêm dòng này, các yêu cầu DNS có thể không được mã hóa qua VPN, hoặc có thể bị lộ với nhà cung cấp dịch vụ Internet hoặc các bên thứ ba khác.

Nếu bạn chỉ sử dụng WireGuard để truy cập tài nguyên trên mạng VPN hoặc trong cấu hình ngang hàng thì bạn có thể bỏ qua phần này. Chạy lệnh sau trên Máy chủ WireGuard, thay thế tên thiết bị ethernet của bạn vào vị trí eth0 nếu nó khác với ví dụ này:

$ resolvectl dns eth0

Bạn sẽ nhận được kết quả đầu ra tương tự như sau:

Output
Link 2 (eth0): 67.207.67.2 67.207.67.3 2001:4860:4860::8844 2001:4860:4860::8888

Địa chỉ IP được xuất ra là các bộ phân giải DNS mà máy chủ đang sử dụng. Bạn có thể chọn sử dụng bất kỳ hoặc tất cả các bộ phân giải này, hoặc chỉ IPv4 hoặc IPv6 tùy theo nhu cầu. Hãy ghi chú lại các bộ phân giải bạn sẽ sử dụng.

Tiếp theo, bạn cần thêm các resolver đã chọn vào tệp cấu hình của WireGuard Peer. Quay lại máy peer, mở tệp /etc/wireguard/wg0.conf bằng nano hoặc trình chỉnh sửa văn bản ưa thích của bạn:

$ sudo nano /etc/wireguard/wg0.conf

Trước dòng [Peer], hãy thêm các dòng sau:

DNS = 67.207.67.2 2001:4860:4860::8844

[Peer]
. . .

Một lần nữa, tuỳ theo sở thích hoặc yêu cầu của bạn về IPv4 và IPv6, bạn có thể chỉnh sửa danh sách DNS resolver này cho phù hợp với nhu cầu của mình.

Khi bạn đã kết nối với VPN ở bước tiếp theo, bạn có thể kiểm tra xem các truy vấn DNS của mình có được gửi qua VPN hay không bằng cách sử dụng một trang web như DNS leak test.com.

Bạn cũng có thể kiểm tra xem peer của mình có đang sử dụng các DNS resolver đã cấu hình hay không bằng lệnh resolvectl dns, tương tự như cách bạn đã thực hiện trên máy chủ. Bạn sẽ nhận được đầu ra giống như sau, hiển thị các DNS resolver mà bạn đã cấu hình cho đường hầm VPN:

Output
Global: 67.207.67.2 67.207.67.3
. . .

Với tất cả các cấu hình DNS resolver đã hoàn tất, bạn đã sẵn sàng để thêm khóa công khai của peer vào máy chủ, và sau đó khởi động đường hầm WireGuard trên máy peer.

Bước 8 – Thêm khóa công khai của Peer vào WireGuard Server

Trước khi kết nối peer với máy chủ, điều quan trọng là phải thêm khá công khai 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 không thực hiện bước này, máy chủ WireGuard sẽ không cho phép peer gửi hoặc nhận bất kỳ lưu lượng nào qua đường hầm.

Đảm bảo rằng bạn có bản sao khóa công khai được mã hóa base64 cho WireGuard Peer bằng cách chạy:

$ sudo cat /etc/wireguard/public.key
Output
PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=

Bây giờ đăng nhập vào máy chủ WireGuard và chạy lệnh sau:

$ sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,fd24:609a:6c18::2

Lưu ý phần allowed-ips của lệnh nhận danh sách các địa chỉ IPv4 và IPv6 ngăn cách bằng dấu phẩy. Bạn có thể chỉ định từng địa chỉ IP riêng lẻ nếu muốn giới hạn địa chỉ mà peer được phép tự gán, hoặc một dải địa chỉ như trong ví dụ nếu bạn cho phép các peer sử dụng bất kỳ địa chỉ nào trong phạm vi VPN. Cũng cần lưu ý rằng không hai peer nào có thể dùng chung cùng một thiết lập allowed-ips.

Nếu bạn muốn cập nhật allowed-ips cho một peer đã tồn tại, chỉ cần chạy lại lệnh tương tự nhưng thay đổi các địa chỉ IP. Nhiều địa chỉ IP được hỗ trợ. Ví dụ, để chỉnh sửa peer vừa thêm và cho phép thêm địa chỉ 10.8.0.100 vào danh sách gồm 10.8.0.2fd24:609a:6c18::2, bạn sẽ chạy:

$ sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,10.8.0.100,fd24:609a:6c18::2

Sau khi bạn đã chạy lệnh để thêm peer, hãy kiểm tra trạng thái của tunnel trên máy chủ bằng lệnh wg sau:

$ 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 ý cách dòng ngang hàng hiển thị khóa công khai của WireGuard peer và địa chỉ IP hoặc dải địa chỉ mà nó được phép sử dụng để tự gán cho mình một IP.

Bây giờ khi bạn đã định nghĩa các tham số kết nối của peer trên máy chủ, bước tiếp theo là khởi động tunnel trên máy peer.

Bước 9 – Kết nối Peer của WireGuard vào Tunnel

Bây giờ khi cả máy chủ và peer của bạn đều đã được cấu hình để hỗ trợ IPv4, IPv6, chuyển tiếp gói tin (packet forwarding) và phân giải DNS, đã đến lúc kết nối peer vào tunnel VPN.

Vì bạn có thể chỉ muốn bật VPN trong một số trường hợp cụ thể, chúng ta sẽ sử dụng lệnh wg-quick để thiết lập kết nối một cách thủ công. Nếu bạn muốn tự động khởi động đường hầm giống như đã làm với máy chủ, hãy làm theo các bước ở Bước 6 — Khởi động WireGuard Server thay vì sử dụng lệnh wg-quick.

Trong trường hợp bạn định tuyến toàn bộ lưu lượng qua VPN và đã thiết lập chuyển tiếp DNS, bạn cần cài đặt tiện ích resolvconf trên máy WireGuard Peer trước khi khởi động tunnel. Chạy lệnh sau để cài đặt:

$ sudo apt install resolvconf

Để khởi động đường hầm, hãy chạy lệnh sau trên máy WireGuard Peer:

$ sudo wg-quick up wg0

Bạn sẽ nhận được kết quả đầu ra tương tự như sau:

Output
[#] 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

Lưu ý các địa chỉ IPv4 và IPv6 được đánh dấu mà bạn đã gán cho peer.

Nếu bạn đã đặt giá trị AllowedIPs trên peer là 0.0.0.0/0::/0 (hoặc sử dụng các dải địa chỉ khác với dải bạn đã chọn cho VPN), thì đầu ra của bạn sẽ trông giống như sau:

Output
[#] 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ụ này, hãy chú ý đến các route được đánh dấu mà lệnh đã thêm vào, tương ứng với các AllowedIPs trong cấu hình của peer.

Bạn có thể kiểm tra trạng thái của tunnel trên peer bằng cách sử dụng lệnh wg:

$ 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ủ một lần nữa và sẽ nhận được kết quả tương tự.

Hãy xác minh rằng peer của bạn đang sử dụng VPN bằng cách sử dụng các lệnh ip routeip -6 route. Nếu bạn đang sử dụng VPN như một cổng truy cập cho toàn bộ lưu lượng Internet, hãy kiểm tra interface nào sẽ được sử dụng để gửi lưu lượng đến các DNS resolver của CloudFlare tại địa chỉ 1.1.1.12606:4700:4700::1111.

Nếu bạn chỉ sử dụng WireGuard để truy cập các tài nguyên nội bộ qua VPN, thì hãy thay thế bằng một địa chỉ IPv4 hoặc IPv6 hợp lệ, ví dụ như gateway của hệ thống: 10.8.0.1 hoặc fd24:609a:6c18::1.

$ ip route get 1.1.1.1
Output
1.1.1.1 dev wg0 table 51820 src 10.8.0.2 uid 1000
   cache

Lưu ý rằng thiết bị wg0 đang được sử dụng cùng với địa chỉ IPv4 10.8.0.2 mà bạn đã gán cho peer. Tương tự, nếu bạn đang sử dụng IPv6, hãy chạy lệnh sau:

$ 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

Tiếp tục lưu ý giao diện wg0, và địa chỉ IPv6 fd24:609a:6c18::2 mà bạn đã gán cho peer.

Nếu peer của bạn có trình duyệt web được cài đặt, bạn cũng có thể truy cập các trang như ipleak.netipv6-test.com để xác nhận rằng peer đang định tuyến lưu lượng truy cập của mình thông qua VPN.

Khi bạn đã sẵn sàng ngắt kết nối khỏi VPN trên peer, hãy sử dụng lệnh wg-quick sau:

$ sudo wg-quick down wg0

Bạn sẽ nhận được kết quả đầu ra tương tự như sau, cho biết rằng kết nối VPN tunnel đã được ngắt:

Output
[#] ip link delete dev wg0
[#] resolvconf -d tun.wg0 -f

Nếu bạn đã thiết lập giá trị AllowedIPs trên peer là 0.0.0.0/0::/0 (hoặc sử dụng các dải IP khác với những dải bạn đã chọn cho VPN), thì đầu ra bạn nhận được sẽ giống như sau:

Output
[#] 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

Để kết nối lại với VPN, hãy chạy lại lệnh wg-quick up wg0 trên máy chủ ngang hàng. Nếu bạn muốn xóa hoàn toàn cấu hình của một peer khỏi WireGuard Server, bạn có thể chạy lệnh sau. Hãy chắc chắn rằng bạn đã thay thế đúng khóa công khai (public key) của peer mà bạn muốn xóa:

$ sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= remove

Thông thường, bạn chỉ cần xóa cấu hình của một 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ị lộ hoặc đã thay đổi. Trong các trường hợp khác, tốt hơn hết là nên giữ nguyên cấu hình để peer có thể kết nối lại với VPN mà không cần bạn phải thêm lại khóa và allowed-ips mỗi lần.

Kết luận

Trong hướng dẫn này, bạn đã cài đặt gói WireGuard và các công cụ cần thiết trên cả hệ thống server và client chạy Ubuntu 22.04. Bạn đã thiết lập các quy tắc tường lửa cho WireGuard và cấu hình các thiết lập kernel để cho phép chuyển tiếp gói tin thông qua lệnh sysctl trên máy chủ để kết nối với nhau. Bạn đã học cách tạo khóa mã hóa riêng tư và công khai cho 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 đã biết cách tạo một dải địa chỉ cục bộ duy nhất để sử dụng cho kết nối peer. Cuối cùng, bạn đã học cách giới hạn loại lưu lượng nào sẽ đi qua VPN bằng cách giới hạn các tiền tố mạng mà peer có thể sử dụng, cũng như cách sử dụng WireGuard Server như một VPN gateway để 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 tunnel nâng cao hơn hoặc cách sử dụng WireGuard với container, hãy truy cập tài liệu chính thức của WireGuard.

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất