Wireguard VPN trên Openvz

WireGuard là một hệ thống VPN thú vị, mới, cực kỳ đơn giản, sử dụng mật mã hiện đại. Việc triển khai Linux của nó chạy trong kernel, giúp tăng hiệu năng đáng kể so với triển khai VPN không gian người dùng truyền thống

Mô-đun nhân WireGuard rất tuyệt, nhưng đôi khi bạn có thể không cài đặt được các mô-đun mới. Ví dụ như là trên VPS sử dụng OpenVZ hoặc LXC. Đối với những trường hợp này, chúng tôi có thể sử dụng Wireguard-go, một triển khai không gian người dùng của WireGuard. Đây là cách triển khai tương tự được sử dụng trên các ứng dụng di động MacOS, Windows và WireGuard. Việc thực hiện này chậm hơn mô-đun nhân, nhưng vẫn rất nhanh.

Bài đăng này tập trung vào Debian, tuy nhiên các hướng dẫn cũng chủ yếu hoạt động trên các bản phân phối Linux khác.

Kích hoạt TUN device

Thông thường TUN device có thể được kích hoạt thông qua control panel của nhà cung cấp VPS

Kích hoạt TUN/TAP thông qua giao diện quản lý VPS

Kích hoạt TUN/TAP thông qua giao diện quản lý VPS

Để kiểm tra việc kích hoạt này có hiệu quả chưa bạn sử dụng dòng lệnh sau

cat /dev/net/tun

Kết quả trả về cat: /dev/net/tun: File descriptor in bad state là OK

Ngược lại nếu có lỗi như cat: /dev/net/tun: Operation not permitted bạn thử START/STOP lại VPS trong control panel. Nếu vẫn không thành công bạn phải liên hệ với nhà cung cấp VPS.

Cài đặt và cấu hình

Cài đặt công cụ cho WireGuard

Chúng ta cần cài đặt công cụ cho việc sử dụng WireGuard (wg-quick). Trên Debian, gõ những dòng lệnh sau:

Debian 11

# apt install wireguard-tools --no-install-recommends

Debian 10

echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable.list 
printf 'Package: *\nPin: release a=unstable\nPin-Priority: 90\n' > /etc/apt/preferences.d/limit-unstable 
apt update 
apt install wireguard-tools --no-install-recommends 

(see the WireGuard site for instructions if you’re not on Debian)

Cài đặt Golang

wireguard-go không được đóng gói sẵn file binary cho Debian, do đó chúng ta phải tự biên dịch nó. Để biên dịch nó, trước tiên chúng ta cần cài đặt phiên bản của ngôn ngữ lập trình Golang (tại thời điểm viết bài phiên bản đề xuất là 1.20.5):

apt install curl
cd /tmp
curl -O https://dl.google.com/go/go1.20.5.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.20.5.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin

Kiểm tra go version

cd /tmp
wget https://dl.google.com/go/go1.20.5.linux-amd64.tar.gz --secure-protocol tlsv1
tar zvxf go1.20.5.linux-amd64.tar.gz 
sudo mv go /opt/go1.20.5 
sudo ln -s /opt/go1.20.5/bin/go /usr/local/bin/go 

Now, running go version should show the version number.

Biên dịch wireguard-go

Sau khi cài đặt Go, chúng ta có thể tải xuống và biên dịch wireguard-go. Tải xuống phiên bản phát hành mới nhất:

cd /usr/local/src 
curl -O https://git.zx2c4.com/wireguard-go/snapshot/wireguard-go-0.0.20230223.tar.xz
tar xvf wireguard-go-0.0.20230223.tar.xz 
cd wireguard-go-0.0.20230223 

Nếu bạn đang sử dụng hệ thống có RAM hạn chế (chẳng hạn như VPS “LowEndSprite” 256 MB hoặc thấp hơn), bạn sẽ cần thực hiện một điều chỉnh nhỏ đối với wireguard-go để làm cho nó sử dụng ít RAM hơn trong quá trình biên dịch. Mở device/queueconstants_default.go và thay thế:

MaxSegmentSize             = (1 << 16) - 1 // largest possible UDP datagram 
PreallocatedBuffersPerPool = 0 // Disable and allow for infinite memory growth 

Với những giá trị sau (lấy từ device/queueconstants_ios.go):

MaxSegmentSize             = 1700 
PreallocatedBuffersPerPool = 1024

Điều này sẽ khiến nó sử dụng một lượng RAM cố định (tối đa ~ 20 MB), thay vì cho phép sử dụng bộ nhớ tăng lên vô hạn.

Bây giờ đã có thể biên dịch nó:

make
### "Install" it 
cp wireguard-go /usr/local/bin

Gõ lệnh wireguard-go --version để kiểm tra phiên bàn vừa cài được cài đặt của wireguard-go.

If you have multiple VPSes that use the same OS version and architecture (eg. Debian 10, 64-bit), you can compile it on one of them and then just copy the wireguard-go binary to all the others.

Cấu hình

wg0.conf

Bạn sẽ cần định cấu hình /etc/wireguard/wg0.conf để chứa cấu hình cho máy ngang hàng của bạn. Bài đăng này sẽ không đi sâu vào chi tiết quan trọng về điều này; vui lòng tham khảo một hướng dẫn chung khác của WireGuard (như bài này) để biết thêm chi tiết. Điều cơ bản là bạn cần chạy:

wg genkey | tee privatekey | wg pubkey > publickey 

để tạo cặp khóa chung / riêng cho từng đồng đẳng, sau đó định cấu hình [Giao diện] với khóa riêng cho ngang hàng và phần [Ngang hàng] cho mỗi ngang hàng có thể kết nối với nó.

File wg0.conf của bạn sẽ trông giống như sau:

[Interface] 
Address = 10.123.0.2 
PrivateKey = 12345678912345678912345678912345678912345678 
ListenPort = 51820 
  
[Peer] 
PublicKey = 987654321987654321987654321987654321987654321 
AllowedIPs = 10.123.0.1/32 
Endpoint = 198.51.100.1:51820 

systemd

We need to modify the systemd unit to pass the WG_I_PREFER_BUGGY_USERSPACE_TO_POLISHED_KMOD flag to wireguard-go, to allow it to run on Linux. Open /lib/systemd/system/[email protected], find:

Environment=WG_ENDPOINT_RESOLUTION_RETRIES=infinity 

and add this line directly below:

Environment=WG_I_PREFER_BUGGY_USERSPACE_TO_POLISHED_KMOD=1 

Finally, enable and start the systemd service:

systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0 

Enabling the systemd service will connect the VPN on boot, and starting the systemd service will connect it right now. You’re Done

Now, everything should be working! You can check the status of wg-quick by running systemctl status wg-quick@wg0, which should return something like:

[email protected] - WireGuard via wg-quick(8) for wg0 
   Loaded: loaded (/lib/systemd/system/[email protected]; enabled; vendor preset: enabled) 
   Active: active (exited) since Mon 2019-07-01 06:30:30 UTC; 1 day 22h ago 

Running wg will give you a list of all the peers, and some details about them:

interface: wg0 
  public key: 987654321987654321987654321987654321987654321 
  private key: (hidden) 
  listening port: 38917 
  
peer: 987654321987654321987654321987654321987654321 
  endpoint: 198.51.100.1:51820 
  allowed ips: 10.123.0.1/32 
  latest handshake: 1 day, 22 hours, 59 minutes, 34 seconds ago 
  transfer: 2.75 KiB received, 2.83 KiB sent 

Những câu lệnh thường được sử dụng

nano /etc/wireguard/wg0.conf

systemctl enable wg-quick@wg0

systemctl status wg-quick@wg0

systemctl start wg-quick@wg0

systemctl stop wg-quick@wg0

wg-quick up wg0

wg-quick down wg0

Tham khảo:

https://d.sb/2019/07/wireguard-on-openvz-lxc