WireGuard 是一个现代、高速且极其安全的 VPN 协议。相比于 OpenVPN 等传统协议,它的代码量极小(约4000行),这意味着攻击面更小、更易于审计、性能更高。在你的 VPS 上部署 WireGuard,可以为你所有的设备创建一个加密的、高性能的专属网络通道。
bash# 更新系统包
sudo dnf update -y
# 安装 wireguard-tools
sudo dnf install wireguard-tools -y
WireGuard 使用公钥和私钥进行身份验证。需要为服务器生成一对密钥:
bash# 生成私钥并保存到文件
wg genkey | sudo tee /etc/wireguard/server_private.key
# 根据私钥生成对应的公钥
sudo cat /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key
生成的私钥(
server_private.key)需要严格保密,公钥(server_public.key)稍后需要配置给客户端。
创建并编辑 WireGuard 的配置文件 /etc/wireguard/wg0.conf:
bashsudo vim /etc/wireguard/wg0.conf
在文件中写入以下内容(请根据实际情况替换注释中的内容):
ini[Interface]
# 服务器的私钥 (粘贴 /etc/wireguard/server_private.key 文件的内容)
PrivateKey = <服务器私钥>
# 服务器在VPN虚拟网络中的IP地址
Address = 10.0.0.1/24
# 监听的UDP端口,可以自定义,默认为51820
ListenPort = 51820
# 开启IP转发并配置NAT,允许客户端通过此服务器访问外部网络
# 注意:eth0 需要替换为服务器实际公网网卡名称,可以用 `ip route` 命令查看
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# --- 下面是第一个客户端的配置 ---
[Peer]
# 客户端的公钥(稍后生成)
PublicKey = <客户端公钥>
# 允许此客户端使用的VPN内网IP
AllowedIPs = 10.0.0.2/32
# --- 下面是第二个客户端的配置 ---
[Peer]
# 客户端的公钥(稍后生成)
PublicKey = <客户端公钥>
# 允许此客户端使用的VPN内网IP
AllowedIPs = 10.0.0.3/32
注意
PostUp 和 PostDown 中的 iptables 规则非常关键,它们能让你的VPN客户端通过服务器访问互联网
为了让你的服务器能够转发流量,需要开启系统的 IP 转发功能:
bash# 编辑系统控制文件
sudo vim /etc/sysctl.conf
# 找到或添加以下行,并确保它没有被注释掉
net.ipv4.ip_forward=1
# 保存并退出,然后使配置生效
sudo sysctl -p
需要在防火墙中放行 WireGuard 的 UDP 端口(默认为 51820):
bash# 放行51820端口(UDP)
sudo firewall-cmd --permanent --add-port=51820/udp
# 重新加载防火墙配置
sudo firewall-cmd --reload
一切就绪后,启动并设置 WireGuard 开机自启:
bash# 启动wg0接口
sudo wg-quick up wg0
# 设置开机自动启动
sudo systemctl enable wg-quick@wg0
# 查看运行状态
sudo wg show
从 WireGuard 官网(需要科学上网) 下载并安装对应你操作系统的客户端。
打开 WireGuard 客户端,创建一个新隧道。在隧道编辑界面,通常会有个“生成密钥对”的按钮或自动生成一对公钥和私钥。请务必保存好这对密钥,并复制下客户端公钥,稍后需要填到服务器配置文件中。

在客户端的隧道编辑界面,填入以下配置信息:
ini[Interface]
# 客户端的私钥(由客户端自动生成)
PrivateKey = <客户端私钥>
# 客户端在VPN虚拟网络中的IP地址(与服务器配置中的AllowedIPs对应)
Address = 10.0.0.2/24
# 可选:配置DNS,通过VPN解析域名
DNS = 1.1.1.1
[Peer]
# 服务器的公钥(从服务器的 /etc/wireguard/server_public.key 获取)
PublicKey = <服务器公钥>
# 允许通过的IP范围,0.0.0.0/0 表示将所有流量都通过VPN发送
AllowedIPs = 0.0.0.0/0
# 服务器的公网IP地址和WireGuard监听的端口
Endpoint = <服务器公网IP>:51820
# 保持连接活跃,对 NAT 后的连接很重要
PersistentKeepalive = 25
回到服务器,编辑 /etc/wireguard/wg0.conf 文件,在文件末尾添加一个新的 [Peer] 块(如果之前只配置了一个示例的话,可以覆盖它),填入刚刚生成的客户端公钥和分配的IP:
ini[Peer]
PublicKey = <客户端公钥>
AllowedIPs = 10.0.0.2/32
在 VPS 上重启 WireGuard 使新配置生效:
bashsudo wg-quick down wg0
sudo wg-quick up wg0
# 或
sudo wg-quick down wg0 && sudo wg-quick up wg0
然后点击客户端的“连接”按钮。如果一切顺利,该客户端就通过加密的 WireGuard 隧道连接到服务器了。
在客户端上执行:
bashping 10.0.0.1
预期结果:成功收到回复,说明隧道本身是通的。
如果失败:检查客户端和服务器配置中的公钥、IP 是否匹配,以及服务器防火墙是否放行了 UDP 端口(51820)。
在服务器上执行:
bashsudo sysctl net.ipv4.ip_forward
预期输出:net.ipv4.ip_forward = 1
如果为 0:临时开启 sudo sysctl -w net.ipv4.ip_forward=1,永久开启需编辑 /etc/sysctl.conf 并执行 sudo sysctl -p。
在服务器上执行:
bashsudo iptables -t nat -L POSTROUTING -v
bashChain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- any eth0 anywhere anywhere
bashsudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE sudo iptables -A FORWARD -i wg0 -j ACCEPT
以下以 LoongProxy 为例 要实现不同的 VPN 隧道客户端走不同的静态住宅 IP(即不同的 LoongProxy 出口),最直接的办法是启动多个 Tinyproxy 实例,每个实例监听不同的端口,并配置不同的上游代理(LoongProxy 的 IP 和端口)。然后,不同的客户端在连接 VPN 后,根据需要设置代理端口为对应的端口即可。
购买了多个静态住宅 IP,LoongProxy 提供了多个 HTTP/SOCKS5 代理地址,以HTTP为例:
每个客户端将使用一个独立的代理。
bashsudo dnf install tinyproxy -y
配置文件为 /etc/tinyproxy/tinyproxy.conf
为每个代理创建一个独立的 Tinyproxy 配置文件,放在 /etc/tinyproxy/ 目录下,例如 tinyproxy-1.conf、tinyproxy-2.conf。
以代理1为例,创建 /etc/tinyproxy/tinyproxy-1.conf:
bashsudo cp /etc/tinyproxy/tinyproxy.conf /etc/tinyproxy/tinyproxy-1.conf
sudo vim /etc/tinyproxy/tinyproxy-1.conf
修改以下关键参数:
8881、8882 等。iniPort 8881
iniPidFile "/var/run/tinyproxy/tinyproxy-1.pid"
iniLogFile "/var/log/tinyproxy/tinyproxy-1.log"
iniUpstream http user1:pass1@ip1:port1
# 或
Upstream socks5 user1:pass1@ip1:port1
ini# 注释掉默认的 Allow 127.0.0.1
#Allow 127.0.0.1
# 添加允许你的 VPN 虚拟网段访问
Allow 10.0.0.0/24
重复此步骤为代理2创建 tinyproxy-2.conf,使用端口 8882 和对应的上游代理信息。
为每个 Tinyproxy 实例创建独立的 systemd 服务文件,例如 /etc/systemd/system/tinyproxy-1.service 和 /etc/systemd/system/tinyproxy-2.service。
模板如下(以 tinyproxy-1.service 为例):
ini[Unit]
Description=Tinyproxy - 1
After=network.target
[Service]
Type=forking
PIDFile=/var/run/tinyproxy/tinyproxy-1.pid
ExecStart=/usr/bin/tinyproxy -c /etc/tinyproxy/tinyproxy-1.conf
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -TERM $MAINPID
[Install]
WantedBy=multi-user.target
创建第二个服务文件,将 1 替换为 2,并确保 PIDFile 和配置文件路径相应修改。
bashsudo systemctl daemon-reload
sudo systemctl start tinyproxy-1
sudo systemctl enable tinyproxy-1
sudo systemctl start tinyproxy-2
sudo systemctl enable tinyproxy-2
检查状态:
bashsudo systemctl status tinyproxy-1 sudo systemctl status tinyproxy-2
确保两个实例都正常运行,并监听各自的端口:
bashsudo ss -tlnp | grep 888x
让不同的客户端在连接 WireGuard 后,将系统代理或应用代理指向不同的端口。
10.0.0.1:888110.0.0.1:8882每个客户端访问 https://ip.oxylabs.io 时看到的将是不同的住宅 IP。
在每个客户端上(确保 WireGuard 已连接)执行:
bash# 客户端1
curl -x http://10.0.0.1:8881 https://ip.oxylabs.io
# 客户端2
curl -x http://10.0.0.1:8882 https://ip.oxylabs.io
输出的 IP 应该分别是两个不同的住宅 IP,且与 LoongProxy 提供的 IP 一致。
检查日志目录是否存在及权限
bashls -ld /var/log/tinyproxy
bashsudo mkdir -p /var/log/tinyproxy
sudo chown tinyproxy:tinyproxy /var/log/tinyproxy
sudo chmod 755 /var/log/tinyproxy
bashls -ld /var/log/tinyproxy
应显示 drwxr-xr-x 且所有者为 tinyproxy。如果不是,修正:
bashsudo chown tinyproxy:tinyproxy /var/log/tinyproxy
sudo chmod 755 /var/log/tinyproxy
PID 文件通常放在 /run/tinyproxy/ 下,该目录可能不存在,或者 tinyproxy 用户没有写入权限。
检查 /run/tinyproxy 是否存在:
bashls -ld /run/tinyproxy
如果不存在,创建它并设置正确的权限(通常 tinyproxy 以 nobody 或特定用户运行):
bashsudo mkdir -p /run/tinyproxy
sudo chown tinyproxy:tinyproxy /run/tinyproxy # 如果 tinyproxy 有专用用户
# 或者直接给 755 权限让系统用户可写
sudo chmod 755 /run/tinyproxy
如果 tinyproxy 以 root 启动(不推荐),则目录权限不是问题,但仍需确保路径正确。
若出现 WireGuard 无法握手,且客户端能发送数据但是无法接收数据的情况,那么可能是因为运营商对UDP的干扰。
既然 UDP 可能被干扰,可将 WireGuard 流量封装在 TCP 中,例如使用 udp2raw 或 TinyFecVPN。这样能穿透大部分 UDP 封锁,代价是轻微性能损耗。
bash# 进入临时目录
cd /tmp
# 下载最新的稳定版(请到 https://github.com/wangyu-/udp2raw/releases 检查最新版本)
wget https://github.com/wangyu-/udp2raw/releases/download/20230206.0/udp2raw_binaries.tar.gz
# 解压
tar -xzf udp2raw_binaries.tar.gz
# 进入解压目录
cd udp2raw_binaries
# 将适合系统的二进制文件(通常是 udp2raw_amd64)复制到系统路径并重命名
sudo cp udp2raw_amd64 /usr/local/bin/udp2raw
# 赋予执行权限
sudo chmod +x /usr/local/bin/udp2raw
WireGuard 服务端目前监听的是 51821/udp。将让 udp2raw 监听一个 TCP 端口(例如 2443),并将所有收到的 TCP 流量解包后转发给本地的 WireGuard UDP 端口。
创建一个 systemd 服务来管理 udp2raw,确保它能够开机自启并在后台稳定运行。
bashsudo vim /etc/systemd/system/udp2raw.service
填入以下内容(请务必将 your_password 替换为一个自定义的强密码,客户端连接时需要用到):
ini[Unit]
Description=udp2raw Service
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/udp2raw -s -l 0.0.0.0:2443 -r 127.0.0.1:51821 -k "your_password" --raw-mode faketcp -a
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
参数解释:
保存文件后,启动并启用服务:
bashsudo systemctl daemon-reload
sudo systemctl start udp2raw
sudo systemctl enable udp2raw
sudo systemctl status udp2raw
确保状态为 active (running)。
bashsudo firewall-cmd --permanent --add-port=2443/tcp sudo firewall-cmd --reload
访问 udp2raw 的 GitHub Releases 页面,下载最新的 udp2raw_binaries.tar.gz,解压后找到 udp2raw_mp.exe(多线程版本)或 udp2raw_x86.exe。将其放在一个固定目录,例如 C:\udp2raw\。
在 C:\udp2raw\ 目录下,创建一个新的文本文件,命名为 start_udp2raw.bat。右键编辑,填入以下内容(请将 your_password 替换为与服务端相同的密码,将 your_server_ip 替换为服务器公网 IP):
batch@echo off cd /d "%~dp0" udp2raw_mp.exe -c -l 127.0.0.1:51820 -r your_server_ip:2443 -k "your_password" --raw-mode easyfaketcp pause
参数解释:
Npcap 需要以正确模式安装才能支持 faketcp 模式发送原始包。
右键点击 start_udp2raw.bat,选择 “以管理员身份运行”。首次运行可能会提示防火墙,请允许。如果一切顺利,命令行窗口会显示连接成功的信息,如 state changed to client_ready 。请保持此窗口一直运行(可以最小化)。
修改 Windows 上的 WireGuard 客户端配置文件,将其 Endpoint 指向本地运行的 udp2raw 客户端 。
[Peer] 部分下的 Endpoint:Endpoint = 你的VPS公网IP:51821Endpoint = 127.0.0.1:51820PrivateKey、Address、AllowedIPs 等)保持不变。start_udp2raw.bat,观察是否出现 client_ready 状态。ping 10.0.0.1,看是否能通。bash# 查看当前状态
sudo systemctl status firewalld
# 启动 firewalld 并设置为开机自启
sudo systemctl start firewalld
sudo systemctl enable firewalld
# 禁用开机自启
sudo systemctl disable firewalld
# 停止 firewalld 服务
sudo systemctl stop firewalld
# 添加端口规则
sudo firewall-cmd --permanent --add-port=21000/udp
# 重新加载防火墙配置使规则生效
sudo firewall-cmd --reload
# 验证端口是否添加成功
sudo firewall-cmd --list-ports
# 如果需要彻底防止 firewalld 被其他进程唤醒,可以将其 mask(mask 后,任何尝试启动 firewalld 的操作都会被阻止)
sudo systemctl mask firewalld
# 清空 iptables 规则(irewalld 底层使用 iptables,关闭 firewalld 后原有的规则可能仍然存在。可以选择彻底清空所有防火墙规则。清空 iptables 规则后,系统将没有任何包过滤,风险极高。谨慎操作。)
sudo iptables -F # 清空所有规则
sudo iptables -X # 删除用户自定义链
sudo iptables -t nat -F
sudo iptables -t mangle -F
# 重新开启防火墙的方法
sudo systemctl unmask firewalld # 如果之前 mask 了
sudo systemctl enable firewalld
sudo systemctl start firewalld
# 查看当前运行时的开放端口
sudo firewall-cmd --list-ports
# 查看所有开放的服务(服务可能对应多个端口)
sudo firewall-cmd --list-services
# 查看完整区域信息(包括端口、服务、规则等)
sudo firewall-cmd --list-all
本文作者:哈希喵
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!