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
Để 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
Vì 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: