想让客户端出口IP变成服务器IP?WireGuard这样配置就行

介绍

wireguard 是一款现代、轻量、高性能的VPN协议,设计目标是代替传统的IPsec、OpenVPN等方案,其核心优势"简单、高效、安全"。

  • 代码量小:仅约4000行代码。
  • UDP高效传输:使用udp协议,延迟低、速度快,尤其适合流媒体、游戏等实时性要求高的场景。
  • 现代加密算法:默认采用Curve25519(秘钥交换)、ChaCha20-Poly1305(数据加密与认证)、BLAKE2s(哈希)等抗量子计算的加密算法,安全性经过密码学社区广泛验证。
  • "无状态"设计:不维护复杂的会话状态,节点间通过"公钥-IP映射"直接通信,切换网络时隧道不中断。
  • 跨平台支持:原生集成于Linux内核(5.6+版本内置),同时支持windows、macOs、ios,、Android、FreeBSD等系统, 部署门槛低。

通过wireguard 可以远程访问内网,跨区域组网,云服务器代理。

服务端

通过docker安装wireguard,简单迅速。

安装docker、docker-compose
bash 复制代码
#先确保系统已更新并安装必要的依赖包
sudo dnf update -y
sudo dnf install -y yum-utils device-mapper-persistent-data lvm2
#添加 Docker 的官方 yum 源:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#从官方仓库安装 Docker
sudo dnf install -y docker-ce docker-ce-cli containerd.io
#安装完成后,启动 Docker 并设置开机自启:
sudo systemctl start docker
sudo systemctl enable docker
#使用 curl 下载最新版本的 Docker Compose:
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
#创建软链接
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
#验证安装
docker-compose --version
#docker-compose 启动命令
docker-compose up -d  # 启动容器
docker-compose down   # 停止容器
docker-compose.yml
bash 复制代码
#进入local目录下
cd /usr/local/
#新增docker-compose目录
mkdir docker-compose/
cd  docker-compose/
#新增docker-compose.yml文件

docker-compose.yml

ini 复制代码
version: "3.8"
services:
  wireguard:
    image: linuxserver/wireguard
    container_name: wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - PUID=0
      - PGID=0
      - TZ=Asia/Shanghai
      - SERVERURL=auto
      - SERVERPORT=51820
      - PEERS=1
      - PEERDNS=auto
      - INTERNAL_SUBNET=10.13.13.0/24
      - ALLOWEDIPS=10.13.13.2/32
      - PERSISTENTKEEPALIVE_PEERS=
      - LOG_CONFS=true
    volumes:
      - ./config:/config #挂载你的配置目录
      - /lib/modules:/lib/modules #建议直接挂载宿主机的 /lib/modules,这样容器能访问宿主机的内核模块。
    ports:
      - "51820:51820/udp"
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
      - net.ipv4.ip_forward=1 #开启 IP 转发
    restart: unless-stopped
注意事项
  • 服务器物理网卡和wireguard虚拟网卡的网段要分开,否则会导致路由冲突,VPN流量无法正常转发

  • wireguard服务端和客户端的虚拟网段要在同一个专用网段内,且每个节点必须唯一,不能重复。例如:

    • 服务端:10.13.13.1/24
    • 客户端1:10.13.13.2/24
    • 客户端2:10.13.13.3/24
  • wireguard服务端 wg0.conf 配置文件中:AllowedIPs 填写客户端虚拟网段

检查防火墙、添加开放端口
css 复制代码
#51820端口UDP放行。
firewall-cmd --zone=public --add-port=51820/udp --permanent
firewall-cmd --reload
#查看端口是否放行
firewall-cmd --list-all
firewall-cmd --zone=public --list-ports
启动docker
bash 复制代码
#启动容器
docker-compose up -d
容器加载iptables相关内核模块
perl 复制代码
#在宿主机执行(不是容器内):
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
#在宿主机执行:如果没有输出,说明内核没有加载相关模块。
lsmod | grep iptable
开启IP转发

IP转发是linux系统的"路由功能",允许流量从一个网络接口(如wg0)转发到另一个接口(如eth0公网网卡)

bash 复制代码
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl net.ipv4.ip_forward
  • 若返回 net.ipv4.ip_forward = 1,表示 IPv4 转发已开启(正确状态)。
  • 若返回 net.ipv4.ip_forward = 0,表示未开启(需要配置)。
添加NAT规则

服务器通过NAT规则将原源IP改为服务器的公网IP

bash 复制代码
#查看NAT规则,查看主网卡信息
ip addr

如果的主网卡是ehs9f0, 内网地址是 192.168.1.240/24,WireGuard 的 NAT 转发规则(MASQUERADE)就应该作用在这个网卡上。

css 复制代码
#修改/config/wg_confs/wg0.conf文件的 [Interface] 段落里的PostUp、PostDown
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ehs9f0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ehs9f0 -j MASQUERADE
访问流程

客户端通过隧道IP发送访问目标网站的请求,请求到达wireguard服务器wg0接口,IP转发请求转发到连接公网的物理网卡接口eth0, 经NAT规则处理后到达目标网站。

重启docker
bash 复制代码
#启动容器
docker-compose up -d
#查看容器日志
docker logs wireguard

出现以下输出便是成功了

css 复制代码
**** Activating tunnel /config/wg_confs/wg0.conf ****
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.13.13.1 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] ip -4 route add 10.10.10.2/32 dev wg0
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth+ -j MASQUERADE
**** All tunnels are now active ****
[ls.io-init] done.
进入容器
bash 复制代码
#进入容器
docker exec -it wireguard bash
#在容器内执行,以下输出说明filter表存在了
iptables -L 

客户端

windows下载地址

官方下载页面:www.wireguard.com/install/ 直接下载地址:download.wireguard.com/windows-cli...

连接

安装之后选择导入配置peer1.cnf进行连接,这个配置文件可以用wireguard 服务下的配置文件,挂载的配配置目录/config/peer1/下

客户端的AllowedIPs 配置成 0.0.0.0/0,这样全流量可以走WireGuard,公网IP为服务器的IP

可能遇到的问题
  • 如果连接不上,需要查看端口是否放行,wireguard是否正常运行
  • 如果连接上了,无法访问外网,查看IP转发和NAT规则是否正确和生效
  • 如果连接上了,公网IP不是服务端的IP,查看客户端配置AllowedIPs 有没有配置成 0.0.0.0/0
相关推荐
@ chen1 小时前
Spring Boot 解决跨域问题
java·spring boot·后端
转转技术团队2 小时前
转转上门隐私号系统的演进
java·后端
【本人】3 小时前
Django基础(二)———URL与映射
后端·python·django
Humbunklung3 小时前
Rust 模块系统:控制作用域与私有性
开发语言·后端·rust
WanderInk4 小时前
依赖对齐不再“失联”:破解 feign/BaseBuilder 错误实战
java·后端·架构
LaoZhangAI5 小时前
GPT-4o mini API限制完全指南:令牌配额、访问限制及优化策略【2025最新】
前端·后端
LaoZhangAI5 小时前
FLUX.1 API图像尺寸设置全指南:优化生成效果与成本
前端·后端
Kookoos5 小时前
ABP VNext + EF Core 二级缓存:提升查询性能
后端·.net·二级缓存·ef core·abp vnext
月初,6 小时前
SpringBoot集成Minio存储文件,开发图片上传等接口
java·spring boot·后端
KubeSphere6 小时前
全面升级!WizTelemetry 可观测平台 2.0 深度解析:打造云原生时代的智能可观测平台
后端