2026-03-02
服务器相关
00

目录

前言
搭建 WireGuard 隧道
服务端配置 WireGuard
1.安装 WireGuard 工具
2. 生成服务器密钥对
3.创建服务器配置文件
4.配置 Linux 内核 IP 转发
5.配置防火墙
6.启动 WireGuard 服务
配置客户端(以Windows为例)
1.安装 WireGuard 客户端
2.生成客户端密钥对
3.创建客户端配置文件
4.将客户端信息添加到服务器
5.重启服务器端 WireGuard 并连接客户端
问题
1.连接上隧道后无法访问网络
搭建 Tinyproxy
准备工作:获取多个 LoongProxy 代理
1.安装 Tinyproxy
2.配置多个 Tinyproxy 实例
2.1 创建多个配置文件
2.2 创建 systemd 服务单元文件
2.3 启动并启用服务
3. 客户端配置
4. 验证
5.注意事项
6. 问题处理
6.1 ERROR: Could not create log file /var/log/tinyproxy/tinyproxy-1.log: Bad file descriptor.
6.2 tinyproxy-1.service: Can't open PID file '/run/tinyproxy/tinyproxy-1.pid' (yet?) after start: No such file or directory
WireGuard 无法握手
1.在服务端安装并配置 udp2raw
1.1 下载并安装 udp2raw
1.2 配置并启动 udp2raw 服务端
1.3 防火墙放行 TCP 2443 端口
2.在客户端(Windows)安装并配置 udp2raw
2.1 下载 Windows 版 udp2raw
2.2 创建 udp2raw 客户端启动脚本
2.3 安装 Npcap
2.4 以管理员身份运行并测试
3. 修改 WireGuard 客户端配置
4. 启动并验证整条链路
5.注意事项与故障排查
firewalld 防火墙相关

前言

WireGuard 是一个现代、高速且极其安全的 VPN 协议。相比于 OpenVPN 等传统协议,它的代码量极小(约4000行),这意味着攻击面更小、更易于审计、性能更高。在你的 VPS 上部署 WireGuard,可以为你所有的设备创建一个加密的、高性能的专属网络通道。

搭建 WireGuard 隧道

服务端配置 WireGuard

1.安装 WireGuard 工具

bash
# 更新系统包 sudo dnf update -y # 安装 wireguard-tools sudo dnf install wireguard-tools -y

2. 生成服务器密钥对

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)稍后需要配置给客户端。

3.创建服务器配置文件

创建并编辑 WireGuard 的配置文件 /etc/wireguard/wg0.conf:

bash
sudo 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

注意

PostUpPostDown 中的 iptables 规则非常关键,它们能让你的VPN客户端通过服务器访问互联网

4.配置 Linux 内核 IP 转发

为了让你的服务器能够转发流量,需要开启系统的 IP 转发功能:

bash
# 编辑系统控制文件 sudo vim /etc/sysctl.conf # 找到或添加以下行,并确保它没有被注释掉 net.ipv4.ip_forward=1 # 保存并退出,然后使配置生效 sudo sysctl -p

5.配置防火墙

需要在防火墙中放行 WireGuard 的 UDP 端口(默认为 51820):

bash
# 放行51820端口(UDP) sudo firewall-cmd --permanent --add-port=51820/udp # 重新加载防火墙配置 sudo firewall-cmd --reload

6.启动 WireGuard 服务

一切就绪后,启动并设置 WireGuard 开机自启:

bash
# 启动wg0接口 sudo wg-quick up wg0 # 设置开机自动启动 sudo systemctl enable wg-quick@wg0 # 查看运行状态 sudo wg show

配置客户端(以Windows为例)

1.安装 WireGuard 客户端

WireGuard 官网(需要科学上网) 下载并安装对应你操作系统的客户端。

2.生成客户端密钥对

打开 WireGuard 客户端,创建一个新隧道。在隧道编辑界面,通常会有个“生成密钥对”的按钮或自动生成一对公钥和私钥。请务必保存好这对密钥,并复制下客户端公钥,稍后需要填到服务器配置文件中。

image.png

3.创建客户端配置文件

在客户端的隧道编辑界面,填入以下配置信息:

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

4.将客户端信息添加到服务器

回到服务器,编辑 /etc/wireguard/wg0.conf 文件,在文件末尾添加一个新的 [Peer] 块(如果之前只配置了一个示例的话,可以覆盖它),填入刚刚生成的客户端公钥和分配的IP:

ini
[Peer] PublicKey = <客户端公钥> AllowedIPs = 10.0.0.2/32

5.重启服务器端 WireGuard 并连接客户端

在 VPS 上重启 WireGuard 使新配置生效:

bash
sudo wg-quick down wg0 sudo wg-quick up wg0 # 或 sudo wg-quick down wg0 && sudo wg-quick up wg0

然后点击客户端的“连接”按钮。如果一切顺利,该客户端就通过加密的 WireGuard 隧道连接到服务器了。

问题

1.连接上隧道后无法访问网络

  1. 验证客户端与服务器的隧道是否正常

在客户端上执行:

bash
ping 10.0.0.1
  • 预期结果:成功收到回复,说明隧道本身是通的。

  • 如果失败:检查客户端和服务器配置中的公钥、IP 是否匹配,以及服务器防火墙是否放行了 UDP 端口(51820)。

  1. 检查服务器端 IP 转发是否开启

在服务器上执行:

bash
sudo 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

  1. 检查 iptables NAT 规则是否生效

在服务器上执行:

bash
sudo iptables -t nat -L POSTROUTING -v
  • 预期输出:应有一条针对 eth0 的 MASQUERADE 规则,例如:
bash
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 MASQUERADE all -- any eth0 anywhere anywhere
  • 如果没有:重新应用 WireGuard 配置:sudo wg-quick down wg0 && sudo wg-quick up wg0,或手动添加规则:
bash
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE sudo iptables -A FORWARD -i wg0 -j ACCEPT

搭建 Tinyproxy

以下以 LoongProxy 为例 要实现不同的 VPN 隧道客户端走不同的静态住宅 IP(即不同的 LoongProxy 出口),最直接的办法是启动多个 Tinyproxy 实例,每个实例监听不同的端口,并配置不同的上游代理(LoongProxy 的 IP 和端口)。然后,不同的客户端在连接 VPN 后,根据需要设置代理端口为对应的端口即可。

准备工作:获取多个 LoongProxy 代理

购买了多个静态住宅 IP,LoongProxy 提供了多个 HTTP/SOCKS5 代理地址,以HTTP为例:

  • 代理1: user1
    @ip1
  • 代理2: user2
    @ip2

每个客户端将使用一个独立的代理。

1.安装 Tinyproxy

bash
sudo dnf install tinyproxy -y

配置文件为 /etc/tinyproxy/tinyproxy.conf

2.配置多个 Tinyproxy 实例

2.1 创建多个配置文件

为每个代理创建一个独立的 Tinyproxy 配置文件,放在 /etc/tinyproxy/ 目录下,例如 tinyproxy-1.conftinyproxy-2.conf

以代理1为例,创建 /etc/tinyproxy/tinyproxy-1.conf

bash
sudo cp /etc/tinyproxy/tinyproxy.conf /etc/tinyproxy/tinyproxy-1.conf sudo vim /etc/tinyproxy/tinyproxy-1.conf

修改以下关键参数:

  • Port:每个实例使用不同的端口,例如 88818882 等。
ini
Port 8881
  • PidFile:为避免冲突,设置不同的 pid 文件(可选):
ini
PidFile "/var/run/tinyproxy/tinyproxy-1.pid"
  • LogFile:可以设置不同的日志文件(可选):
ini
LogFile "/var/log/tinyproxy/tinyproxy-1.log"
  • Upstream:配置对应的 LoongProxy HTTP/SOCKS5 代理:
ini
Upstream http user1:pass1@ip1:port1 # 或 Upstream socks5 user1:pass1@ip1:port1
  • Allow:配置为允许 WireGuard 子网访问:
ini
# 注释掉默认的 Allow 127.0.0.1 #Allow 127.0.0.1 # 添加允许你的 VPN 虚拟网段访问 Allow 10.0.0.0/24

重复此步骤为代理2创建 tinyproxy-2.conf,使用端口 8882 和对应的上游代理信息。

2.2 创建 systemd 服务单元文件

为每个 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 和配置文件路径相应修改。

2.3 启动并启用服务

bash
sudo systemctl daemon-reload sudo systemctl start tinyproxy-1 sudo systemctl enable tinyproxy-1 sudo systemctl start tinyproxy-2 sudo systemctl enable tinyproxy-2

检查状态:

bash
sudo systemctl status tinyproxy-1 sudo systemctl status tinyproxy-2

确保两个实例都正常运行,并监听各自的端口:

bash
sudo ss -tlnp | grep 888x

3. 客户端配置

让不同的客户端在连接 WireGuard 后,将系统代理或应用代理指向不同的端口。

  • 客户端1:代理地址 10.0.0.1:8881
  • 客户端2:代理地址 10.0.0.1:8882

每个客户端访问 https://ip.oxylabs.io 时看到的将是不同的住宅 IP。

4. 验证

在每个客户端上(确保 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 一致。

5.注意事项

  • 资源消耗:每个 Tinyproxy 实例占用少量内存和文件描述符,合理控制实例数量。
  • 防火墙:确保 VPS 防火墙允许出站连接到 LoongProxy 的 IP 和端口。

6. 问题处理

6.1 ERROR: Could not create log file /var/log/tinyproxy/tinyproxy-1.log: Bad file descriptor.

检查日志目录是否存在及权限

bash
ls -ld /var/log/tinyproxy
  • 如果目录不存在,创建它并设置正确权限:
bash
sudo mkdir -p /var/log/tinyproxy sudo chown tinyproxy:tinyproxy /var/log/tinyproxy sudo chmod 755 /var/log/tinyproxy
  • 如果目录存在,检查其所有权和权限:
bash
ls -ld /var/log/tinyproxy

应显示 drwxr-xr-x 且所有者为 tinyproxy。如果不是,修正:

bash
sudo chown tinyproxy:tinyproxy /var/log/tinyproxy sudo chmod 755 /var/log/tinyproxy

6.2 tinyproxy-1.service: Can't open PID file '/run/tinyproxy/tinyproxy-1.pid' (yet?) after start: No such file or directory

PID 文件通常放在 /run/tinyproxy/ 下,该目录可能不存在,或者 tinyproxy 用户没有写入权限。

检查 /run/tinyproxy 是否存在:

bash
ls -ld /run/tinyproxy

如果不存在,创建它并设置正确的权限(通常 tinyproxy 以 nobody 或特定用户运行):

bash
sudo mkdir -p /run/tinyproxy sudo chown tinyproxy:tinyproxy /run/tinyproxy # 如果 tinyproxy 有专用用户 # 或者直接给 755 权限让系统用户可写 sudo chmod 755 /run/tinyproxy

如果 tinyproxy 以 root 启动(不推荐),则目录权限不是问题,但仍需确保路径正确。

WireGuard 无法握手

若出现 WireGuard 无法握手,且客户端能发送数据但是无法接收数据的情况,那么可能是因为运营商对UDP的干扰

既然 UDP 可能被干扰,可将 WireGuard 流量封装在 TCP 中,例如使用 udp2rawTinyFecVPN。这样能穿透大部分 UDP 封锁,代价是轻微性能损耗。

1.在服务端安装并配置 udp2raw

1.1 下载并安装 udp2raw

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

1.2 配置并启动 udp2raw 服务端

WireGuard 服务端目前监听的是 51821/udp。将让 udp2raw 监听一个 TCP 端口(例如 2443),并将所有收到的 TCP 流量解包后转发给本地的 WireGuard UDP 端口。

创建一个 systemd 服务来管理 udp2raw,确保它能够开机自启并在后台稳定运行。

bash
sudo 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

参数解释:

  • -s: 服务端模式;
  • -l 0.0.0.0:2443: 监听所有网络接口的 TCP 2443 端口,等待客户端连接;
  • -r 127.0.0.1:51821: 将解包后的 UDP 数据转发给本机的 WireGuard 服务端端口;
  • -k "your_password": 用于验证客户端的预共享密钥;
  • --raw-mode faketcp: 将 UDP 流量伪装成 TCP 数据包 。对于 Windows 客户端,可以尝试 faketcp 或 easyfaketcp;
  • -a: 自动应答,提高稳定性;

保存文件后,启动并启用服务:

bash
sudo systemctl daemon-reload sudo systemctl start udp2raw sudo systemctl enable udp2raw sudo systemctl status udp2raw

确保状态为 active (running)

1.3 防火墙放行 TCP 2443 端口

bash
sudo firewall-cmd --permanent --add-port=2443/tcp sudo firewall-cmd --reload

2.在客户端(Windows)安装并配置 udp2raw

2.1 下载 Windows 版 udp2raw

访问 udp2rawGitHub Releases 页面,下载最新的 udp2raw_binaries.tar.gz,解压后找到 udp2raw_mp.exe(多线程版本)或 udp2raw_x86.exe。将其放在一个固定目录,例如 C:\udp2raw\

2.2 创建 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

参数解释:

  • -c: 客户端模式;
  • -l 127.0.0.1:51820: 在本地监听 51820 端口,WireGuard 客户端将连接到这里;
  • -r your_server_ip:2443: 连接到 VPS 的 udp2raw 服务端;
  • -k "your_password": 与服务端相同的密钥;
  • --raw-mode easyfaketcp: Windows 客户端通常建议使用 easyfaketcp 以获得更好的兼容性;

2.3 安装 Npcap

Npcap 需要以正确模式安装才能支持 faketcp 模式发送原始包。

  1. 打开 控制面板 → 程序和功能,找到 Npcap,如果有的话,右键选择 卸载。
  2. 重新从 Npcap 官网 下载最新版安装包。
  3. 安装时务必勾选:
  • “WinPcap API-compatible Mode”(兼容 WinPcap API 模式)
  • “Install Npcap in WinPcap API-compatible Mode”(如果出现)
  • 建议同时勾选 “Support raw 802.11 traffic”(非必须)和 “Install in WinPpac API-compatible Mode”
  1. 安装完成后重启电脑,确保驱动生效。

2.4 以管理员身份运行并测试

右键点击 start_udp2raw.bat,选择 “以管理员身份运行”。首次运行可能会提示防火墙,请允许。如果一切顺利,命令行窗口会显示连接成功的信息,如 state changed to client_ready请保持此窗口一直运行(可以最小化)

3. 修改 WireGuard 客户端配置

修改 Windows 上的 WireGuard 客户端配置文件,将其 Endpoint 指向本地运行的 udp2raw 客户端 。

  1. 打开 WireGuard 客户端。
  2. 找到你之前使用的隧道配置,点击 “编辑”
  3. 修改 [Peer] 部分下的 Endpoint
  • 原配置Endpoint = 你的VPS公网IP:51821
  • 修改为Endpoint = 127.0.0.1:51820
  1. 确保其他配置(如 PrivateKeyAddressAllowedIPs 等)保持不变。
  2. 保存配置。

4. 启动并验证整条链路

  1. 确保服务端 udp2raw 和 WireGuard 都在运行。
  2. 在 Windows 上,以管理员身份运行 start_udp2raw.bat,观察是否出现 client_ready 状态。
  3. 连接 WireGuard 客户端:点击 WireGuard 客户端的 “连接” 按钮。
  4. 验证连通性:
  • 尝试 ping 10.0.0.1,看是否能通。
  • 尝试通过你的 Tinyproxy 访问网站,验证是否能正常上网。
  • 访问 https://ip.oxylabs.iohttps://whoer.net ,确认出口 IP 是你的 LoongProxy 住宅 IP。

5.注意事项与故障排查

  • 端口冲突:确保 udp2raw 客户端监听的 51820 端口没有被电脑上其他程序(如另一个 WireGuard 实例)占用。
  • 防火墙拦截:Windows 防火墙可能会拦截 udp2raw 或修改后的 WireGuard 连接。如果遇到问题,可以尝试临时关闭 Windows 防火墙进行测试 。
  • 启动顺序:建议的启动顺序是:VPS 服务 > Windows udp2raw 客户端 > Windows WireGuard 客户端。udp2raw 客户端必须先于 WireGuard 客户端启动并进入 ready 状态。
  • 日志观察:如果连接失败,仔细观察 udp2raw 命令行窗口的输出,它会提供详细的握手和错误信息 。
  • 性能损耗:由于增加了额外的封装和解封步骤,可能会有轻微的性能损耗,但对于日常使用和流媒体观看,影响通常可以忽略。

firewalld 防火墙相关

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 许可协议。转载请注明出处!