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

theanh

Administrator
Nhân viên
Wireguard là một triển khai Mạng riêng ảo (VPN) đa nền tảng nguồn mở sử dụng mật mã tiên tiến. Nó hỗ trợ kết nối IPv4 và IPv6. Nó nhanh hơn, đơn giản hơn và chức năng hơn các giao thức IPSec và OpenVPN. Nó được thiết kế như một VPN mục đích chung để chạy trên các giao diện nhúng và siêu máy tính và chạy trên Linux, Windows, macOS, iOS, Android và nhiều nền tảng khác.

Mã hóa của Wireguard hoạt động bằng cách sử dụng khóa riêng và khóa công khai để các đối tác thiết lập đường hầm được mã hóa giữa chúng.

Hướng dẫn này sẽ trình bày cách cài đặt Wireguard VPN trên máy chủ Ubuntu 22.04 và kết nối với máy chủ đó bằng máy khách Ubuntu.

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


  • Máy chủ chạy Ubuntu 22.04 hỗ trợ cả kết nối IPv4 và IPv6.

  • Máy khách chạy Ubuntu 22.04 để kết nối với máy chủ Wireguard. Đối với hướng dẫn này, chúng ta sẽ sử dụng máy cục bộ làm máy khách nhưng bạn có thể sử dụng máy chủ từ xa cho mục đích này.

  • Người dùng không phải root có quyền sudo.

  • Tường lửa đơn giản (UFW) được bật và đang chạy.

  • Mọi thứ đã được cập nhật.
Mã:
$ sudo apt update && sudo apt upgrade

Bước 1 - Cài đặt Wireguard và tạo cặp khóa​

Ubuntu 22.04 đi kèm với phiên bản Wireguard mới nhất. Cài đặt Wireguard.
Mã:
$ sudo apt install wireguard
Bước tiếp theo là tạo cặp khóa riêng tư và công khai cho máy chủ. Tạo khóa riêng cho máy chủ bằng lệnh wg genkey.
Mã:
$ wg genkey | sudo tee /etc/wireguard/private.key
Thay đổi quyền để bảo vệ khóa riêng. Lệnh chmod go= chặn những người dùng và nhóm khác truy cập vào tệp. Bạn sẽ nhận được khóa đã mã hóa trên thiết bị đầu cuối của mình. Lưu ý khóa vì sau này sẽ cần đến.
Mã:
$ sudo chmod go= /etc/wireguard/private.key
Tiếp theo, tạo khóa công khai tương ứng được lấy từ khóa riêng. Sử dụng wg pubkey để tạo khóa công khai. Lệnh sau có ba phần, trong đó phần đầu tiên xuất ra khóa riêng được lệnh wg pubkey sử dụng để tạo khóa công khai, sau đó được lưu trữ trong tệp tương ứng.
Mã:
$ sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
Bạn sẽ lại nhận được khóa công khai trên thiết bị đầu cuối. Hãy ghi chú lại.

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

Chúng ta cần xác định địa chỉ IPv4 và IPv6 riêng để sử dụng với máy chủ Wireguard và các đối tác của bạn.

Chọn phạm vi IPv4​

Để sử dụng Wireguard với các đối tác IPv4, máy chủ cần một phạm vi địa chỉ IPv4 riêng cho giao diện đường hầm của nó. Bạn có thể chọn bất kỳ phạm vi địa chỉ IP nào từ các khối địa chỉ được dành riêng sau đây:
  • 10.0.0.0 đến 10.255.255.255 (tiền tố 10/8)
  • 172.16.0.0 đến 172.31.255.255 (tiền tố 172.16/12)
  • 192.168.0.0 đến 192.168.255.255 (tiền tố 192.168/16)
Trong hướng dẫn của chúng tôi, chúng tôi sẽ sử dụng 10.8.0.0/24 làm khối địa chỉ IP từ phạm vi IP được dành riêng đầu tiên. Phạm vi này cho phép tối đa 255 kết nối ngang hàng. Bạn cũng có thể sử dụng dải IP riêng do công ty lưu trữ của bạn cung cấp.

Chọn dải IPv6​

Theo thuật toán RFC, cách được khuyến nghị để có được tiền tố IPv6 duy nhất là kết hợp thời gian trong ngày với một giá trị duy nhất như ID máy. Các giá trị đó sau đó được băm và cắt bớt để sử dụng làm địa chỉ duy nhất trong khối IP riêng tư fd00::/8 được dành riêng.

Bước đầu tiên là thu thập dấu thời gian 64 bit bằng tiện ích date.
Mã:
$ date +%s%N
Nó sẽ tạo ra đầu ra tương tự như sau, là số giây đã trôi qua kể từ thời gian Unix Epoch (00:00 UTC ngày 1 tháng 1 năm 1970).
Mã:
1659342559092041940
Ghi lại giá trị để sử dụng sau. Tiếp theo, sao chép giá trị machine-id của máy chủ của bạn. Giá trị này là duy nhất đối với mỗi hệ thống.
Mã:
$ cat /var/lib/dbus/machine-id
Bạn sẽ nhận được kết quả tương tự.
Mã:
d97e195db6584d63aeedfdc35dc83c7f
Tiếp theo, kết hợp dấu thời gian với machine-id và băm chuỗi bằng thuật toán SHA-1.
Mã:
printf  | sha1sum
Thay thế các giá trị <timestamp> và <machine-id> trong lệnh trên từ trước. Bạn sẽ nhận được một giá trị băm khác.
Mã:
$ printf 1659342559092041940d97e195db6584d63aeedfdc35dc83c7f | sha1sumd789c02d9d8faef806d40ec15b307d4d9c8ec4bc -
Chạy lệnh sau để cắt bớt đầu ra printf theo thuật toán RFC.
Mã:
$ printf d789c02d9d8faef806d40ec15b307d4d9c8ec4bc | cut -c 31-
Bạn sẽ nhận được đầu ra sau.
Mã:
4d9c8ec4bc
Trong đầu ra ở trên, tập hợp các byte là 4d 9c 8e c4 bc. Tạo địa chỉ IPv6 bằng cách thêm 5 byte ở trên với tiền tố fd theo cách sau.

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ẽ là như sau.
Mã:
Tiền tố địa chỉ IPv6 cục bộ duy nhấtfd4d:9c8e:c4bc::/64
Để phân bổ IP cho máy chủ, hãy thêm 1 sau các ký tự :: cuối cùng. Địa chỉ kết quả sẽ là fd4d:9c8e:c4bc::1/64. Các đối tác sử dụng địa chỉ IP bằng cách thêm một giá trị gia tăng khác như fd4d:9c8e:c4bc::2/64.

Bước 3 - Cấu hình Wireguard​

Tạo tệp cấu hình và mở để chỉnh sửa.
Mã:
$ sudo nano /etc/wireguard/wg0.conf
Dán mã sau vào đó. Thay thế server_private_key bằng khóa riêng được tạo ở bước 1. Bạn có thể thay đổi cổng lắng nghe thành bất kỳ cổng nào bạn thích.
Mã:
[Giao diện]PrivateKey = server_private_keyAddress = 10.8.0.1/24, fd4d:9c8e:c4bc::/64ListenPort = 51820SaveConfig = true
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Bước 4 - Cấu hình Mạng Wireguard​

Để định tuyến lưu lượng truy cập của đối tác qua máy chủ Wireguard, bạn cần cấu hình chuyển tiếp IP. Mở tệp /etc/sysctl.conf để chỉnh sửa.
Mã:
$ sudo nano /etc/sysctl.conf
Bỏ chú thích các dòng sau bằng cách xóa dấu thăng ở phía trước.
Mã:
# Bỏ chú thích dòng tiếp theo để bật chuyển tiếp gói tin cho IPv4net.ipv4.ip_forward=1# Bỏ chú thích dòng tiếp theo để bật chuyển tiếp gói tin cho IPv6# Bật tùy chọn này sẽ vô hiệu hóa Tự động cấu hình địa chỉ không trạng thái# dựa trên Quảng cáo bộ định tuyến cho máy chủ nàynet.ipv6.conf.all.forwarding=1
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc. Xác minh các giá trị mới bằng lệnh sau.
Mã:
$ sudo sysctl -pnet.ipv4.ip_forward = 1net.ipv6.conf.all.forwarding = 1vm.swappiness = 0
Bây giờ máy chủ Wireguard của bạn sẽ chuyển tiếp tất cả lưu lượng truy cập đến từ thiết bị Ethernet VPN đến các thiết bị khác trên máy chủ và từ đó đến Internet công cộng. Điều này cho phép máy chủ định tuyến tất cả lưu lượng truy cập web từ đối tác thông qua địa chỉ IP của máy chủ và sẽ ẩn địa chỉ IP của máy khách.

Bước tiếp theo là cấu hình các quy tắc tường lửa để chuyển tiếp hoạt động bình thường.

Bước 5 - Cấu hình Tường lửa của Máy chủ Wireguard​

Để cho phép lưu lượng truy cập VPN thông qua tường lửa của máy chủ, bạn cần bật chế độ ngụy trang cung cấp dịch địa chỉ mạng động (NAT) tức thời để định tuyến các kết nối của máy khách.

Tìm giao diện mạng công cộng của máy chủ Wireguard của bạn.
Mã:
$ ip route list defaultdefault via 209.23.8.1 dev eth0 proto static
Theo lệnh trên, eth0 là giao diện công cộng.

Mở tệp cấu hình Wireguard để thêm các quy tắc tường lửa vào máy chủ Wireguard của bạn.
Mã:
$ sudo nano /etc/wireguard/wg0.conf
Dán các dòng sau vào cuối tệp sau dòng SaveConfig = true.
Mã:
. . .PostUp = ufw route allow in on wg0 out on eth0PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADEPostUp = ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADEPreDown = ufw route delete allow in on wg0 out on eth0PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADEPreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Các dòng PostUp chạy khi máy chủ Wireguard khởi động đường hầm VPN. Quy tắc đầu tiên cho phép chuyển tiếp lưu lượng IPv4 và IPv6. Quy tắc thứ hai và thứ ba cấu hình ngụy trang cho lưu lượng IPv4 và IPv6. Các dòng PreDown chạy khi máy chủ Wireguard dừng đường hầm VPN.

Bước cuối cùng trong quá trình cấu hình tường lửa là cho phép lưu lượng đến và đi từ cổng UDP Wireguard. Sử dụng Tường lửa đơn giản (UFW) để mở cổng Wireguard.

Kiểm tra trạng thái của tường lửa.
Mã:
$ sudo ufw status
Bạn sẽ thấy nội dung tương tự như sau.
Mã:
Trạng thái: activeĐến Hành động Từ-- ------ ----OpenSSH ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)
Mở cổng 51820 được định cấu hình ở bước 1. Nếu bạn đang sử dụng một cổng khác cho Wireguard, hãy mở cổng đó.
Mã:
$ sudo ufw allow 51820/udp
Vô hiệu hóa và bật lại tường lửa UFW để tải các thay đổi từ tất cả các tệp đã sửa đổi trong bước này.
Mã:
$ sudo ufw disable$ sudo ufw enable
Kiểm tra lại trạng thái để xác nhận.
Mã:
Trạng thái: đang hoạt độngĐến Hành động Từ-- ------ ----OpenSSH CHO PHÉP Ở Bất kỳ đâu51820/udp CHO PHÉP Ở Bất kỳ đâuOpenSSH (v6) CHO PHÉP Ở Bất kỳ đâu (v6)51820/udp (v6) CHO PHÉP Ở Bất kỳ đâu (v6)
Máy chủ Wireguard của bạn được định cấu hình để xử lý lưu lượng VPN, bao gồm chuyển tiếp và ngụy trang cho các đối tác.

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

Wireguard có thể được định cấu hình để chạy dưới dạng dịch vụ bằng cách sử dụng tập lệnh wg-quick. Bật dịch vụ Wireguard.
Mã:
$ sudo systemctl enable [emailprotected]
Phần wg0 của tên dịch vụ tương ứng với tệp /etc/wireguard/wg0.conf. Điều này có nghĩa là bạn có thể tạo bao nhiêu đường hầm VPN tùy thích bằng cách sử dụng tệp cấu hình và dịch vụ khác.

Khởi động dịch vụ Wireguard.
Mã:
$ sudo systemctl start [emailprotected]
Kiểm tra trạng thái của dịch vụ.
Mã:
$ sudo systemctl status [emailprotected]
Bạn sẽ nhận được kết quả tương tự.
Mã:
? [emailprotected] - WireGuard qua wg-quick(8) cho wg0 Đã tải: đã tải (/lib/systemd/system/[emailprotected]; đã bật; cài đặt trước của nhà cung cấp: đã bật) Đang hoạt động: đang hoạt động (đã thoát) kể từ Thứ Hai 2022-08-01 11:35:59 UTC; 6 giây trước Tài liệu: 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 Tiến trình: 3935 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS) PID chính: 3935 (code=exited, status=0/SUCCESS) CPU: 216ms01/08 11:35:58 wireguard wg-quick[3935]: [#] wg setconf wg0 /dev/fd/6301/08 11:35:58 wireguard wg-quick[3935]: [#] ip -4 address add 10.8.0.1/24 dev wg001/08 11:35:58 wireguard wg-quick[3935]: [#] ip -6 address add fd4d:9c8e:c4bc::/64 dev wg001/08 11:35:59 wireguard wg-quick[3935]: [#] ip link set mtu 1420 up dev wg001/08 11:35:59 wireguard wg-quick[3935]: [#] ufw route allow in on wg0 out on eth001/08 11:35:59 wireguard wg-quick[3978]: Rule added01/08 11:35:59 wireguard wg-quick[3978]: Đã thêm quy tắc (v6)01 tháng 8 11:35:59 wireguard wg-quick[3935]: [#] iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE01 tháng 8 11:35:59 wireguard wg-quick[3935]: [#] ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE01 tháng 8 11:35:59 wireguard systemd[1]: Đã hoàn tất WireGuard qua wg-quick(8) cho wg0.

Bước 7 - Cài đặt và cấu hình Wireguard Peer​

Cài đặt máy khách Wireguard trên máy khách dựa trên Ubuntu 22.04.
Mã:
$ sudo apt update$ sudo apt install wireguard
Nếu bạn đang cài đặt trên máy tính để bàn Ubuntu cục bộ, thì Wireguard có thể đã được cài đặt sẵn.

Tạo cặp khóa của Wireguard Peer​

Tạo cặp khóa trên đối tác theo cùng cách như bạn đã làm ở bước 1. Ngoài ra, hãy cấp quyền cho khóa riêng.
Mã:
$ wg genkey | sudo tee /etc/wireguard/private.key$ sudo chmod go= /etc/wireguard/private.key
Tạo khóa công khai.
Mã:
$ sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

Tạo tệp cấu hình ngang hàng​

Để tạo tệp cấu hình ngang hàng, bạn cần những thứ sau:
  • Khóa riêng được mã hóa base64 được tạo trên đối tác.
  • Phạm vi địa chỉ IPv4 và IPv6 được xác định 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 khai và số cổng của máy chủ Wireguard. Nếu máy chủ và máy khách của bạn có kết nối IPv6, bạn cần sử dụng địa chỉ IPv6.
Tạo và mở tệp cấu hình Peer để chỉnh sửa.
Mã:
$ sudo nano /etc/wireguard/wg0.conf
Dán mã sau vào đó.
Mã:
[Interface]PrivateKey = peer_private_keyAddress = 10.8.0.2/24Address = fd4d:9c8e:c4bc::2/64[Peer]PublicKey = JySX9hMJFyAqZA+mNvJsArKW7yY8I7ROsQKTZZR/RH8=AllowedIPs = 10.8.0.0/24, fd4d:9c8e:c4bc::/64Endpoint = 209.23.10.202:51820PersistentKeepalive = 15
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Khóa đầu tiên là khóa riêng được tạo trên đối tác. Dòng địa chỉ đầu tiên sử dụng địa chỉ IPv4 từ mạng con đã chọn trước đó. Dòng địa chỉ thứ hai sử dụng địa chỉ IPv6 từ mạng con đã chọn trước đó.

Khóa thứ hai là khóa công khai được tạo trên máy chủ. AllowedIPs sử dụng các phạm vi IPv4 và IPv6 đã chọn trước đó để hướng dẫn đối tác chỉ gửi lưu lượng qua VPN nếu hệ thống đích có địa chỉ IP trong một trong hai phạm vi. Bạn có thể bỏ qua địa chỉ IPv6 nếu bạn chỉ sử dụng kết nối IPv4.

Cấu hình Peer để định tuyến tất cả lưu lượng qua Đường hầm​

Tìm địa chỉ IP mà hệ thống sử dụng làm cổng mặc định. Chạy lệnh ip route sau.
Mã:
$ ip route list table main default
Bạn sẽ nhận được kết quả tương tự.
Mã:
default via 69.28.84.1 dev eth0 proto static
Lưu ý địa chỉ IP và tên thiết bị của cổng. Tìm IP công khai của đối tác.
Mã:
$ ip -brief address show eth0
Bạn sẽ nhận được kết quả tương tự.
Mã:
eth0 UP 69.28.84.160/23 2607:f170:14:13::910/64 fe80::200:45ff:fe1c:54a0/64
Mở tệp cấu hình đối tác để chỉnh sửa.
Mã:
$ sudo nano /etc/wireguard/wg0.conf
Dán các dòng sau trước phần [Peer].
Mã:
PostUp = ip rule add table 200 from 69.28.84.160PostUp = ip route add table 200 default via 69.28.84.1PreDown = ip rule delete table 200 from 69.28.84.160PreDown = ip route delete table 200 default via 69.28.84.1[Peer]. . .
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Lệnh PostUp tạo một quy tắc để kiểm tra bất kỳ mục định tuyến nào trong bảng 200 khi IP khớp với IP công khai của hệ thống. Lệnh PreDown đảm bảo lưu lượng được xử lý bởi bảng 200 sử dụng cổng 203.0.113.1 để định tuyến thay vì giao diện Wireguard.

Cấu hình Bộ giải quyết DNS của Peer​

Chạy lệnh sau trên máy chủ bằng cách thay thế eth0 bằng tên thiết bị Ethernet của bạn nếu nó khác.
Mã:
$ resolvectl dns eth0
Bạn sẽ nhận được kết quả tương tự.
Mã:
Liên kết 2 (eth0): 209.208.127.65 209.208.25.18 2001:4860:4860::8888 2001:4860:4860::8844
Mở tệp cấu hình của đối tác.
Mã:
$ sudo nano /etc/wireguard/wg0.conf
Thêm mã sau vào trước dòng [Peer].
Mã:
DNS = 209.208.127.65 2001:4860:4860::8888[Peer]. . .
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Bước 8 - Thêm Khóa công khai của Đối tác vào Máy chủ Wireguard​

Kiểm tra khóa công khai trên đối tác Wireguard.
Mã:
$ sudo cat /etc/wireguard/public.keyPeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
Chạy lệnh sau trên máy chủ Wireguard của bạn.
Mã:
$ sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,fd24:609a:6c18::2
Để cập nhật allowed-ips cho một đối tác hiện có, hãy chạy lại lệnh trên bằng cách thay đổi địa chỉ IP.

Kiểm tra trạng thái của đường hầm trên máy chủ.
Mã:
$ sudo wginterface: wg0 public key: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE= private key: (ẩn) listening port: 51820peer: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed ips: 10.8.0.2/32, fd24:609a:6c18::2/128

Bước 9 - Kết nối Peer với Tunnel​

Cài đặt gói resolvconf trong trường hợp bạn đang định tuyến toàn bộ lưu lượng qua VPN.
Mã:
$ sudo apt install resolvconf
Khởi động đường hầm trên đối tác.
Mã:
$ sudo wg-quick up wg0
Bạn sẽ nhận được kết quả tương tự.
Mã:
[#] 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 fd4d:9c8e:c4bc::2/64 dev wg0[#] ip link set mtu 1420 up dev wg0[#] resolvconf -a tun.wg0 -m 0 -x[#] ip rule add table 200 từ 69.28.84.160[#] ip route add table 200 default via 69.28.84.1
Kiểm tra trạng thái của đường hầm trên đối tác.
Mã:
$ sudo wginterface: wg0 public key: nbkscqPcItMsFtv3R/ylrcC9knA+3F0Z/UVCkGx/DFw= private key: (ẩn) listening port: 45392đối tác: JySX9hMJFyAqZA+mNvJsArKW7yY8I7ROsQKTZZR/RH8= endpoint: 209.23.10.202:51820 allowed ips: 10.8.0.0/24, fd24:609a:6c18::/64 latest handshake: 23 seconds ago transfer: 92 B received, 212 B đã gửi lệnh duy trì liên tục: cứ sau 15 giây
Điều này xác nhận kết nối giữa đối tác và VPN.

Xác minh rằng đối tác đang sử dụng VPN.
Mã:
$ ip route get 10.0.8.110.0.8.1 dev wg0 table 51820 src 10.8.0.2 uid 1000 cache
Nếu bạn đang sử dụng IPv6, hãy sử dụng lệnh sau thay thế.
Mã:
$ ip -6 route get fd24:609a:6c18::1fd24:609a:6c18::1 from :: dev wg0 proto kernel src fd24:609a:6c18::2 metric 256 pref medium
Sử dụng lệnh sau để ngắt kết nối đối tác.
Mã:
$ sudo wg-quick down wg0[#] ip link delete dev wg0[#] resolvconf -d tun.wg0 -f
Sử dụng lệnh sau để xóa cấu hình ngang hàng trên máy chủ.
Mã:
$ sudo wg set wg0 peer nbkscqPcItMsFtv3R/ylrcC9knA+3F0Z/UVCkGx/DFw= remove

Kết luận​

Như vậy là hoàn thành hướng dẫn về cách thiết lập và cấu hình VPN Wireguard trên máy chủ Ubuntu 22.04 và kết nối với máy khách. Nếu bạn có bất kỳ câu hỏi nào, hãy đăng chúng trong phần bình luận bên dưới.
 
Back
Bên trên