Tìm kiếm trang web

Cách Cài Đặt WireGuard trên Ubuntu


Giới thiệu

WireGuard là một Mạng Riêng Ảo (VPN) nhẹ, hỗ trợ cả kết nối IPv4 và IPv6. VPN cho phép bạn truy cập qua các mạng không đáng tin cậy như thể bạn đang ở trong một mạng riêng. Nó giúp bạn có thể truy cập internet an toàn hơn từ các thiết bị như máy tính xách tay hoặc điện thoại di động khi kết nối với các mạng không đáng tin cậy, bao gồm cả WiFi công cộng.

Mã hóa của WireGuard dựa trên khóa công khai và khóa riêng để các đối tác thiết lập các kênh được mã hóa giữa họ. Mỗi phiên bản WireGuard sử dụng một bộ phương pháp mật mã hiện đại cố định, giúp giữ cho giao thức đơn giản và dễ dự đoán. Thiết kế này tránh việc thương lượng trong thời gian chạy và giảm nguy cơ lỗi cấu hình.

So với đó, các phần mềm VPN khác như OpenVPN và IPsec dựa vào Bảo mật lớp Giao vận (Transport Layer Security) và các chứng chỉ để xác thực và thiết lập các kênh truyền được mã hóa. Trong khi cách tiếp cận này mang lại sự linh hoạt và hỗ trợ nhiều loại khách hàng, nó cũng làm tăng độ phức tạp trong cấu hình và khiến hành vi vận hành khó lý giải hơn.

Trong hướng dẫn này, bạn sẽ thiết lập WireGuard trên một máy chủ Ubuntu và cấu hình một máy khác để kết nối với nó như một nút ngang hàng sử dụng cả IPv4 và IPv6, thường được gọi là cấu hình dual-stack. Bạn cũng sẽ học cách định tuyến lưu lượng của nút ngang hàng qua máy chủ WireGuard trong một thiết lập cổng, cũng như cách sử dụng VPN để giao tiếp ngang hàng được mã hóa.

Ngoài cài đặt cơ bản, hướng dẫn này còn đề cập đến các chủ đề thực tiễn quan trọng cho triển khai thực tế. Những chủ đề này bao gồm hiểu kiến trúc ngang hàng của WireGuard, quản lý và thay đổi khóa, xử lý đúng IPv6 và định tuyến hai ngăn xếp, cải thiện độ tin cậy cho các peer phía sau NAT, tối ưu hiệu suất, và hiểu cách WireGuard so sánh với OpenVPN về các giao thức truyền tải và hành vi tường lửa.

Cho mục đích của hướng dẫn này, một hệ thống Ubuntu khác được sử dụng làm Peer WireGuard. Các hướng dẫn sau trong loạt bài này sẽ đề cập đến việc cài đặt và sử dụng WireGuard trên Windows, macOS, Android và iOS.

Triển khai các ứng dụng frontend của bạn từ GitHub bằng Nền tảng Ứng dụng Linux-Console.net. Hãy để Linux-Console.net tập trung vào việc mở rộng ứng dụng của bạn.

Lưu ý: Nếu bạn định cài đặt WireGuard trên một Droplet của Linux-Console.net, hãy 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í đối với lưu lượng vượt quá. Vì lý do này, hãy chú ý đến lượng lưu lượng mà máy chủ của bạn đang xử lý. Xem trang Thanh toán Lưu lượng của chúng tôi để biết thêm thông tin.

Điểm chính:

  • WireGuard là một VPN nhẹ sử dụng mật mã hiện đại với thiết kế đơn giản dựa trên cặp khóa công khai và khóa riêng, giúp giảm độ phức tạp và lỗi khi cấu hình.
  • WireGuard theo kiến trúc ngang hàng, nơi tất cả các hệ thống chạy cùng phần mềm, và các thuật ngữ máy chủ và nút chỉ mô tả cấu trúc mạng, không phải các vai trò hay khả năng khác nhau.
  • Tất cả các hành vi mã hóa, xác thực và định tuyến trong WireGuard đều được định nghĩa rõ ràng trong các tệp cấu hình, không có plane điều khiển, cơ quan cấp chứng chỉ hay thương lượng thời gian chạy.
  • Cài đặt AllowedIPs phục vụ hai mục đích: nó kiểm soát luồng dữ liệu nào được định tuyến qua kênh và đóng vai trò như một danh sách kiểm soát truy cập nghiêm ngặt cho lưu lượng đi vào từ các peer.
  • WireGuard hỗ trợ cả IPv4 và IPv6 một cách bình đẳng, và các cấu hình dual-stack yêu cầu cẩn thận trong việc thiết lập định tuyến, quy tắc tường lửa và các thiết lập chuyển tiếp cho từng giao thức.
  • Khi sử dụng WireGuard làm cổng VPN, cần cấu hình chuyển tiếp IP và giả mạo tường lửa trên máy chủ để cho phép lưu lượng peer đi đến các mạng bên ngoài.
  • Công cụ hỗ trợ wg-quick tự động tạo lộ trình, quy tắc tường lửa và cấu hình giao diện, trong khi mô-đun kernel WireGuard chỉ tập trung vào việc mã hoá và giải mã các gói dữ liệu.
  • Rò rỉ IPv6 có thể xảy ra trong các thiết lập song song nếu các tuyến IPv6 như ::/0 không được bao gồm rõ ràng, khiến lưu lượng IPv6 đi qua ngoài VPN ngay cả khi lưu lượng IPv4 được định tuyến qua VPN đúng cách.
  • WireGuard không tự động thay đổi các tuyến hệ thống, cài đặt DNS hoặc quy tắc tường lửa, vì vậy các công cụ như wg-quick hoặc cấu hình thủ công là cần thiết để quản lý định tuyến và hành vi mạng.
  • Triển khai WireGuard đa giao thức yêu cầu cấu hình riêng biệt việc chuyển tiếp IPv4 và IPv6, các quy tắc tường lửa và hỗ trợ ICMPv6, vì hệ điều hành xử lý từng giao thức một cách độc lập.

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

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

  • Một máy chủ Ubuntu với người dùng không phải root có quyền sudo và tường lửa được bật. Để thiết lập điều này, bạn có thể theo hướng dẫn Khởi tạo Máy chủ với Ubuntu của chúng tôi. Chúng tôi sẽ gọi đây là Máy chủ WireGuard trong suốt hướng dẫn này.

  • Bạn sẽ cần một máy khách mà bạn sẽ sử dụng để kết nối với Máy chủ WireGuard của mình. Trong hướng dẫn này, chúng tôi sẽ gọi máy này là WireGuard Peer. Cho mục đích của hướng dẫn này, khuyến nghị bạ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 các máy chủ từ xa hoặc điện thoại di động làm máy khách nếu muốn. Nếu bạn đang sử dụng hệ thống từ xa, hãy chắc chắn làm theo tất cả các phần tùy chọn sau trong hướng dẫn này, nếu không bạn có thể sẽ tự khóa mình ra khỏi hệ thống.

  • Để sử dụng WireGuard với IPv6, bạn cũng sẽ cần đảm bảo rằng máy chủ của bạn được cấu hình để hỗ trợ loại lưu lượng này. Nếu bạn muốn kích hoạt hỗ trợ IPv6 với WireGuard và đang sử dụng Droplet của Linux-Console.net, vui lòng tham khảo trang tài liệu này: Cách bật IPv6 trên Droplets. 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 đó.

Tổng quan về Kiến trúc WireGuard

Trước khi cấu hình WireGuard, hữu ích khi hiểu cách các hệ thống, các điểm nối (peers) và lưu lượng mạng tương tác với nhau. WireGuard sử dụng một kiến trúc đơn giản cố ý, tránh các bảng điều khiển, cơ quan cấp chứng chỉ và việc đàm phán các tham số cấu hình trong thời gian chạy. Tất cả các hành vi mã hóa, xác thực và định tuyến được xác định rõ ràng thông qua các tệp cấu hình.

Thuật ngữ về Thiết kế và Kiến trúc Mạng ngang hàng

WireGuard về cơ bản là một giao thức ngang hàng. Cùng một phần mềm và mô-đun kernel WireGuard chạy trên tất cả các hệ thống tham gia, và không có tệp nhị phân riêng biệt cho máy chủ hay máy khách.

Trong hướng dẫn này, thuật ngữ Máy chủ WireGuard ám chỉ một trung tâm trong mô hình mạng hình bánh xe. Hệ thống này có thể truy cập công khai và hoạt động như điểm điều phối cho các thiết bị khác. Thuật ngữ Thiết bị WireGuard ám chỉ các thiết bị kết nối với trung tâm này. Những thuật ngữ này mô tả cấu trúc mạng được sử dụng trong hướng dẫn này, không phải là các vai trò hay khả năng khác nhau của phần mềm.

Hiểu được sự khác biệt này là quan trọng vì WireGuard không có các tùy chọn cấu hình chỉ dành cho máy chủ. Bất kỳ hệ thống nào cũng có thể hoạt động như một trung tâm, một nhánh, hoặc cả hai, hoàn toàn phụ thuộc vào cách mà khóa, địa chỉ và các quy tắc định tuyến được xác định.

Các Thành Phần Cốt Lõi trong Triển Khai WireGuard

Một triển khai WireGuard bao gồm một số lượng nhỏ các thành phần được xác định rõ ràng, mỗi thành phần có một trách nhiệm cụ thể.

  • Peer Trung tâm (Hub): Peer trung tâm là một hệ thống có thể truy cập công khai và lắng nghe lưu lượng UDP được mã hóa trên một cổng duy nhất. Nó lưu trữ một giao diện đường hầm ảo, thường được đặt tên là wg0, và lưu các khóa công khai của các peer khác được phép giao tiếp với nó. Hub không tự động phát hiện các peer hoặc chấp nhận kết nối một cách ngầm định. Lưu lượng chỉ được chấp nhận từ các peer có khóa công khai và phạm vi IP được phép được cấu hình rõ ràng.

  • Kết nối các nút ngang hàng (Spokes): Các nút ngang hàng kết nối là các thiết bị thiết lập các kênh mã hóa tới nút trung tâm. Những thiết bị này có thể là laptop, máy chủ, máy ảo hoặc hệ thống di động. Mỗi nút ngang hàng có một cặp khóa mã hóa duy nhất và một hoặc nhiều địa chỉ IP riêng được gán cho giao diện kênh của nó. Một nút ngang hàng chỉ gửi lưu lượng vào kênh khi các quy tắc định tuyến yêu cầu làm như vậy.

  • Giao diện Tunnel (wg0): Giao diện tunnel là một thiết bị mạng ảo được tạo trên mỗi hệ thống tham gia. Tất cả lưu lượng được mã hóa đều đi vào và ra qua giao diện này. Theo quan điểm của hệ điều hành, wg0 hoạt động giống như một giao diện mạng tiêu chuẩn, cho phép các bảng định tuyến, quy tắc tường lửa và hành vi chuyển tiếp thông thường áp dụng.

Mã hóa, Xác thực và Bắt tay

WireGuard sử dụng mật mã khóa công khai để xác thực các bên và mã hóa lưu lượng. Mỗi bên sẽ tạo một khóa riêng dài hạn, được giữ trên hệ thống cục bộ và không bao giờ được truyền đi. Khóa công khai tương ứng được chia sẻ với các bên khác và thêm vào cấu hình của họ.

Khi bắt đầu giao tiếp, WireGuard thực hiện một quá trình bắt tay mật mã im lặng và tự động dựa trên khung giao thức Noise. Quá trình bắt tay này thiết lập các khóa phiên tạm thời và cung cấp Bảo Mật Tiến Triển Hoàn Hảo. Các khóa phiên này được thay đổi định kỳ mà không cần sự can thiệp của người dùng.

WireGuard không thương lượng bộ mã hóa, phương thức xác thực hoặc phiên bản giao thức. Tất cả các nguyên lý mật mã đều được cố định theo thiết kế. Điều này loại bỏ hoàn toàn một lớp các lỗi cấu hình trong khi vẫn cung cấp các đảm bảo an ninh hiện đại.

Các Mô Hình Dòng Lưu Lượng Hỗ Trợ

WireGuard hỗ trợ nhiều kiểu lưu lượng khác nhau tùy thuộc vào cách định tuyến và chuyển tiếp được cấu hình. Hướng dẫn này tập trung vào hai trường hợp sử dụng phổ biến nhất.

Truy cập mạng ngang hàng hoặc mạng nội bộ

Trong cấu hình truy cập ngang hàng hoặc truy cập nội bộ, lưu lượng chỉ được mã hóa giữa các hệ thống là một phần của VPN. Điểm cuối trung tâm hoạt động như một điểm kết nối an toàn hoặc bộ trung chuyển, nhưng nó không chuyển tiếp lưu lượng đến các mạng bên ngoài.

Cấu hình này thường được sử dụng để truy cập các dịch vụ riêng tư, quản lý hạ tầng, hoặc kết nối các hệ thống bị cô lập. Lưu lượng chỉ được định tuyến vào đường hầm khi địa chỉ đích khớp với các dải IP riêng được định nghĩa trong cấu hình của đối tác.

Chế độ Cổng VPN

Ở chế độ cổng, peer trung tâm chuyển tiếp lưu lượng từ các peer khác ra các mạng bên ngoài, bao gồm cả Internet công cộng. Các peer gửi một phần hoặc toàn bộ lưu lượng của họ vào đường hầm, và peer trung tâm định tuyến lưu lượng đó tiếp tục thông qua chuyển tiếp IP và dịch địa chỉ mạng.

Cấu hình này yêu cầu các thiết lập hệ thống bổ sung, bao gồm chuyển tiếp kernel và các quy tắc tường lửa. Khi chế độ cổng được bật, lưu lượng đi ra từ các peer sẽ xuất hiện như thể bắt nguồn từ địa chỉ IP công khai của peer trung tâm.

Vai trò kép của AllowedIPs

Chỉ thị AllowedIPs phục vụ hai mục đích khác nhau trong WireGuard.

Đầu tiên, nó xác định hành vi định tuyến outbound. Khi địa chỉ đích của gói tin khớp với một mục trong AllowedIPs, gói tin đó sẽ được định tuyến qua kênh WireGuard.

Thứ hai, AllowedIPs hoạt động như một danh sách kiểm soát truy cập nghiêm ngặt cho luồng vào. Khi nhận một gói tin từ một peer, WireGuard sẽ kiểm tra địa chỉ IP nguồn của gói. Nếu địa chỉ nguồn không có trong AllowedIPs của peer đó, gói tin sẽ bị loại bỏ ngay lập tức.

Vai trò kép này là có chủ đích và là một trong những nguyên nhân phổ biến nhất gây ra lỗi cấu hình. Chỉ định tuyến đúng thôi là chưa đủ. Các địa chỉ IP nguồn mà một peer được phép sử dụng cũng phải được cho phép rõ ràng.

Tự động hóa định tuyến và công cụ hỗ trợ

Chính mô-đun kernel WireGuard không sửa đổi các tuyến hệ thống, cài đặt DNS hoặc quy tắc tường lửa. Nó chỉ mã hóa và giải mã các gói dữ liệu và liên kết chúng với các nút kết nối.

Tự động hóa định tuyến được xử lý bởi các công cụ hỗ trợ như wg-quick. Tiện ích này đọc tập tin cấu hình WireGuard và áp dụng các mục trong bảng định tuyến, cài đặt DNS và quy tắc tường lửa cần thiết khi một kênh kết nối được bật hoặc tắt.

Nếu WireGuard được cấu hình bằng các công cụ thay thế như lệnh wg thô, systemd-networkd hoặc các tập lệnh tùy chỉnh, các thay đổi định tuyến này phải được quản lý thủ công.

Việc tách biệt này giữ cho giao thức cốt lõi đơn giản trong khi vẫn cho phép tích hợp linh hoạt với các ngăn xếp mạng hệ thống khác nhau.

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 Máy chủ WireGuard và cài đặt WireGuard bằng cách sử dụng các lệnh sau. Bạn có thể được yêu cầu nhập mật khẩu người dùng sudo nếu đây là lần đầu tiên bạn sử dụng sudo trong phiên làm việc này:

sudo apt update

sudo apt install wireguard

Bây giờ bạn đã cài đặt WireGuard, bước tiếp theo là tạo một cặp khóa riêng và công khai cho máy chủ. Bạn sẽ sử dụng các lệnh wg genkey và wg pubkey tích hợp để 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 cho khóa mà bạn vừa tạo bằng lệnh chmod, vì theo mặc định, tệp 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 của nó 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ẽ xóa mọi quyền trên tệp đối với người dùng và nhóm ngoài người dùng root để đảm bảo rằng chỉ root mới có thể truy cập khóa riêng.

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

Bước tiếp theo là tạo khóa công khai tương ứng, được suy ra từ khóa riêng. Sử dụng lệnh sau để tạo tệp 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 lẻ được nối với nhau bằng toán tử | (pipe):

  • sudo cat /etc/wireguard/private.key: lệnh này đọc tệp khóa riêng và xuất nó ra luồng đầu ra tiêu chuẩn.
  • wg pubkey: lệnh thứ hai nhận đầu ra từ lệnh đầu tiên làm đầu vào chuẩn và xử lý nó để tạo ra một khóa công khai.
  • sudo tee /etc/wireguard/public.key: lệnh cuối cùng này lấy đầu ra của lệnh tạo khóa công khai và chuyển hướng nó vào tệp có tên /etc/wireguard/public.key.

Khi bạn chạy lệnh, bạn sẽ nhận được một dòng duy nhất chứa kết quả được mã hóa base64, đó là khóa công khai cho Máy chủ WireGuard của bạn. Hãy sao chép nó vào đâu đó để tham khảo, vì bạn sẽ cần phân phối khóa công khai này cho bất kỳ thiết bị nào kết nối với máy chủ.

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

Trong phần trước, bạn đã cài đặt WireGuard và tạo một cặp khóa sẽ được sử dụng để mã hóa lưu lượng đi và đến 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 để khởi động tự động khi máy chủ của bạn khởi động lại. Bạn cũng sẽ xác định các địa chỉ IPv4 và IPv6 riêng để sử dụng với Máy chủ WireGuard và các peer của bạn.

Nếu bạn dự định sử dụng cả địa chỉ IPv4 và IPv6, hãy làm theo cả hai phần nà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 của VPN của bạn.

Bước 2(a) — Chọn phạm vi IPv4

Nếu bạn đang sử dụng máy chủ WireGuard với các peer IPv4, máy chủ cần một dải địa chỉ IPv4 riêng để sử dụng cho các khách hàng và cho giao diện tunnel của nó. Bạn có thể chọn bất kỳ dải địa chỉ IP nào từ các khối địa chỉ đã được bảo lưu 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 tham khảo đặ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)

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

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

Bước 2(b) — Chọn phạm vi IPv6

Nếu bạn đang sử dụng WireGuard với IPv6, thì 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 liên kết với một giao diện đường hầm ảo. Bạn sẽ cần thực hiện một vài bước để tạo ra một tiền tố IPv6 ngẫu nhiên, duy nhất trong khối fd00::/8 dành riêng cho địa chỉ IPv6 riêng.

Theo RFC, cách được khuyến nghị để có được một tiền tố IPv6 duy nhất là kết hợp thời gian trong ngày với một giá trị định danh duy nhất từ hệ thống như số sê-ri hoặc ID thiết bị. Những giá trị này sau đó được băm và rút gọn, tạo ra một tập hợp các bit có thể được sử dụng như một địa chỉ duy nhất trong khối IP riêng tư fd00::/8 đã được dành riêng.

Để bắt đầu tạo một dải IPv6 cho Máy chủ WireGuard của bạn, hãy thu thập dấu thời gian 64 bit bằng cách sử dụng tiện ích date với lệnh sau:

date +%s%N

Bạn sẽ nhận được một con số như sau, đây là số giây (theo %s trong lệnh date) và nanô giây (theo %N) kể từ 1970-01-01 00:00:00 UTC kết hợp lại với nhau:

1628101352127592197

Ghi lại giá trị ở đâu đó để sử dụng sau trong phần này. Tiếp theo, sao chép giá trị machine-id của máy chủ của bạn từ tệp /var/lib/dbus/machine-id. Định danh này là duy nhất cho hệ thống của bạn và không nên thay đổi miễn là máy chủ vẫn tồn tại.

cat /var/lib/dbus/machine-id

Bạn sẽ nhận được kết quả như sau:

/var/lib/dbus/machine-id
20086c25853947c7aeee2ca1ea849d7d

Bây giờ bạn cần kết hợp dấu thời gian với machine-id và băm giá trị kết quả 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 thay thế bằng giá trị dấu thời gian và định danh máy của bạn:

printf 162810135212759219720086c25853947c7aeee2ca1ea849d7d | sha1sum

Bạn sẽ nhận được một giá trị băm như sau:

4f267c51857d6dc93a0bca107bca2f0d86fac3bc  -

Lưu ý rằng đầu ra của lệnh sha1sum ở dạng thập lục phân, vì vậy đầu ra sử dụng hai ký tự để biểu diễn một byte dữ liệu. Ví dụ, 4f và 26 trong đầu ra ví dụ 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 cùng), hoặc 5 byte, của kết quả băm. Sử dụng lệnh cut để in 5 byte cuối được mã hóa bằng hệ thập lục phân từ giá trị băm:

printf 4f267c51857d6dc93a0bca107bca2f0d86fac3bc | cut -c 31-

Tham số -c yêu cầu lệnh cut chỉ chọn một tập ký tự được chỉ định. Tham số 31- yêu cầu cut in tất cả các ký tự từ vị trí 31 đến cuối dòng dữ liệu đầu vào.

Bạn nên nhận được kết quả như sau:

0d86fac3bc

Trong ví dụ đầu ra này, tập hợp các byte là: 0d 86 fa c3 bc.

Bây giờ bạn có thể tạo tiền tố mạng IPv6 độc nhất của mình bằng cách thêm 5 byte mà bạn đã tạo vào tiền tố fd, tách mỗi 2 byte bằng dấu : để dễ đọc. Vì mỗi phân mạng trong tiền tố độc nhất của bạn có thể chứa tổng cộng 18.446.744.073.709.551.616 địa chỉ IPv6, bạn có thể giới hạn phân mạng ở kích thước chuẩn /64 để đơn giản hóa.

Sử dụng các byte đã được tạo trước đó với kích thước mạng con /64, tiền tố kết quả sẽ như sau:

Unique Local IPv6 Address Prefix
fd0d:86fa:c3bc::/64

Phạm vi fd0d:86fa:c3bc::/64 này là phạm vi bạn sẽ sử dụng để gán địa chỉ IP riêng cho các giao diện WireGuard tunnel trên máy chủ và các thiết bị bạn kết nối. Để cấp một IP cho máy chủ, thêm 1 sau các ký tự :: cuối cùng. Địa chỉ kết quả sẽ là fd0d:86fa:c3bc::1/64. Các thiết bị kết nối có thể sử dụng bất kỳ IP nào trong phạm vi này, nhưng thường bạn sẽ tăng giá trị lên một mỗi khi thêm một thiết bị ví dụ fd0d:86fa:c3bc::2/64. Hãy ghi chú lại IP này và tiếp tục cấu hình Máy chủ WireGuard trong phần tiếp theo của hướng dẫn này.

Các yếu tố cần cân nhắc trong cấu hình IPv6 và Dual-Stack

Các bước hiện có trong hướng dẫn này giải thích cách tạo địa chỉ IPv6 và gán chúng cho các giao diện WireGuard. Tuy nhiên, hành vi của IPv6 trong WireGuard khác với IPv4 ở một số điểm quan trọng, đặc biệt khi WireGuard được sử dụng như một cổng VPN. Hiểu những khác biệt này giúp ngăn chặn lỗi định tuyến, tunneling một phần và rò rỉ IPv6 phổ biến.

Hỗ trợ IPv6 trong WireGuard

WireGuard hỗ trợ IPv6 như một giao thức chính thức. Lưu lượng IPv6 được mã hóa, xác thực và định tuyến sử dụng cùng cơ chế với lưu lượng IPv4. Không có chế độ IPv6 riêng biệt hay cờ cấu hình bổ sung. Nếu địa chỉ IPv6 được gán cho giao diện tunnel và các quy tắc định tuyến cho phép, lưu lượng IPv6 sẽ đi qua tunnel một cách tự động.

Không giống như IPv4, IPv6 được thiết kế để tránh NAT bằng cách sử dụng địa chỉ có thể định tuyến toàn cầu, nhưng trong thực tế nhiều môi trường VPN và điện toán đám mây vẫn sử dụng NAT để đơn giản hóa vận hành. Tuy nhiên, hành vi này phụ thuộc vào môi trường mạng. Trong nhiều thiết lập cổng VPN, chẳng hạn như các instance VPS trên đám mây hoặc bộ định tuyến gia đình, máy chủ không nhận được tiền tố IPv6 được phân quyền có thể định tuyến đến các peer VPN.

Trong những kịch bản phổ biến này, các thiết bị ngang hàng được gán địa chỉ IPv6 riêng, thường từ một dải Địa chỉ Cục bộ Độc nhất (ULA). Khi sử dụng địa chỉ IPv6 riêng và máy chủ không có tiền tố có thể định tuyến cho chúng, việc giả mạo IPv6 vẫn được yêu cầu. Điều này thường được thực hiện bằng các quy tắc ip6tables -t nat, tương tự như giả mạo IPv4, để cho phép các thiết bị ngang hàng VPN truy cập Internet công cộng.

IPv6 có thể hoàn toàn tránh NAT khi có phân bổ tiền tố thích hợp. Tuy nhiên, hầu hết các triển khai cổng VPN đơn giản vẫn dựa vào việc ẩn danh IPv6 để giữ cho việc định tuyến dễ quản lý.

Giải thích hành vi Dual-Stack

Cấu hình hai ngăn xếp cho phép cả IPv4 và IPv6 trên cùng giao diện WireGuard. Trong thiết lập này, giao diện wg0 được cấp một địa chỉ IPv4 và một địa chỉ IPv6, và mỗi giao thức được định tuyến độc lập.

Hệ điều hành đánh giá các tuyến IPv4 và IPv6 một cách riêng biệt. Một nút kết nối có thể định tuyến lưu lượng IPv4 thành công qua đường hầm trong khi lưu lượng IPv6 bỏ qua nó, hoặc ngược lại. Hành vi này là điều bình thường và hầu như luôn cho thấy vấn đề về cấu hình hơn là lỗi từ chính WireGuard.

Để định tuyến dual-stack hoạt động chính xác, cần phải đáp ứng một số điều kiện. Cả máy chủ và máy khách đều phải có địa chỉ IPv4 và IPv6 được gán cho các giao diện WireGuard của họ. Chỉ thị AllowedIPs phải bao gồm cả dải IPv4 và IPv6. Chuyển tiếp IP phải được bật riêng cho IPv4 và IPv6. Các quy tắc tường lửa phải cho phép chuyển tiếp và lưu lượng trả về cho cả hai giao thức.

Phân công địa chỉ và chiều dài tiền tố

Đối với IPv4, các triển khai WireGuard thường sử dụng các dải địa chỉ riêng tư như 10.0.0.0/8 hoặc 192.168.0.0/16. Mỗi nút thường được cấp một địa chỉ IPv4 duy nhất.

Đối với IPv6, thường định nghĩa mạng VPN là một tiền tố /64, chẳng hạn như fd00::/64. Trong khi các mạng Ethernet yêu cầu /64 để khám phá các nút lân cận và tự động cấu hình địa chỉ, WireGuard hoạt động như một giao diện điểm-điểm Lớp 3 và không sử dụng các cơ chế này.

Vì lý do này, việc gán cho mỗi peer một địa chỉ IPv6 /128, chẳng hạn như fd00::2/128, là an toàn và thường được khuyến nghị. Sử dụng địa chỉ /128 đảm bảo hành vi định tuyến nghiêm ngặt và ngăn các peer cố gắng giao tiếp trực tiếp với các địa chỉ khác trong subnet mà không có quy tắc định tuyến phù hợp.

Định nghĩa mạng là /64 trong khi gán cho các peer địa chỉ /128 giúp tạo sự rõ ràng và tránh định tuyến mơ hồ.

Định tuyến toàn bộ lưu lượng với IPv6

Khi WireGuard được cấu hình như một cổng VPN, lưu lượng IPv6 phải được định tuyến rõ ràng giống như lưu lượng IPv4.

Đối với IPv4, định tuyến tất cả lưu lượng sử dụng tiền tố 0.0.0.0/0. Đối với IPv6, tiền tố tương đương là ::/0. Cả hai tiền tố đều phải được bao gồm nếu mục tiêu là định tuyến tất cả lưu lượng qua VPN.

Nếu chỉ 0.0.0.0/0 được cấu hình, lưu lượng IPv4 sẽ được gửi qua VPN trong khi lưu lượng IPv6 vẫn sử dụng giao diện mạng cục bộ. Tình huống này được gọi là rò rỉ IPv6. Nó thường dẫn đến các truy vấn DNS, lưu lượng web hoặc kết nối ứng dụng đi ngoài VPN qua IPv6 trong khi lưu lượng IPv4 vẫn được bảo vệ.

Rò rỉ IPv6 thường gây nhầm lẫn và luôn cần được kiểm tra khi bật mạng hai giao thức (dual-stack).

Tường lửa, Chuyển tiếp và ICMPv6

Chuyển tiếp IPv6 phải được bật độc lập với chuyển tiếp IPv4. Bật cái này không tự động bật cái kia. Cả hai cài đặt đều cần thiết khi định tuyến lưu lượng giữa các giao diện.

Các quy tắc tường lửa cũng phải được định nghĩa rõ ràng cho IPv6. Các công cụ như ufw, iptables và nftables coi IPv4 và IPv6 là các bộ quy tắc riêng biệt. Việc thiếu các quy tắc IPv6 có thể âm thầm chặn lưu lượng ngay cả khi kết nối IPv4 hoạt động bình thường.

Việc cho phép lưu lượng ICMPv6 đặc biệt quan trọng. Khác với IPv4, IPv6 phụ thuộc vào ICMPv6 cho các chức năng thiết yếu như Phát hiện MTU đường đi (Path MTU Discovery). Nếu ICMPv6 bị chặn, các kết nối có thể bị treo hoặc thất bại khi truyền các gói dữ liệu lớn, mặc dù các gói nhỏ dường như vẫn hoạt động bình thường.

Những vấn đề thường gặp với Dual-Stack

Một số vấn đề thường gặp trong việc triển khai WireGuard dual-stack. Các tuyến IPv6 có thể bị thiếu trong chỉ thị AllowedIPs, khiến lưu lượng IPv6 bỏ qua đường hầm. Chuyển tiếp IPv6 có thể không được bật trên máy chủ, ngăn lưu lượng ra khỏi giao diện đường hầm. Quy tắc tường lửa có thể cho phép lưu lượng IPv4 nhưng chặn lưu lượng IPv6 hoặc ICMPv6. Các máy phân giải DNS có thể trả về địa chỉ IPv6 mặc dù định tuyến IPv6 chưa được cấu hình đúng.

Những vấn đề này thường xuất hiện dưới dạng các sự cố gián đoạn và thường bị chẩn đoán nhầm là sự cố ứng dụng hoặc giao thức.

Lựa chọn giữa IPv4 chỉ, IPv6 chỉ và Dual-Stack

Trong một số môi trường, việc sử dụng một giao thức duy nhất giúp đơn giản hóa các hoạt động.

Việc triển khai chỉ IPv4 dễ tích hợp với các hệ thống và công cụ cũ. Việc triển khai chỉ IPv6 loại bỏ nhu cầu NAT IPv4 và tránh khan hiếm địa chỉ, nhưng chúng đòi hỏi nhà cung cấp và mạng khách hàng phải hỗ trợ IPv6 một cách nhất quán.

Triển khai hai ngăn xếp mang lại sự linh hoạt lớn nhất nhưng cũng đòi hỏi lập kế hoạch, cấu hình và kiểm tra cẩn thận nhất.

Bước 3 — Tạo Cấu hình Máy chủ WireGuard

Trước khi tạo cấu hình cho Máy chủ WireGuard của bạn, bạn sẽ cần những thông tin sau:

  • Hãy chắc chắn rằng bạn đã có khóa riêng từ Cài đặt WireGuard và Tạo cặp khóa.
  • Nếu bạn đang sử dụng WireGuard với IPv4, bạn sẽ cần địa chỉ IP mà bạn đã chọn cho máy chủ trong Chọn phạm vi IPv4, trong ví dụ này là 10.8.0.1/24.
  • Nếu bạn đang sử dụng WireGuard với IPv6, bạn sẽ cần địa chỉ IP của máy chủ mà bạn đã tạo trong Chọn một dải IPv6. Trong ví dụ này, địa chỉ IP là fd0d:86fa:c3bc::1/64.

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

sudo nano /etc/wireguard/wg0.conf

Thêm các dòng sau vào tệp, thay thế khóa riêng của bạn thay cho giá trị base64_encoded_private_key_goes_here được tô sáng, và địa chỉ IP trên dòng Address. Bạn cũng có thể thay đổi dòng ListenPort nếu muốn WireGuard có thể truy cập qua một cổng khác:

/etc/wireguard/wg0.conf
[Interface] PrivateKey = base64_encoded_private_key_goes_here Address = 10.8.0.1/24, fd0d:86fa:c3bc::1/64 ListenPort = 51820 SaveConfig = true

Dòng SaveConfig đảm bảo rằng khi một giao diện WireGuard bị tắt, bất kỳ thay đổi nào cũng sẽ được lưu vào tệp cấu hình.

Lưu và đóng tệp /etc/wireguard/wg0.conf. Nếu bạn đang sử dụng nano, bạn có thể làm điều này bằng CTRL+X, sau đó nhấn Y và ENTER để xác nhận. Bây giờ bạn đã có một cấu hình máy chủ ban đầu mà bạn có thể xây dựng thêm tùy thuộc vào cách bạn dự định sử dụng máy chủ VPN WireGuard của mình.

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

Nếu bạn đang sử dụng WireGuard để kết nối một peer với Máy chủ WireGuard nhằm truy cập các dịch vụ chỉ trên máy chủ, thì bạn không cần phải hoàn thành phần này. Nếu bạn muốn định tuyến lưu lượng Internet của Peer WireGuard thông qua Máy chủ WireGuard, thì bạn sẽ cần cấu hình chuyển tiếp IP bằng cách theo phần hướng dẫn này.

Để cấu hình chuyển tiếp, hãy mở tệp /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 tệp:

net.ipv4.ip_forward=1

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

net.ipv6.conf.all.forwarding=1

Nếu bạn đang sử dụng cả IPv4 và IPv6, hãy đảm bảo rằng bạn bao gồm cả hai dòng. Lưu và đóng tệp khi bạn hoàn tất.

Để đọc tệp và tải các giá trị mới cho phiên làm việc terminal hiện tại của bạn, hãy chạy:

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

Bây giờ Máy chủ WireGuard của bạn sẽ có thể chuyển tiếp lưu lượng đến từ thiết bị ethernet VPN ảo đến các thiết bị khác trên máy chủ, và từ đó ra Internet công cộng. Sử dụng cấu hình này sẽ cho phép bạn định tuyến tất cả lưu lượng web từ WireGuard Peer của bạn thông qua địa chỉ IP của máy chủ, và địa chỉ IP công cộng của máy khách sẽ được ẩn đi một cách hiệu quả.

Tuy nhiên, trước khi lưu lượng truy cập có thể được định tuyến qua máy chủ của bạn một cách chính xác, bạn sẽ cần cấu hình một số quy tắc tường lửa. Các quy tắc này sẽ đảm bảo rằng lưu lượng đi tới và từ Máy chủ và Các Peer của WireGuard của bạn diễn ra một cách đúng đắn.

Bước 5 — Cấu hình tường lửa cho máy chủ WireGuard

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 đảm bảo lưu lượng đến và đi từ máy chủ và các khách hàng được định tuyến đúng cách. Giống như phần trước, hãy bỏ qua bước này nếu bạn chỉ sử dụng VPN WireGuard của mình cho kết nối máy với máy để truy cập các tài nguyên bị hạn chế trong VPN của bạn.

Để cho phép lưu lượng WireGuard VPN đi qua tường lửa của Server, bạn sẽ cần bật masquerading, đây là một khái niệm của iptables cung cấp dịch vụ chuyển đổi địa chỉ mạng động (NAT) ngay lập tức để định tuyến đúng các kết nối của khách hàng.

Đầu tiên, tìm giao diện mạng công cộng của Máy chủ WireGuard của bạn bằng cách sử dụng lệnh phụ ip route:

ip route list default

Giao diện công cộng là chuỗi được tìm thấy trong đầu ra của lệnh này đứng sau từ “dev”. Ví dụ, kết quả này hiển thị giao diện có tên eth0, được làm nổi bật dưới đây:

default via 203.0.113.1 dev eth0 proto static

Ghi lại tên thiết bị của bạn vì bạn sẽ thêm nó vào các quy tắc iptables ở bước tiếp theo.

Để thêm các quy tắc tường lửa cho máy chủ WireGuard của bạn, hãy mở lại tệp /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, 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 Máy chủ WireGuard khởi động kênh VPN ảo. Trong ví dụ này, nó sẽ thêm ba quy tắc ufw và iptables:

  • ufw route allow in on wg0 out on eth0: Quy tắc này sẽ cho phép chuyển tiếp lưu lượng IPv4 và IPv6 từ giao diện VPN wg0 đến giao diện mạng eth0 trên máy chủ. Nó hoạt động kết hợp với các giá trị sysctl net.ipv4.ip_forward và net.ipv6.conf.all.forwarding mà bạn đã 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 việc giả mạo (masquerading) và chuyển đổi lưu lượng IPv4 đến trên giao diện VPN wg0 để nó trông giống như xuất phát trực tiếp từ địa chỉ IPv4 công khai của máy chủ WireGuard.
  • ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE: Quy tắc này cấu hình chế độ giả mạo (masquerading), và ghi đè lưu lượng IPv6 đến trên giao diện VPN wg0 để nó có vẻ như xuất phát trực tiếp từ địa chỉ IPv6 công khai của máy chủ WireGuard.

Lưu ý: Việc giả mạo IPv6 yêu cầu kernel hỗ trợ ip6table_nat. Trên một số bản phân phối hoặc hình ảnh đám mây, module này không có sẵn hoặc không được kích hoạt theo mặc định. Trong những trường hợp đó, bạn phải sử dụng định tuyến IPv6 thích hợp với các tiền tố được phân quyền thay vì NAT, và quảng bá một tiền tố IPv6 có thể định tuyến tới các đối tác thay vì sử dụng địa chỉ ULA.

Các quy tắc PreDown sẽ chạy khi Máy chủ WireGuard dừng đường hầm VPN ảo. Các quy tắc này là ngược lại của các quy tắc PostUp, và có chức năng để hoàn tác các quy tắc chuyển tiếp và ngụy trang cho giao diện VPN khi VPN bị dừng.

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

Ngược lại, nếu bạn chỉ sử dụng IPv6, hãy chỉnh sửa cấu hình để chỉ bao gồm các lệnh ip6tables. Các dòng ufw nên tồn tại cho bất kỳ sự kết hợp nào của mạng IPv4 và IPv6. Lưu và đóng tệp khi bạn đã hoàn tất.

Phần cuối cùng của việc cấu hình tường lửa trên Máy chủ WireGuard của bạn là cho phép lưu lượng đi đến và đi từ cổng UDP của WireGuard. Nếu bạn không thay đổi cổng trong tệp /etc/wireguard/wg0.conf của máy chủ, cổng bạn sẽ 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 chắc chắn thay thế nó trong lệnh UFW sau.

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 trước, hãy thêm nó vào đây:

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 của mình, 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 truyền tất cả lưu lượng mạng qua kết nối VPN, bạn sẽ cần đảm bảo rằng lưu lượng cổng 53 được cho phép cho các yêu cầu DNS, và các cổng như 80 và 443 cho lưu lượng HTTP và HTTPS tương ứng. Nếu có các giao thức khác mà bạn đang sử dụng qua VPN, bạn cũng sẽ cần thêm các quy tắc cho chúng.

Sau khi thêm những quy tắc đó, tắt rồi bật lại UFW để khởi động lại và tải 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 các quy tắc đã được thiết lập bằng cách chạy lệnh ufw status. Chạy lệnh này, và bạn sẽ nhận được kết quả như sau:

sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
51820/udp                  ALLOW       Anywhere                  
22/tcp                     ALLOW       Anywhere                  
51820/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à giả lập địa chỉ cho các 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 để lắng nghe kết nối từ các peer.

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

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

Sử dụng dịch vụ systemd có nghĩa là bạn có thể cấu hình WireGuard để khởi động cùng hệ thống, giúp bạn kết nối VPN bất cứ 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 chỉ định tên thiết bị của tunnel wg0 như một phần của tên dịch vụ. Tên này sẽ tương ứng với tệp cấu hình /etc/wireguard/wg0.conf. Cách đặt tên này có nghĩa là bạn có thể tạo bao nhiêu tunnel VPN riêng biệt tùy thích trên máy chủ của mình.

Ví dụ, bạn có thể có một thiết bị tunnel và đặt tên là prod và tệp cấu hình của nó sẽ 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à tường lửa cho client khác nhau. Bằng cách này, 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 của nó.

Bây giờ 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 bằng lệnh sau. Bạn nên thấy dịch vụ được liệt kê là đang hoạt động. Lưu ý rằng wg-quick sẽ thoát sau khi cấu hình giao diện, vì vậy active (exited) là bình thường.

sudo systemctl status wg-quick@wg0.service
● 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 Wed 2021-08-25 15:24:14 UTC; 5s 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: 3245 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS)
   Main PID: 3245 (code=exited, status=0/SUCCESS)

Aug 25 15:24:14 wg0 wg-quick[3245]: [#] wg setconf wg0 /dev/fd/63
Aug 25 15:24:14 wg0 wg-quick[3245]: [#] ip -4 address add 10.8.0.1/24 dev wg0
Aug 25 15:24:14 wg0 wg-quick[3245]: [#] ip -6 address add fd0d:86fa:c3bc::1/64 dev wg0
Aug 25 15:24:14 wg0 wg-quick[3245]: [#] ip link set mtu 1420 up dev wg0
Aug 25 15:24:14 wg0 wg-quick[3245]: [#] ufw route allow in on wg0 out on eth0
Aug 25 15:24:14 wg0 wg-quick[3279]: Rule added
Aug 25 15:24:14 wg0 wg-quick[3279]: Rule added (v6)
Aug 25 15:24:14 wg0 wg-quick[3245]: [#] iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
Aug 25 15:24:14 wg0 wg-quick[3245]: [#] ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
Aug 25 15:24:14 wg0 systemd[1]: Finished WireGuard via wg-quick(8) for wg0.

Đầu ra 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 vào tập tin cấu hình. Bạn có thể sử dụng các quy tắc này để khắc phục sự cố đường hầm, hoặc với chính lệnh wg nếu bạn muốn thử cấu hình thủ công giao diện VPN.

Với việc máy chủ đã được cấu hình và đang chạy, bước tiếp theo là cấu hình máy khách của bạn như một Peer của WireGuard và kết nối với Máy chủ WireGuard.

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

Cấu hình một Peer WireGuard tương tự như thiết lập Server WireGuard. Khi bạn đã cài đặt phần mềm client, bạn sẽ tạo một cặp khóa công khai và riêng tư, chọn một địa chỉ IP hoặc các địa chỉ cho peer, định nghĩa một tệp cấu hình cho peer, và sau đó khởi động đường hầm bằng cách sử dụng script wg-quick.

Bạn có thể thêm bao nhiêu máy ngang hàng tùy ý vào 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 sau. Nếu bạn thêm nhiều máy ngang hàng vào VPN, hãy đảm bảo theo dõi địa chỉ IP riêng của chúng để tránh xung đột.

Để cấu hình Peer WireGuard, 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 Peer WireGuard, hãy chạy:

sudo apt update

sudo apt install wireguard

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

Tiếp theo, bạn sẽ cần tạo cặp khóa trên peer bằng các bước giống như bạn đã thực hiện trên máy chủ. Từ máy cục bộ hoặc máy chủ từ xa sẽ đóng vai trò là peer, tiếp tục và 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 mã hóa base64 duy nhất, đó là khóa riêng tư. Một bản sao của kết quả cũng được lưu trong /etc/wireguard/private.key. Hãy ghi chú cẩn thận khóa riêng tư được xuất ra vì bạn sẽ cần thêm nó vào tệp cấu hình của WireGuard trong phần sau.

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

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

Bạn sẽ nhận lại một dòng duy nhất của đầu ra mã hóa base64, đây là khóa công khai cho Peer WireGuard của bạn. Hãy sao chép nó ở đâu đó để tham khảo, vì bạn sẽ cần phân phối khóa công khai này cho Máy chủ WireGuard để thiết lập kết nối được mã hóa.

Tạo Tệp Cấu Hình Peer của WireGuard

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

Bạn sẽ cần một vài thông tin cho tệp cấu hình:

  • Khóa riêng được mã hóa base64 mà bạn đã tạo trên peer.
  • Các 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à số cổng của Máy chủ WireGuard. Thông thường đây sẽ là địa chỉ IPv4, nhưng nếu máy chủ của bạn có địa chỉ IPv6 và máy khách của bạn có kết nối IPv6 tới internet, bạn có thể sử dụng địa chỉ này thay vì IPv4.

Với tất cả thông tin này, hãy mở một tệp /etc/wireguard/wg0.conf mới 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 tệp, thay thế các dữ liệu khác nhau vào các phần được đánh dấu theo yêu cầu:

/etc/wireguard/wg0.conf
[Interface] PrivateKey = base64_encoded_peer_private_key_goes_here Address = 10.8.0.2/24 Address = fd0d:86fa:c3bc::2/64 [Peer] PublicKey = U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE= AllowedIPs = 10.8.0.0/24, fd0d:86fa:c3bc::/64 Endpoint = 203.0.113.1:51820

Chú ý cách dòng Address đầu tiên sử dụng địa chỉ IPv4 từ mạng con 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 mạng con miễn là nó khác với IP của máy chủ. Tăng địa chỉ lên 1 mỗi lần bạn thêm một peer thường là cách dễ nhất để cấp phát IP.

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

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

Nếu bạn chỉ sử dụng IPv4, thì hãy bỏ qua dải fd0d:86fa:c3bc::/64 phía sau (bao gồm cả dấu ,). Ngược lại, nếu bạn chỉ sử dụng IPv6, thì chỉ bao gồm tiền tố fd0d:86fa:c3bc::/64 và bỏ qua dải IPv4 10.8.0.0/24.

Trong cả hai trường hợp, nếu bạn muốn gửi toàn bộ lưu lượng của đồng nghiệp của mình qua VPN và sử dụng Máy chủ WireGuard như một cổng cho tất cả lưu lượng, thì bạn có thể sử dụng 0.0.0.0/0, đại diện 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 một Peer để định tuyến toàn bộ lưu lượng qua đường hầm

Nếu bạn đã chọn định tuyến tất cả lưu lượng của peer qua tunnel sử dụng các tuyến 0.0.0.0/0 hoặc ::/0 và peer là một hệ thống từ xa, thì bạn sẽ cần thực hiện các bước trong phần này. Nếu peer của bạn là một hệ thống cục bộ thì tốt nhất là bỏ qua phần này.

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

Đầu tiên, bạn sẽ 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ả như sau:

default via 203.0.113.1 dev eth0 proto static

Ghi chú địa chỉ IP được đánh dấu của cổng 203.0.113.1 để sử dụng sau, 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ế nó vào chỗ eth0 trong các lệnh sau.

Tiếp theo, tìm địa chỉ IP công cộng của hệ thống bằng cách kiểm tra thiết bị với lệnh ip address show:

ip -brief address show eth0

Bạn sẽ nhận được kết quả như sau:

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 làm nổi bật (không kèm theo /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 tin /etc/wireguard/wg0.conf của Peer WireGuard bằng nano hoặc trình soạn thảo bạn ưa thích.

sudo nano /etc/wireguard/wg0.conf

Trước dòng [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 sẽ tạo một quy tắc định tuyến tùy chỉnh và thêm một tuyến tùy chỉnh để đảm bảo rằng lưu lượng truy cập công cộng đến hệ thống sử dụng cổng 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 bất kỳ mục định tuyến nào trong bảng số 200 khi địa chỉ IP khớp với địa chỉ 203.0.113.5 công khai 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 bất kỳ lưu lượng nào được xử lý bởi bảng 200 sẽ sử dụng cổng 203.0.113.1 để định tuyến, thay vì sử dụng 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ố bảng 200 là tùy ý khi xây dựng các quy tắc này. Bạn có thể sử dụng một giá trị từ 2 đến 252, hoặc bạn có thể sử dụng một tên tùy chỉnh bằng cách thêm nhãn vào tệp /etc/iproute2/rt_tables và sau đó tham chiếu đến tên thay vì giá trị số.

Để biết thêm thông tin về cách bảng định tuyến hoạt động trong Linux, hãy truy cập mục Bảng định tuyến trong Hướng dẫn Quản trị Mạng Lớp IP với Linux.

Nếu bạn đang định tuyến toàn bộ lưu lượng của peer qua VPN, hãy đảm bảo rằng bạn đã cấu hình đúng các quy tắc sysctl và iptables trên Máy chủ WireGuard trong Điều chỉnh Cấu hình Mạng của Máy chủ WireGuard và Cấu hình Tường lửa của Máy chủ WireGuard.

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

Nếu bạn đang sử dụng Máy chủ WireGuard làm cổng VPN cho toàn bộ lưu lượng của các peer, bạn sẽ cần thêm một dòng vào phần [Interface] để chỉ định các máy chủ DNS. Nếu bạn không thêm cài đặt này, các yêu cầu DNS của bạn có thể không được bảo mật bởi VPN, hoặc chúng có thể bị tiết lộ cho Nhà cung cấp Dịch vụ Internet của bạn hoặc các bên thứ ba khác.

Nếu bạn chỉ sử dụng WireGuard để truy cập các 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.

Để thêm các máy chủ DNS vào cấu hình của peer, trước tiên hãy xác định các máy chủ DNS mà Máy chủ WireGuard của bạn đang sử dụng. 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 khác với ví dụ này:

resolvectl dns eth0

Bạn nên nhận được kết quả như sau:

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

Các đị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ả chúng, hoặc chỉ IPv4 hoặc IPv6 tùy theo nhu cầu của bạn. Hãy ghi chú lại các bộ phân giải mà bạn sẽ sử dụng.

Tiếp theo, bạn sẽ cần thêm các bộ phân giải mà bạn đã chọn vào tệp cấu hình của WireGuard Peer. Quay lại WireGuard Peer, mở tệp /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

Trước dòng [Peer], thêm những điều sau:

DNS = 67.207.67.2 2001:4860:4860::8844

[Peer]
. . .

Một lần nữa, tùy thuộc vào 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 theo nhu cầu của mình.

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

Bạn cũng có thể kiểm tra xem máy bạn đang sử dụng các bộ phân giải đã cấu hình bằng lệnh resolvectl dns giống như bạn đã chạy trên máy chủ. Bạn sẽ nhận được kết quả như sau, hiển thị các bộ phân giải DNS mà bạn đã cấu hình cho đường hầm VPN:

Global: 67.207.67.2 67.207.67.3
. . .

Với tất cả các cài đặt bộ phân giải DNS này đã được thiết lập, bạn giờ đây đã sẵn sàng thêm khóa công khai của peer vào máy chủ, sau đó khởi động kênh WireGuard trên peer.

Bước 8 — Thêm Khóa Công Khai của Peer vào Máy Chủ WireGuard

Trước khi kết nối peer với máy chủ, điều quan trọng là phải thêm khóa công khai của peer vào Máy chủ WireGuard. Bước này đảm bảo rằng bạn sẽ 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 kênh.

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

sudo cat /etc/wireguard/public.key
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,fd0d:86fa:c3bc::2

Lưu ý rằng phần allowed-ips của lệnh nhận danh sách các địa chỉ IPv4 và IPv6, phân tách bằng dấu phẩy. Bạn có thể chỉ định từng địa chỉ IP nếu muốn giới hạn địa chỉ IP mà một peer có thể tự gán, hoặc một dải như trong ví dụ nếu các peer có thể sử dụng bất kỳ địa chỉ IP nào trong phạm vi VPN. Cũng lưu ý rằng không hai peer nào có thể 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 hiện có, bạn có thể chạy lại cùng một lệnh, nhưng thay đổi các địa chỉ IP. Nhiều địa chỉ IP được hỗ trợ. Ví dụ, để thay đổi WireGuard Peer mà bạn vừa thêm để thêm một IP như 10.8.0.100 vào các IP hiện có 10.8.0.2 và fd0d:86fa:c3bc::2, bạn sẽ chạy lệnh sau:

sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,10.8.0.100,fd0d:86fa:c3bc::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:

sudo wg
interface: wg0
 public key: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=
 private key: (hidden)
 listening port: 51820

peer: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
 allowed ips: 10.8.0.2/32, fd0d:86fa:c3bc::/128

Lưu ý cách dòng peer hiển thị khóa công khai của WireGuard Peer, và các địa chỉ IP, hoặc phạm vi địa chỉ mà nó được phép sử dụng để tự gán cho mình một địa chỉ IP.

Bây giờ bạn đã xác định các thông số kết nối của peer 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 Peer WireGuard với Tunnel

Bây giờ khi máy chủ và máy ngang hàng của bạn đều được cấu hình để hỗ trợ lựa chọn IPv4, IPv6, chuyển tiếp gói tin và phân giải DNS, đã đến lúc kết nối máy ngang hàng với đường hầm VPN.

Vì bạn có thể chỉ muốn VPN được bật cho một số trường hợp sử dụng nhất định, chúng ta sẽ 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 tunnel giống như bạn đã làm trên máy chủ, hãy làm theo các bước trong phần Bắt đầu Máy chủ WireGuard thay vì sử dụng lệnh wg-quick.

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

sudo apt install resolvconf

Để bắt đầu đường hầm, chạy lệnh sau trên WireGuard Peer:

sudo wg-quick up wg0

Bạn sẽ nhận được kết quả 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 fd0d:86fa:c3bc::2/64 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] resolvconf -a tun.wg0 -m 0 -x

Hãy chú ý đến các địa chỉ IPv4 và IPv6 được đánh dấu mà bạn đã gán cho đối tác.

Nếu bạn đặt AllowedIPs trên peer thành 0.0.0.0/0 và ::/0 (hoặc sử dụng các phạm vi khác với những phạm vi mà bạn đã chọn cho VPN), thì kết quả của bạn sẽ giống 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 fd0d:86fa:c3bc::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 để ý các tuyến đường được làm nổi bật mà lệnh đã thêm, tương ứng với AllowedIPs trong cấu hình peer.

Bạn có thể kiểm tra trạng thái của đường hầm trên peer bằng lệnh wg:

sudo wg
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, fd0d:86fa:c3bc::/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à bạn sẽ nhận được kết quả tương tự.

Xác minh rằng đối tác của bạn đang sử dụng VPN bằng cách sử dụng các lệnh ip route và ip -6 route. Nếu bạn đang sử dụng VPN làm cổng kết nối cho toàn bộ lưu lượng Internet của mình, hãy kiểm tra giao diện nào sẽ được sử dụng cho lưu lượng hướng tới các máy chủ DNS của CloudFlare là 1.1.1.1 và 2606:4700:4700::1111.

Nếu bạn chỉ sử dụng WireGuard để truy cập các tài nguyên trên VPN, hãy thay bằng một địa chỉ IPv4 hoặc IPv6 hợp lệ như chính cổng vào trong các lệnh này. Ví dụ: 10.8.0.1 hoặc fd0d:86fa:c3bc::1.

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

Lưu ý thiết bị wg0 được sử dụng và đị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
2606:4700:4700::1111 from :: dev wg0 table 51820 src fd0d:86fa:c3bc::2 metric 1024 pref medium

Một lần nữa, hãy lưu ý đến giao diện wg0 và địa chỉ IPv6 fd0d:86fa:c3bc::2 mà bạn đã gán cho peer.

Nếu đồng nghiệp của bạn đã cài 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 đồng nghiệp của bạn đang định tuyến lưu lượng của họ qua VPN.

Khi bạn sẵn sàng ngắt kết nối VPN trên máy ngang hàng, hãy sử dụng lệnh wg-quick:

sudo wg-quick down wg0

Bạn sẽ nhận được kết quả như sau cho thấy rằng đường hầm VPN đã bị tắt:

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

Nếu bạn đặt AllowedIPs trên peer thành 0.0.0.0/0 và ::/0 (hoặc sử dụng các phạm vi khác với những phạm vi mà bạn đã chọn cho VPN), thì kết quả của bạn sẽ giống 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

Để kết nối lại với VPN, hãy chạy lại lệnh wg-quick up wg0 trên thiết bị peer. Nếu bạn muốn hoàn toàn xóa cấu hình của một peer khỏi Máy chủ WireGuard, bạn có thể chạy lệnh sau, nhớ thay thế đúng khóa công khai 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 peer nếu peer đó không còn tồn tại, hoặc nếu các khóa mã hoá của nó bị xâm phạm hoặc thay đổi. Nếu không, tốt hơn là 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 khóa và allowed-ips mỗi lần.

Quản lý và Luân phiên Khóa WireGuard

WireGuard dựa vào các cặp khóa công khai và khóa riêng tĩnh để xác thực và mã hóa. Thiết kế này giảm đáng kể độ phức tạp trong cấu hình, nhưng đồng thời cũng đặt toàn bộ trách nhiệm quản lý khóa lên vai quản trị viên. Đối với các triển khai VPN dài hạn, cơ sở hạ tầng chia sẻ hoặc môi trường có nhiều người dùng, việc quản lý khóa cẩn thận là điều cần thiết để duy trì bảo mật và ổn định vận hành.

Hiểu về các loại khóa WireGuard

Mỗi Peer WireGuard sử dụng hai loại khóa mã hóa.

  • Khóa riêng dài hạn: Một khóa riêng định danh độc nhất cho một nút và phải luôn được giữ bí mật. Khóa này được sử dụng trong quá trình bắt tay mã hóa để xác thực nút và tạo ra các khóa phiên ngắn hạn. Nếu một khóa riêng bị lộ, bất kỳ hệ thống nào giữ khóa đó đều có thể giả mạo nút.

  • Khóa công khai dài hạn: Khóa công khai được tạo ra từ khóa riêng và được chia sẻ với các nút khác. Trên trung tâm, khóa công khai xác định các nút nào được phép giao tiếp và các địa chỉ IP mà chúng được phép sử dụng.

Bên cạnh những khóa dài hạn này, WireGuard tự động tạo các khóa phiên ngắn hạn trong quá trình bắt tay mã hóa. Các khóa phiên này được thay đổi định kỳ và cung cấp Bảo mật Tiên tiến Tuyệt đối mà không cần sự can thiệp của quản trị viên.

Các Thực Hành Quản Lý Khóa Được Khuyến Nghị

Các thực hành sau đây giúp giảm thiểu rủi ro và đơn giản hóa hoạt động thường xuyên:

  • Gán một cặp khóa riêng biệt cho mỗi thiết bị ngang hàng: Mỗi thiết bị nên có cặp khóa riêng tư và khóa công khai riêng. Sử dụng khóa duy nhất cho phép thu hồi quyền truy cập cho một thiết bị mà không ảnh hưởng đến các thiết bị khác. Tái sử dụng khóa trên nhiều hệ thống làm tăng tác động khi bị xâm nhập và làm phức tạp việc kiểm toán.

  • Hạn chế quyền truy cập vào dữ liệu khóa riêng: Các tệp khóa riêng chỉ nên có thể đọc được bởi người dùng root. Trên các hệ thống Linux, điều này thường có nghĩa là thiết lập quyền là 600 sử dụng lệnh như chmod 600 /etc/wireguard/private.key. Việc hạn chế quyền truy cập tệp giúp ngăn ngừa việc tiết lộ tình cờ thông qua sao lưu, nhật ký hoặc người dùng không có quyền.

  • Duy trì danh sách các peer rõ ràng: Lưu giữ một hồ sơ liên kết khóa công khai của từng peer với tên thiết bị, địa chỉ IPv4 và IPv6 được gán, cũng như mục đích sử dụng dự kiến. Việc lưu trữ tài liệu này trở nên ngày càng quan trọng khi số lượng các peer tăng lên và giúp đơn giản hóa việc khắc phục sự cố, kiểm toán và bảo trì định kỳ.

  • Loại bỏ các peer không sử dụng hoặc không hoạt động ngay lập tức: Khi một thiết bị ngừng hoạt động hoặc không còn cần truy cập VPN, hãy xóa khóa công khai của nó khỏi cấu hình peer trung tâm. Việc để lại các khóa không sử dụng sẽ làm tăng bề mặt tấn công và khiến việc xem xét trong tương lai trở nên khó khăn hơn.

Các tình huống cần thay đổi khóa

Việc thay đổi khóa nên được thực hiện trong một số tình huống phổ biến sau:

  • Nghi ngờ hoặc xác nhận lộ khóa chính: Nếu một khóa riêng có thể đã bị sao chép, rò rỉ hoặc truy cập bởi bên không được phép, nó nên được thay đổi ngay lập tức để ngăn chặn việc mạo danh.

  • Thiết bị bị mất hoặc bị đánh cắp: Khi một thiết bị bị mất hoặc bị đánh cắp, việc thay đổi các khóa của nó đảm bảo rằng thiết bị đó không còn có thể kết nối với VPN, ngay cả khi cấu hình gốc được khôi phục.

  • Yêu cầu về bảo mật tổ chức: Một số môi trường yêu cầu thay đổi khóa định kỳ để đáp ứng các chính sách nội bộ hoặc các tiêu chuẩn tuân thủ, ngay cả khi không nghi ngờ có sự xâm phạm.

  • Thay đổi quyền sở hữu hoặc vai trò của thiết bị: Khi một thiết bị được chuyển sang người dùng hoặc mục đích khác, việc thay đổi khóa của nó giúp ngăn chặn truy cập không mong muốn.

An toàn thay đổi khóa của đồng nghiệp

WireGuard ánh xạ địa chỉ IP nội bộ tới các khóa công khai cụ thể bằng cách sử dụng bảng định tuyến khóa mật mã. Vì thiết kế này, cùng một địa chỉ IP nội bộ không thể được gán an toàn cho hai khóa công khai cùng lúc. Do đó, việc thay đổi khóa thường liên quan đến một khoảng gián đoạn ngắn trong kết nối khi cấu hình được cập nhật.

Để xoay khóa của một đồng nghiệp, hãy làm theo quy trình sau:

  1. Tạo một cặp khóa riêng và khóa công khai mới trên nút mạng.
  2. Cập nhật cấu hình của peer trung tâm để thay thế khóa công khai cũ bằng khóa mới trong khi vẫn giữ các giá trị AllowedIPs như cũ. Chưa khởi động lại giao diện.
  3. Cập nhật tệp cấu hình của đối tác để sử dụng khóa riêng mới.
  4. Áp dụng cấu hình đã được cập nhật trên peer trung tâm, ví dụ bằng cách tải lại dịch vụ WireGuard hoặc sử dụng wg syncconf. Vào thời điểm này, peer sẽ tạm thời mất kết nối.
  5. Khởi động lại giao diện WireGuard trên peer để nó bắt đầu sử dụng khóa riêng mới.
  6. Xác nhận rằng một bắt tay mới hoàn tất và lưu lượng dữ liệu di chuyển đúng cách.
  7. Xóa bất kỳ tham chiếu nào còn lại đến khóa cũ nếu chúng vẫn tồn tại.

Cách tiếp cận dựa trên sự thay thế này phản ánh cách WireGuard thực thi định tuyến mã hóa và tránh các cấu hình mơ hồ hoặc mâu thuẫn.

Xoay Khóa trên Peer Trung Tâm

Việc thay đổi khóa riêng của peer trung tâm sẽ ảnh hưởng đến tất cả các peer kết nối. Mỗi cấu hình peer phải được cập nhật với khóa công khai mới trước khi khả năng kết nối có thể được khôi phục.

Bởi vì thay đổi này ảnh hưởng đến tất cả các peer đồng thời, việc thay đổi khóa trung tâm nên được lên kế hoạch cẩn thận và thực hiện trong thời gian bảo trì. Trong thực tế, khóa trung tâm được thay đổi ít thường xuyên hơn so với khóa của các peer.

Quản lý Khóa Chia Sẵn (Tùy chọn)

Ngoài cặp khóa công khai và khóa riêng, WireGuard còn hỗ trợ một Khóa Chia Sẵn (PSK) tùy chọn cho từng peer. PSK thêm một lớp mã hóa đối xứng bổ sung lên trên hệ thống mã hóa hiện có của WireGuard.

Khóa chia sẻ trước thường được sử dụng trong các môi trường có mức độ bảo mật cao như một biện pháp phòng ngừa trước những tiến bộ mật mã trong tương lai. Nếu lưu lượng được mã hóa được ghi lại hôm nay và thuật toán khóa công khai cơ bản bị xâm phạm trong tương lai, PSK vẫn sẽ ngăn chặn việc giải mã các phiên giao dịch trước đó.

Nếu sử dụng PSK, chúng nên được coi là bí mật nhạy cảm và được thay đổi định kỳ. Việc thay đổi PSK tuân theo cùng một quy trình vận hành như việc thay đổi khóa peer và phải được phối hợp ở cả hai bên của kết nối.

Chọn Tần Suất Xoay

WireGuard không áp đặt một lịch trình xoay khóa cố định. Khoảng thời gian xoay khóa phù hợp phụ thuộc vào môi trường.

  • Các đợt triển khai cá nhân hoặc ngắn hạn có thể không cần xoay vòng theo lịch trình.
  • Các môi trường chia sẻ hoặc môi trường sản xuất thường thay đổi khóa mỗi 6 đến 12 tháng.
  • Các môi trường có mức độ bảo mật cao có thể yêu cầu thay đổi thường xuyên hơn dựa trên chính sách.

Việc thay đổi định kỳ giúp giảm rủi ro liên quan đến các thông tin đăng nhập tồn tại lâu dài và giúp triển khai WireGuard phù hợp với các thực hành bảo mật phổ biến.

WireGuard và OpenVPN: Sự khác biệt trong thực tế

WireGuard và OpenVPN đều là những công nghệ VPN được sử dụng rộng rãi, nhưng chúng có cách tiếp cận rất khác nhau về mã hóa, cấu hình và hành vi mạng. Hiểu được những khác biệt này giúp các nhà phát triển chọn giải pháp phù hợp nhất với các hạn chế vận hành của họ.

Cấu hình và Mô hình Vận hành

WireGuard sử dụng mô hình cấu hình tĩnh dựa trên các cặp khóa công khai và riêng tư. Tất cả các điểm nối được định nghĩa rõ ràng, và hành vi định tuyến được kiểm soát thông qua các giá trị cấu hình cố định. Không có kênh điều khiển, cơ quan cấp chứng chỉ, hay đàm phán động các tham số.

OpenVPN dựa vào TLS và chứng chỉ X.509. Nó sử dụng một kênh điều khiển để xác thực khách hàng, thương lượng các cài đặt mã hóa và quản lý các phiên làm việc. Mô hình này cung cấp sự linh hoạt nhưng làm tăng độ phức tạp trong cấu hình và vận hành.

Trên thực tế, các cấu hình WireGuard ngắn gọn hơn, dễ kiểm tra hơn và ít có khả năng bị cấu hình sai tinh vi. Các cấu hình OpenVPN cung cấp nhiều quyền kiểm soát hơn nhưng yêu cầu quản lý cẩn thận để duy trì sự an toàn và nhất quán.

Mật mã học và Thiết kế An ninh

WireGuard sử dụng một tập hợp cố định các phương pháp mã hóa hiện đại. Những lựa chọn này không thể cấu hình. Thiết kế này loại bỏ các cuộc tấn công hạ cấp mã hóa và không cần phải chọn bộ mật mã.

OpenVPN hỗ trợ một loạt các thuật toán mã hóa và phương thức xác thực. Mặc dù sự linh hoạt này cho phép tương thích với các hệ thống cũ, nhưng nó cũng làm tăng nguy cơ cấu hình yếu hoặc không nhất quán.

Cả hai giải pháp đều hỗ trợ Bảo mật Tuyệt đối Khi Chuyển tiếp. WireGuard thực hiện việc xoay khóa tự động thông qua cơ chế bắt tay của nó, trong khi OpenVPN dựa vào hành vi phiên TLS.

Đặc tính hiệu suất

WireGuard được thiết kế để có hiệu suất cao và độ trễ thấp. Nó chạy trong nhân Linux và có cơ sở mã nhỏ, giúp giảm tải và chuyển đổi ngữ cảnh. Trong hầu hết các môi trường, WireGuard mang lại thông lượng cao hơn và độ trễ ổn định hơn với việc tinh chỉnh tối thiểu.

Về mặt lịch sử, OpenVPN chạy trong không gian người dùng và gây thêm chi phí cho việc chuyển ngữ cảnh và xử lý giao thức. Các phiên bản OpenVPN hiện đại hỗ trợ Tắt tải Kênh Dữ liệu Hạt nhân (DCO), điều này cải thiện hiệu suất đáng kể, nhưng tính năng này không phải lúc nào cũng được bật hoặc có sẵn trong các triển khai mặc định.

Ngay cả với DCO, WireGuard thường đạt hiệu suất mạnh mẽ với ít biến cấu hình hơn.

Roaming Mạng và Vượt Tường Lửa

WireGuard xử lý các thay đổi mạng một cách linh hoạt. Nếu địa chỉ IP của một peer thay đổi, chẳng hạn như khi chuyển giữa WiFi và mạng di động, đường hầm vẫn tiếp tục hoạt động mà không cần thương lượng lại.

Tuy nhiên, WireGuard chỉ hoạt động qua UDP. Mặc dù UDP hiệu quả, nhưng đôi khi nó bị chặn trên các mạng WiFi công cộng bị hạn chế, tường lửa doanh nghiệp hoặc mạng của các tổ chức. WireGuard không có cơ chế dự phòng tự nhiên khi lưu lượng UDP bị chặn.

OpenVPN hỗ trợ cả UDP và TCP. Khi UDP không khả dụng, OpenVPN có thể được cấu hình để chạy qua cổng TCP 443, khiến lưu lượng VPN trông giống như lưu lượng HTTPS thông thường. Khả năng này giúp OpenVPN đáng tin cậy hơn trong các môi trường có quy tắc tường lửa nghiêm ngặt hoặc kiểm duyệt.

Đối với người dùng hoạt động sau các mạng bị hạn chế, hỗ trợ TCP thường là yếu tố quyết định trong việc chọn OpenVPN thay vì WireGuard.

Phạm vi và khả năng mở rộng của tính năng

OpenVPN bao gồm các tính năng mà WireGuard cố tình không cung cấp. Những tính năng này bao gồm xác thực dựa trên người dùng, cấp phát địa chỉ động và tích hợp với các hệ thống định danh bên ngoài.

WireGuard tập trung hoàn toàn vào việc tạo đường hầm bảo mật. Các quy trình xác thực, kiểm soát truy cập và cấu hình động phải được xử lý bên ngoài giao thức.

Điều này khiến OpenVPN phù hợp hơn cho các môi trường cần xác thực phức tạp hoặc quản lý người dùng tập trung, trong khi WireGuard thích hợp hơn cho các VPN cấp hạ tầng và truy cập dựa trên các peer.

So sánh tóm tắt

Khía cạnhWireGuardOpenVPN
Giao thức truyền tảiChỉ UDPUDP và TCP
Kiểu cấu hìnhTĩnh, dựa trên khóaĐộng, dựa trên chứng chỉ
Kích thước mã nguồnNhỏLớn
Các tùy chọn mã hóaĐã sửaCó thể cấu hình
Hiệu suấtCaoTrung bình đến cao
Hỗ trợ chuyển vùngTích hợp sẵnHạn chế
Khả năng chống tường lửaBị giới hạn trên các mạng hạn chếMạnh qua TCP 443
Sự phức tạpThấpCao

Lựa chọn giữa WireGuard và OpenVPN

WireGuard rất phù hợp cho các VPN hạ tầng, các kênh kết nối site-to-site, khách hàng di động và các môi trường nơi sự đơn giản, hiệu suất và tính dự đoán được đặt lên hàng đầu.

OpenVPN vẫn là lựa chọn mạnh mẽ cho các môi trường doanh nghiệp cần tunneling dựa trên TCP, xác thực nâng cao hoặc hoạt động ổn định phía sau các tường lửa hạn chế.

Trong nhiều triển khai hiện đại, WireGuard thay thế OpenVPN không phải vì nó có nhiều tính năng hơn, mà vì nó có ít tính năng hơn với cách hoạt động rõ ràng hơn.

Tối ưu hóa và điều chỉnh hiệu suất

WireGuard hoạt động tốt với các cài đặt mặc định của nó, nhưng các điều kiện mạng thực tế có thể ảnh hưởng đến độ tin cậy và thông lượng. Các yếu tố như kích thước gói tin, phạm vi định tuyến, hành vi NAT và phân giải DNS đều ảnh hưởng đến cách mà kênh kết nối hoạt động trong quá trình sử dụng liên tục hoặc gián đoạn.

Hãy cùng xem xét những khu vực điều chỉnh phổ biến nhất và khi nào việc điều chỉnh là thích hợp.

Lựa chọn MTU và Phân mảnh Gói tin

Đơn vị truyền tối đa (MTU) xác định kích thước gói lớn nhất có thể truyền mà không bị phân mảnh. WireGuard mã hóa và đóng gói các gói tin, điều này làm giảm MTU thực tế so với giao diện mạng vật lý.

Theo mặc định, WireGuard sử dụng MTU là 1420. Giá trị này đã tính đến tổng chi phí của header IPv6, UDP và việc đóng gói WireGuard, và hoạt động tốt với hầu hết các mạng dựa trên Ethernet. Một số môi trường yêu cầu MTU nhỏ hơn. Điều này thường gặp trên các mạng di động, kết nối PPPoE và các nền tảng đám mây với các lớp đóng gói bổ sung. Khi MTU quá lớn, các gói tin có thể bị mất hoặc bị phân mảnh. Điều này thường dẫn đến tình trạng kết nối hoạt động tốt với các yêu cầu nhỏ nhưng bị treo hoặc thất bại khi truyền tải lớn hơn. Nếu xuất hiện các triệu chứng này, nên giảm MTU từng bước. Các giá trị như 1360, hoặc trong các môi trường hạn chế hơn là 1280, mức MTU tối thiểu của IPv6, thường khắc phục các vấn đề này với tác động tối thiểu đến băng thông.

MTU nên được thiết lập một cách rõ ràng trong phần [Interface] của tệp cấu hình để đảm bảo hành vi nhất quán khi khởi động lại.

Phạm vi và Tác động của AllowedIPs

Chỉ thị AllowedIPs ảnh hưởng đến cả hành vi định tuyến và hiệu suất. Các phạm vi địa chỉ rộng khiến nhiều lưu lượng phải đi qua đường hầm, điều này làm tăng chi phí mã hóa và tải lên máy chủ. Sử dụng các giá trị AllowedIPs hẹp giới hạn đường hầm chỉ cho lưu lượng cần được bảo vệ. Điều này giảm việc sử dụng CPU và tránh việc đóng gói không cần thiết.

Khi 0.0.0.0/0 hoặc ::/0 được cấu hình, toàn bộ lưu lượng sẽ được định tuyến qua VPN. Cấu hình này phù hợp khi quyền riêng tư, kiểm soát đầu ra tập trung hoặc mạng không đáng tin cậy là vấn đề cần quan tâm, nhưng nó sẽ làm tăng độ trễ và sử dụng tài nguyên cho lưu lượng Internet thông thường.

Điều chỉnh hiệu suất thường liên quan đến việc thu hẹp AllowedIP nếu có thể và tránh định tuyến toàn đường hầm trừ khi điều đó được yêu cầu.

Điều hướng NAT và Ổn định Kết nối (PersistentKeepalive)

WireGuard cố tình im lặng khi không có dữ liệu được truyền đi. Theo mặc định, nó không gửi các gói giữ kết nối định kỳ. Trong các môi trường sử dụng NAT, chẳng hạn như bộ định tuyến gia đình, mạng di động, hoặc nhiều mạng đám mây, sự im lặng này có thể khiến thiết bị NAT đóng bản đồ kết nối. Khi điều này xảy ra, lưu lượng đến từ máy chủ sẽ bị chặn cho đến khi peer gửi lại dữ liệu. Hành vi này thường được cảm nhận như hiện tượng giật, kết nối chậm hoặc thất bại không liên tục.

Để ngăn chặn điều này, WireGuard cung cấp thiết lập PersistentKeepalive. Tùy chọn này có thể được thêm vào phần [Peer] trong cấu hình của peer. Nó khiến peer gửi một gói keepalive nhỏ ở khoảng thời gian cố định để giữ cho ánh xạ NAT luôn mở. Một giá trị 25 giây thường được sử dụng và hoạt động tốt với hầu hết các thiết bị NAT. Nếu một kết nối ban đầu hoạt động nhưng sau đó thất bại khi không hoạt động, việc bật PersistentKeepalive=25 là cách khắc phục chính và được khuyến nghị.

Phân giải DNS và Hành vi của Tunnel

Cấu hình DNS có ảnh hưởng đáng kể đến hiệu suất VPN được cảm nhận. Khi các bộ phân giải DNS không được định tuyến đúng qua đường hầm, các ứng dụng có thể xuất hiện chậm hoặc không đáng tin cậy ngay cả khi bản thân đường hầm vẫn hoạt động chính xác.

Trong các cấu hình cổng mạng, các truy vấn DNS nên được gửi qua VPN để đảm bảo định tuyến nhất quán và tránh rò rỉ. Điều này yêu cầu phải xác định rõ bộ giải quyết DNS trong cấu hình của đối tác. Khi DNS được cấu hình sai, các triệu chứng phổ biến bao gồm tải trang chậm, kết nối không ổn định hoặc lưu lượng được định tuyến ra ngoài VPN mặc dù đường hầm đang hoạt động.

Việc chọn các bộ phân giải có thể truy cập qua đường hầm và phản hồi nhanh sẽ cải thiện cả độ tin cậy và trải nghiệm người dùng.

Sự khác biệt về hiệu suất giữa IPv4 và IPv6

Trong các môi trường đa giao thức, IPv4 và IPv6 có thể hoạt động khác nhau. Các đường dẫn IPv6 có thể có các giới hạn MTU, chính sách định tuyến hoặc hành vi tường lửa khác nhau.

Kiểm tra cả hai giao thức một cách độc lập giúp xác định các vấn đề cụ thể của từng giao thức. Các công cụ như ping, tracepath và ip route get hữu ích để xác thực hành vi định tuyến và MTU cho từng họ địa chỉ.

Nếu hiệu suất IPv6 có vẻ không ổn định, hãy xác minh rằng lưu lượng ICMPv6 được phép. ICMPv6 là cần thiết cho Khám phá MTU đường dẫn (Path MTU Discovery), và việc chặn nó có thể gây ra tắc nghẽn kết nối với các gói dữ liệu lớn hơn.

CPU và Chi phí Mã hóa

WireGuard sử dụng mật mã hiện đại và hiệu quả trên hầu hết các hệ thống. Tuy nhiên, việc mã hóa vẫn tiêu tốn tài nguyên CPU.

Trên các máy ảo nhỏ, bộ định tuyến nhúng hoặc hệ thống không có khả năng tăng tốc phần cứng, cấu hình đường hầm đầy đủ có thể làm bão hòa CPU khi tải liên tục.

Giám sát việc sử dụng CPU trong thời gian lưu lượng cao giúp xác định liệu các vấn đề về hiệu suất có phải do chi phí mã hóa gây ra thay vì cấu hình mạng. Trong những trường hợp như vậy, việc giảm lưu lượng qua đường hầm hoặc nâng cấp máy chủ có thể là cần thiết.

Xác minh thay đổi hiệu suất

Việc tinh chỉnh hiệu suất nên được thực hiện từng bước. Sau mỗi thay đổi, cần kiểm tra kết nối và sự ổn định trước khi áp dụng các điều chỉnh bổ sung.

Các bước xác thực hữu ích bao gồm kiểm tra độ ổn định của quá trình bắt tay với wg, đo độ trễ và băng thông trước và sau thay đổi, và xác nhận hành vi định tuyến với ip route và ip -6 route. Cách tiếp cận này giúp giảm thiểu rủi ro và đơn giản hóa việc khắc phục sự cố.

Câu hỏi thường gặp

1. WireGuard là gì và nó hoạt động như thế nào trên Ubuntu?

WireGuard là một công nghệ VPN hiện đại được thiết kế để nhanh hơn và dễ thiết lập hơn so với các tùy chọn cũ như OpenVPN hoặc IPsec. Bạn có thể coi nó như một đường hầm bảo mật kết nối trực tiếp các thiết bị của bạn. Khác với các VPN cũ nặng nề và phức tạp, WireGuard cực kỳ nhẹ. Trên Ubuntu, nó hoạt động bằng cách chạy trực tiếp bên trong nhân Linux; lõi "động cơ" của hệ điều hành. Bởi vì nó chạy sâu trong hệ thống thay vì như một ứng dụng riêng biệt bên trên, nên nó sử dụng rất ít pin và xử lý dữ liệu cực kỳ nhanh.

Để thiết lập kết nối, WireGuard sử dụng một phương pháp rất giống với SSH. Nó tạo ra một cặp “khóa” cho mỗi thiết bị: một khóa riêng (giữ bí mật trên thiết bị) và một khóa công khai (bạn chia sẻ với các thiết bị khác mà bạn muốn kết nối). Kết nối chỉ xảy ra nếu các khóa khớp hoàn hảo, làm cho quá trình bắt tay nhanh và an toàn.

2. Liệu WireGuard có bảo mật hơn OpenVPN không?

Đối với hầu hết người dùng, WireGuard được coi là an toàn hơn nhờ sự đơn giản và thiết kế hiện đại của nó. Lý do chính là kích thước mã nguồn của nó. WireGuard được xây dựng chỉ với khoảng 4.000 dòng mã, trong khi OpenVPN có hơn 100.000 dòng. Sự khác biệt lớn này có nghĩa là các chuyên gia bảo mật sẽ dễ dàng đọc mã WireGuard và tìm ra các lỗ hổng (bug) trước khi những kẻ xấu làm được.

WireGuard cũng buộc bạn sử dụng các tiêu chuẩn mã hóa mới nhất và mạnh nhất hiện nay. Các VPN cũ cho phép linh hoạt về mã hóa, có nghĩa là chúng có thể hạ cấp xuống các phương pháp mã hóa yếu hơn để hỗ trợ các thiết bị cũ. WireGuard loại bỏ tùy chọn này, ngăn chặn kẻ tấn công lừa VPN của bạn sử dụng một khóa yếu hơn. Ngoài ra, WireGuard theo mặc định là ẩn mình; nếu một thiết bị không được phép gửi gói dữ liệu đến máy chủ của bạn, WireGuard đơn giản sẽ không phản hồi. Điều này giúp máy chủ của bạn trở nên vô hình đối với tin tặc đang quét các cổng mở.

3. Tôi có thể thiết lập WireGuard trên Ubuntu mà không cần Docker không?

Vâng, bạn có thể dễ dàng cài đặt trực tiếp trên hệ thống mà không cần sử dụng các container Docker. Thực tế, chạy trực tiếp thường là phương pháp ưu tiên trên Ubuntu vì phần mềm đã có sẵn trong kho phần mềm chuẩn của Ubuntu. Bạn thường chỉ cần thực hiện các lệnh cài đặt chuẩn dưới đây, chúng sẽ tải phần mềm cần thiết trực tiếp từ nguồn chính thức của Ubuntu.

sudo apt update
sudo apt install wireguard

4. Làm thế nào để tôi thêm nhiều client (peer) WireGuard?

WireGuard sử dụng khái niệm ngang hàng, có nghĩa là mỗi thiết bị bạn kết nối được xem như một “điểm ngang hàng.” Để thêm nhiều thiết bị, như laptop, điện thoại thông minh và máy tính bảng, bạn chỉ cần chỉnh sửa tệp cấu hình của máy chủ (thường nằm ở /etc/wireguard/wg0.conf).

Đối với mỗi thiết bị mới, bạn thêm một khối văn bản mới được gắn nhãn [Peer]. Bên trong khối này, bạn phải dán Khóa Công Khai của thiết bị đó và gán cho nó một địa chỉ IP nội bộ duy nhất (như 10.0.0.2 cho thiết bị đầu tiên, 10.0.0.3 cho thiết bị thứ hai, và cứ như vậy). Điều quan trọng là các địa chỉ IP nội bộ này không được trùng lặp.

Đây là một ví dụ đơn giản về khối cấu hình:

[Interface]
# Server settings...
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <Server_Private_Key>

[Peer]
# Client 1 (Laptop)
PublicKey = <Laptop_Public_Key>
AllowedIPs = 10.0.0.2/32

[Peer]
# Client 2 (Phone)
PublicKey = <Phone_Public_Key>
AllowedIPs = 10.0.0.3/32

5. WireGuard sử dụng những cổng nào?

WireGuard sử dụng cổng UDP 51820 theo mặc định. Nó hoàn toàn dựa trên giao thức UDP vì UDP nhanh hơn cho việc truyền dữ liệu qua đường hầm so với TCP. TCP yêu cầu xác nhận cho mỗi gói dữ liệu được gửi, điều này có thể làm chậm đáng kể kết nối VPN. UDP chỉ gửi dữ liệu mà không chờ xác nhận, điều này lý tưởng cho tốc độ cao của WireGuard. Khi thiết lập tường lửa Ubuntu của bạn (UFW), bạn phải cho phép lưu lượng trên cổng UDP này, nếu không các yêu cầu kết nối sẽ bị chặn trước khi đến phần mềm VPN.

6. Tôi nên khắc phục sự cố kết nối WireGuard như thế nào?

Khắc phục sự cố WireGuard thường khá đơn giản vì có ít thành phần hơn. Nếu bạn không thể kết nối, bạn nên thực hiện theo thứ tự kiểm tra cụ thể sau:

Đầu tiên, kiểm tra trạng thái bắt tay bằng cách chạy sudo wg show trên máy chủ của bạn. Nếu kết nối ổn định, bạn sẽ thấy một dòng hiển thị latest handshake kèm theo thời gian (ví dụ: “1 phút trước”). Nếu dòng này không có, các thiết bị hoàn toàn không giao tiếp với nhau. Điều này hầu như luôn do tường lửa chặn cổng UDP hoặc sự không khớp giữa các khóa Công khai/Tư nhân.

Thứ hai, nếu việc bắt tay (handshake) hoạt động nhưng bạn không thể lướt web, vấn đề có thể là do chuyển tiếp IP. Bạn cần đảm bảo rằng máy chủ Ubuntu của bạn được phép định tuyến lưu lượng từ VPN ra Internet. Bạn có thể kiểm tra điều này bằng cách xem file /etc/sysctl.conf và đảm bảo dòng net.ipv4.ip_forward=1 đang hoạt động (không bị chú thích).

7. WireGuard có hỗ trợ IPv6 trên Ubuntu không?

Đúng vậy, WireGuard có hỗ trợ tuyệt vời cho IPv6. Nó rất linh hoạt và có thể đóng gói (wrap) các loại lưu lượng khác nhau. Ví dụ, bạn có thể truy cập một trang web chỉ hỗ trợ IPv4 thông qua kết nối IPv6, hoặc ngược lại. Để kích hoạt điều này, bạn chỉ cần thêm các địa chỉ IPv6 cách nhau bằng dấu phẩy vào tập tin cấu hình của mình cùng với các địa chỉ IPv4 thông thường. Bạn sẽ thêm chúng vào cả trường Address (cho IP của máy chủ) và trường AllowedIPs (cho các IP của client).

8. Làm thế nào để tôi bật WireGuard khởi động cùng hệ thống?

Để đảm bảo VPN của bạn tự động bật mỗi khi bạn khởi động lại máy chủ Ubuntu, bạn cần sử dụng systemd, là trình quản lý hệ thống cho Linux. Bạn dùng lệnh enable để yêu cầu hệ thống tìm tệp cấu hình cụ thể của bạn (ví dụ, wg0) và tải nó trong quá trình khởi động. Điều này đảm bảo rằng nếu máy chủ của bạn khởi động lại để cập nhật, kết nối VPN của bạn sẽ tự động hoạt động mà không cần bạn phải khởi động thủ công.

sudo systemctl enable wg-quick@wg0

Kết luận

Trong hướng dẫn này, bạn sẽ thiết lập một VPN WireGuard trên máy chủ Ubuntu và kết nối một peer bằng cả IPv4 và IPv6. Trong quá trình này, bạn đã cấu hình khóa, gán địa chỉ đường hầm và cho phép máy chủ định tuyến lưu lượng một cách an toàn, mang đến cho bạn một VPN hoạt động hiệu quả, dễ hiểu và dễ sử dụng.

Hướng dẫn cũng đề cập đến một vài chi tiết thực tiễn quan trọng khi VPN được sử dụng thường xuyên, chẳng hạn như quản lý khóa theo thời gian, xử lý IPv6 và mạng dual-stack, cũng như cải thiện độ tin cậy và hiệu suất thông qua điều chỉnh MTU, giữ kết nối và cài đặt DNS. Khi những yếu tố này được thực hiện, bạn sẽ sẵn sàng vận hành WireGuard trong môi trường thực tế hoặc điều chỉnh nó khi nhu cầu của bạn thay đổi.

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 kết nối nâng cao hơn, hoặc sử dụng WireGuard với các container, hãy truy cập tài liệu chính thức của WireGuard. Để biết thêm các hướng dẫn liên quan đến việc bảo mật hệ thống Ubuntu của bạn, hãy xem các bài viết sau:

  • Cách Thiết Lập Tường Lửa với UFW trên Ubuntu
  • UFW Cơ bản: Các Quy tắc Tường lửa và Lệnh Thường dùng cho Bảo mật Linux
  • VPC vs VPN: Cái nào phù hợp với nhu cầu mạng an toàn của bạn?
  • Cách thiết lập và cấu hình máy chủ OpenVPN trên Ubuntu

Cảm ơn bạn đã học cùng cộng đồng Linux-Console.net.