Cách Cài Đặt WireGuard Trên Ubuntu 22.04 thành công 100%

WireGuard Ubuntu 22.04

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. Một VPN cho phép bạn duyệt qua các mạng không tin cậy như thể bạn đang ở trên 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 hoặc laptop khi kết nối vào một mạng không tin cậy, chẳng hạn như WiFi tại khách sạn hay quán cà phê.

Cơ chế mã hóa của WireGuard dựa trên các cặp khóa công khai (Public Key) và khóa riêng (Private Key) để các peer 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ộ 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 giữa 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 hỗ trợ hàng trăm bộ thuật toán và thuật toán mã hóa khác nhau, và mặc dù điều này mang lại sự linh hoạt cao để hỗ trợ nhiều client khác nhau, nó cũng làm cho 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 bài hướng dẫn này, bạn sẽ cài đặt WireGuard trên một máy chủ Ubuntu 22.04, sau đó cấu hình một máy khác để kết nối với máy chủ đó dưới dạng 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 để thiết lập một đường hầm mã hóa trực tiếp giữa các peer.

Với mục đích của bài hướng dẫn, chúng ta sẽ cấu hình một hệ thống Ubuntu 22.04 khác làm peer (còn gọi là client) cho WireGuard Server. Các bài hướng dẫn tiếp theo trong chuỗi này sẽ giải thích cách cài đặt và chạy WireGuard trên Windows, macOS, Android và iOS.

Lưu ý: Nếu bạn dự định cài đặt WireGuard trên DataOnline Cloud VPS, hãy lưu ý rằng như nhiều nhà cung cấp hosting khác, họ sẽ tính phí cho lưu lượng vượt mức. Vì vậy, hãy chú ý đến lượng lưu lượng mà máy chủ của bạn xử lý.

Yêu cầu tiên quyết

Để theo dõi bài hướng dẫn này, bạn cần:

  •  Một máy chủ Ubuntu 22.04 với một tài khoản không phải root có quyền sudo và tường lửa được bật. Để thiết lập, bạn có thể theo dõi bài Thiết Lập Máy Chủ Ban Đầu với Ubuntu 22.04.
  •  Một máy client để kết nối với WireGuard Server. Trong bài hướng dẫn này, máy đó được gọi là WireGuard Peer. Đối với bài hướng dẫn này, 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ể sử 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 bên dưới để tránh bị khóa truy cập.
  • Để sử dụng WireGuard với IPv6, bạn cũng 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 muốn bật IPv6 cho WireGuard và đang sử dụng DataOnline Cloud VPS, hãy tham khảo Cách kích hoạt IPv6 trên VPS. Bạn có thể thêm IPv6 khi tạo Cloud VPS hoặc sau đó bằng cách làm theo 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 bài 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 bạn sử dụng sudo trong phiên làm việc này:

sudo apt update
sudo apt install wireguard

Giờ đây, khi bạn đã cài đặt WireGuard, bước tiếp theo là tạo 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 genkey và wg pubkey để tạo các 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 chứa khóa vừa tạo bằng lệnh chmod, vì mặc định file này có thể được đọc bởi tất cả người dùng trên máy chủ.

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ỏ tất cả các quyền đối với file đối với 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 được mã hóa base64, đó chính là Private Key. Một bản sao của đầu ra cũng được lưu trong file /etc/wireguard/private.key nhờ 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 ở bước 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 nối với nhau bằng toán tử | (pipe):

  • sudo cat /etc/wireguard/private.key: đọc file chứa khóa riêng và xuất ra đầu ra chuẩn.
  • wg pubkey: nhận đầu ra từ lệnh trước làm đầu vào và xử lý để tạo ra khóa công khai.
  • sudo tee /etc/wireguard/public.key: chuyển hướng đầu ra của lệnh tạo khóa công khai vào file /etc/wireguard/public.key.

Khi chạy lệnh, bạn sẽ nhận được một dòng đầu ra được mã hóa base64, đó là Public Key của WireGuard Server. Hãy lưu lại giá trị này 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 đến 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ủ khởi động lại. 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 của VPN.

Bước 2(a) – Lựa chọn Phạm vi Địa chỉ IPv4

Nếu bạn sử dụng WireGuard với các peer sử dụng IPv4, máy chủ cần có một phạm vi địa chỉ IPv4 riêng tư để sử dụng cho các client và cho giao diện tunnel của nó. Bạn có thể chọn bất kỳ phạm vi địa chỉ nào từ các khối địa chỉ dự trữ sau (để tìm hiểu thêm về cách phân bổ, 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 bài hướng dẫn này, chúng ta sẽ sử dụng phạm vi 10.8.0.0/24 từ khối địa chỉ dự trữ đầu tiên. Phạm vi này cho phép tối đa 255 kết nối peer, và thường không bị trùng lặp với các phạm vi địa chỉ 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. Hãy ghi nhớ địa chỉ bạn chọn nếu khác với 10.8.0.1/24, vì bạn sẽ cần thêm địa chỉ 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 sẽ được gán cho giao diện tunnel ảo. Bạn cần thực hiện một số bước để tạo ra một tiền tố IPv6 ngẫu nhiên, độc nhất trong khối địa chỉ riêng fd00::/8.

Theo RFC, cách khuyến nghị để có được 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 (ví dụ: số serial hoặc device ID). Những giá trị này sau đó được băm và cắt ngắn, tạo ra một chuỗi 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, thu thập một timestamp 64-bit bằng tiện ích date với lệnh:

date +%s%N

Bạn sẽ nhận được một số như sau, gồm số giây (%s) và nano giây (%N) kể từ 1970-01-01 00:00:00 UTC kết hợp lại:

Output

1650301699497770167

Ghi nhớ giá trị timestamp này để sử dụng sau.

Tiếp theo, sao chép 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à sẽ 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 có định dạng:

printf <timestamp><machine-id> | sha1sum

Ví dụ, chạy:

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, mỗi byte được biểu diễn bởi 2 ký tự (ví dụ: “4f” và “26” là 2 byte đầu tiên).

Thuật toán trong RFC chỉ yêu cầu 40 bit có ý nghĩa thấp nhất (5 byte) của đầu ra băm. Sử dụng lệnh cut để in ra 5 byte cuối cùng (mã hóa thập lục phân):

printf 442adea1488d96388dae9ab816045b24609a6c18 | cut -c 31-

Tham số -c 31- yêu cầu lệnh cut chọn tất cả các ký tự từ vị trí 31 đến hết dòng.

Bạn sẽ nhận được:

Output

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ố mạng 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 vừa tạo và kích thước subnet /64, tiền tố địa chỉ IPv6 sẽ là:

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ỉ máy chủ sẽ là:

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 số (ví dụ: fd24:609a:6c18::2/64 cho peer đầu tiên). Hãy ghi nhớ địa chỉ bạn chọn và tiếp tục 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 các thông tin sau:

  1. Đảm bảo 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 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áy chủ được 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 bằng nano (hoặc trình soạn thảo bạn ưa thích) với 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:

[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 bị 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 bạn sử dụng nano, nhấn CTRL+X, sau đó nhấn Y và ENTER để xác nhận. Giờ đây, 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.

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 để kết nối một peer với WireGuard Server chỉ để truy cập vào các dịch vụ trên máy chủ, bạn có thể bỏ qua phần này. Nếu bạn muốn định tuyến lưu lượng Internet của WireGuard Peer qua WireGuard Server, bạn cần cấu hình chuyển tiếp IP (IP forwarding) theo hướng dẫn dưới đây.

Để cấu hình chuyển tiếp, mở file /etc/sysctl.conf bằng nano (hoặc trình soạn thảo bạn ưa 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 bạn 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 lại file và áp dụng các giá trị mới cho phiên làm việc hiện tại, chạy:

sudo sysctl -p

Output

net.ipv6.conf.all.forwarding = 1
net.ipv4.ip_forward = 1

Giờ đây, WireGuard Server của bạn có thể chuyển tiếp lưu lượng từ giao diện VPN ảo đến các giao diện khác trên máy chủ, và từ đó ra Internet công cộng. Cấu hình này cho phép định tuyến toàn bộ lưu lượng web của WireGuard Peer qua địa chỉ IP của máy chủ, ẩn đi địa chỉ IP công cộng của client.

Tuy nhiên, trước khi lưu lượng được định tuyến chính xác qua máy chủ, bạn cần cấu hình một số quy tắc tường lửa để đảm bảo lưu lượng từ và tới WireGuard Server và các peer được định tuyến đúng.

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 file 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ủ cũng như 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 nội bộ, bạn có thể bỏ qua phần này.

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

  1. Tìm giao diện mạng công cộng
    Sử dụng lệnh con của ip route:

    ip route list default

    Giao diện công cộng là chuỗi ký tự sau từ “dev”. Ví dụ, đầu ra có thể như sau:

    Output

    default via 203.0.113.1 dev eth0 proto staticGhi nhớ tên giao diện này (ví dụ:

    eth0

    ) vì bạn sẽ dùng nó trong các quy tắc iptables ở bước sau.
  2. Thêm quy tắc tường lửa
    Mở lại file /etc/wireguard/wg0.conf bằng nano:

    sudo nano /etc/wireguard/wg0.conf

    Ở cuối file, sau dòng SaveConfig = true, dán các dòng sau:

    . . .
    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, chúng thêm ba quy tắc cho ufw và iptables:

    • ufw route allow in on wg0 out on eth0: 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 hoạt động cùng với các giá trị sysctl net.ipv4.ip_forward và net.ipv6.conf.all.forwarding đã cấu hình.
    • iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE: Cấu hình masquerading, chuyển đổi lưu lượng IPv4 từ giao diện 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: Tương tự cho lưu lượng IPv6.

    Các dòng PreDown sẽ chạy khi WireGuard Server tắt đường hầm VPN, loại bỏ các quy tắc đã thiết lập.

    Bạn có thể chỉnh sửa file để chỉ bao gồm các quy tắc phù hợp với cấu hình của bạn (ví dụ, nếu chỉ sử dụng IPv4, bạn có thể bỏ qua các dòng chứa ip6tables).

  3. Mở cổng cho WireGuard UDP
    Phần cuối của việc 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 là 51820. Nếu bạn thay đổi, hãy thay thế tương ứng trong lệnh UFW dưới đây.Nếu bạn quên mở cổng SSH trong quá trình thiết lập ban đầu, hãy mở nó thêm:

    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, có thể cần thêm các quy tắc bổ sung (ví dụ: mở cổng 53 cho DNS, 80 cho HTTP, 443 cho HTTPS, v.v.).

  4. Tái khởi động tường lửa UFW
    Sau khi thêm các quy tắc, tắt và bật lại UFW để nạp thay đổi:
sudo ufw disable
sudo ufw enable

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)

WireGuard Server của bạn giờ đã đượ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 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 để 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 tích hợp wg-quick. Mặc dù bạn có thể dùng lệnh wg để tạo đường hầm mỗi khi cần sử dụng VPN, cách này thủ công và dễ mắc lỗi. Thay vào đó, hãy dùng systemctl để quản lý đường hầm với sự trợ giúp của wg-quick.

Việc sử dụng dịch vụ systemd cho phép bạn 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 wg0 làm một phần của tên dịch vụ, á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à quy tắc tường lửa khác nhau cho các peer riêng biệt.

Giờ khởi động dịch vụ:

sudo systemctl start wg-quick@wg0.service

Kiểm tra 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ể dùng các quy tắc này để kiểm tra và xử lý sự cố đường hầm hoặc dùng lệnh wg để cấu hình VPN thủ công.

Với máy chủ đã được cấu hình và khởi động, bước tiếp theo là cấu hình máy client làm WireGuard Peer và kết nối đến 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, xác định địa chỉ IP cho peer, tạo file cấu hình cho peer và 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 vào VPN của mình bằng cách tạo cặp khóa và file cấu hình theo các bước sau. Nếu thêm nhiều peer, hãy theo dõi cẩn thận đị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 sau. Trên máy WireGuard Peer chạy:

sudo apt update
sudo apt install wireguard

Tạo Cặp Khóa cho WireGuard Peer

Tiếp theo, bạn cần tạo cặp khóa trên máy Peer theo cùng cách như trên máy chủ. Trên máy cục bộ hoặc máy chủ từ xa sẽ đóng vai trò làm Peer, chạy các lệnh sau để tạo khóa riêng cho Peer:

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 được mã hóa base64, đó là Private Key của Peer. Một bản sao của đầ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 cho Peer:

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, đó là Public Key của WireGuard Peer. Ghi lại giá trị này vì bạn sẽ cần phân phối khóa công khai của Peer cho WireGuard Server để thiết lập kết nối mã hóa.

Tạo File Cấu Hình cho WireGuard Peer

Bây giờ, khi đã có cặp khóa, bạn có thể tạo file cấu hình cho Peer chứa tất cả cá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 đã được định nghĩa trên WireGuard Server.
  • Public Key của WireGuard Server (đã được tạo ở bước trước).
  • Đị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à máy client có kết nối IPv6, bạn có thể sử dụng IPv6.

Với tất cả các thông tin này, mở file cấu hình mới cho Peer với lệnh:

sudo nano /etc/wireguard/wg0.conf

Thêm các dòng sau vào file, thay thế các phần đánh dấu bằng thông tin tương ứng:

/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 ở bước 2(a). Đị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, bạn tăng dần giá trị cho mỗi Peer.
  • Dòng Address thứ hai sử dụng địa chỉ IPv6 từ phạm vi đã tạo ở bước 2(b), thường tăng dần từ địa chỉ máy chủ.
  • 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 các phạm vi đó. Sử dụng chỉ thị AllowedIPs, bạn có thể hạn chế VPN của Peer chỉ kết nối với các Peer và dịch vụ nội bộ, hoặc cấu hình để định tuyến toàn bộ lưu lượng qua VPN và sử dụng WireGuard Server làm gateway.
  • Nếu bạn chỉ dùng IPv4, bạn có thể bỏ qua phạm vi IPv6 (và ngược lại).

Nếu bạn muốn định tuyến toàn bộ lưu lượng của Peer qua VPN và sử dụng WireGuard Server làm gateway, bạn có thể dùng 0.0.0.0/0 cho toàn bộ không gian địa chỉ IPv4 và ::/0 cho IPv6.

(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 thành các bước dưới đây. 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 với địa chỉ IP công cộng), bạn cần thêm một số quy tắc bổ sung vào file cấu hình /etc/wireguard/wg0.conf để đảm bảo rằng bạn vẫn có thể kết nối với hệ thống từ ngoài đường hầm. Nếu không, khi đường hầm được thiết lập, lưu lượng qua giao diện công cộng sẽ không được định tuyến đúng và hệ thống từ xa có thể bị mất kết nối.

  • Đầu tiên, xác định địa chỉ IP mặc định của gateway mà hệ thống sử dụng bằng lệnh:
    ip route list table main default
     Bạn sẽ nhận được đầu ra như sau:

    Output

    default via 203.0.113.1 dev eth0 proto static

    Ghi nhớ địa chỉ gateway 203.0.113.1 và tên giao diện eth0 (nếu khác, thay thế tương ứng).

  • Tiếp theo, xác định địa chỉ IP công cộng của hệ thống bằng cách sử 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 có /20) là địa chỉ công cộng của giao diện eth0, bạn sẽ cần thêm vào file cấu hình của Peer.

Mở file cấu hình của Peer:

sudo nano /etc/wireguard/wg0.conf

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

Những dòng này tạo ra quy tắc định tuyến tùy chỉnh để đảm bảo lưu lượng công cộng đến hệ thống sẽ 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 địa chỉ IP trùng với địa chỉ công cộng của hệ thống.
  • PostUp = ip route add table 200 default via 203.0.113.1: Đảm bảo rằng lưu lượng được xử lý bởi bảng 200 sẽ sử dụng gateway 203.0.113.1.
  • Các dòng PreDown sẽ loại bỏ các quy tắc tùy chỉnh này khi đường hầm bị tắt.

Chú ý rằng dòng thông tin của Peer hiển thị Public Key của Peer, và các địa chỉ (hoặc phạm vi) mà Peer được phép sử dụng.

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 máy Peer.

(Tùy chọn) Cấu hình DNS cho WireGuard Peer

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] của file cấu hình Peer chỉ định DNS resolvers. Nếu không thêm, các yêu cầu DNS có thể không được bảo mật qua VPN hoặc bị tiết lộ cho ISP hoặc bên thứ ba. Nếu bạn chỉ dùng WireGuard để truy cập tài nguyên nội bộ, bạn có thể bỏ qua phần này.

Để thêm DNS resolvers, trước tiên xác định DNS server mà WireGuard Server đang sử dụng. Trên WireGuard Server, chạy (thay thế eth0 nếu giao diện của bạn khác):

resolvectl dns eth0

Output (ví dụ)

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 resolvers mà máy chủ đang sử dụng. Ghi nhớ các địa chỉ này theo nhu cầu (bạn có thể sử dụng IPv4, IPv6 hoặc cả hai).

Trên máy Peer, mở file cấu hình /etc/wireguard/wg0.conf:

sudo nano /etc/wireguard/wg0.conf

Trước phần [Peer], thêm dòng sau:

DNS = 67.207.67.2 2001:4860:4860::8844

Sau đó, file cấu hình 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 và IPv6 của mình.

Khi đã kết nối VPN, 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ư DNS leak test hoặc dùng lệnh resolvectl dns để xác nhận.

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ủ, quan trọng là 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 không thực hiện bước này, WireGuard Server sẽ không cho phép Peer gửi hoặc nhận lưu lượng qua đường hầm.

Trên máy Peer, đảm bảo rằng bạn đã sao chép Public Key (được mã hóa base64) bằng lệnh:

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 tham số allowed-ips nhận danh sách các địa chỉ IPv4 và IPv6, phân cách bằng dấu phẩy. Bạn có thể chỉ định một địa chỉ cụ thể hoặc một phạm vi. Cũng lưu ý rằng không có hai Peer nào có cùng cài đặt 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 IP như 10.8.0.100 vào Peer hiện có (đã có 10.8.0.2 và fd24:609a:6c18::2), chạy:

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

Sau khi chạy lệnh để thêm Peer, kiểm tra trạng thái của đường hầm trên WireGuard Server 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

Nhìn vào đầu ra, bạn thấy dòng thông tin của Peer hiển thị Public Key và các địa chỉ (hoặc phạm vi) mà Peer được phép sử dụng.

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 máy Peer.

Bước 9 – Kết nối WireGuard Peer với Đường hầm

Giờ mà 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ào đườ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, bạn có thể 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 trong Bước 6.

Nếu 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 máy Peer trước khi khởi động đường hầm. Chạy lệnh:

sudo apt install resolvconf

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

sudo wg-quick up wg0

Bạn sẽ nhận được đầu ra 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

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ẽ tương tự:

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, 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ủ để nhận đầu ra tương tự.

Để xác nhận rằng Peer đang sử dụng VPN, bạn có thể dùng các lệnh ip route và ip -6 route. Nếu VPN được sử dụng làm gateway cho toàn bộ lưu lượng Internet, hãy kiểm tra giao diện được sử dụng cho lưu lượng hướng tới DNS 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 nội bộ, hãy 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 mà bạn đã gán cho Peer.

Tương tự với IPv6, chạy:

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 máy 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 của Peer đang được định tuyến qua VPN.

Khi bạn sẵn sàng ngắt kết nối VPN trên Peer, sử dụng lệnh:

sudo wg-quick down wg0

Bạn sẽ nhận được đầu ra cho biết rằng đường hầm VPN đã bị tắt:

Output

[#] 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 sử dụng phạm vi khác), đầu ra khi tắt VPN sẽ 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 VPN, 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 với Peer cần loại bỏ):

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 một Peer nếu Peer không còn tồn tại hoặc nếu các khóa mã hóa của nó bị xâm phạm hoặc thay đổi. Nếu không, tốt hơn bạn để nguyên cấu hình để Peer có thể kết nối lại mà không cần thêm lại khóa và allowed-ips mỗi lần.

Kết Luận

Trong bài hướng dẫn này, bạn đã cài đặt gói và công cụ WireGuard trên cả máy chủ và máy client 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 bằng lệnh sysctl trên máy chủ. Bạn đã học cách tạo các cặp khóa mã hóa (private và public keys) của WireGuard, và 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 *