想让客户端出口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
相关推荐
爱吃烤鸡翅的酸菜鱼4 分钟前
Spring Boot 注解全栈指南:涵盖 Bean 注册、配置加载、请求映射、事务控制、数据校验等一网打尽
java·开发语言·spring boot·后端·spring
running up9 分钟前
Spring IOC与DI核心注解速查表
java·后端·spring
洛阳泰山11 分钟前
快速上手 MaxKB4J:开源企业级 Agentic 工作流系统在 Sealos 上的完整部署指南
java·人工智能·后端
bybitq13 分钟前
string,byte,rune,character?详解Golang编码-UTF-8
开发语言·后端·golang
无限进步_17 分钟前
【C语言】栈(Stack)数据结构的实现与应用
c语言·开发语言·数据结构·c++·后端·visual studio
czlczl2002092524 分钟前
Spring Boot + Redis :如何设计“登出”功能
spring boot·redis·后端
林太白28 分钟前
Rust01-认识安装
开发语言·后端·rust
羑悻的小杀马特41 分钟前
LRU Cache:高频访问数据的“智能保鲜舱”与经典淘汰艺术
c++·后端·lru cache·热点数据与冷数据
JaguarJack1 小时前
再推荐 10 个低调但非常实用的 PHP 包
后端·php
a程序小傲1 小时前
米哈游Java后端面试被问:Spring Boot Starter的制作原理
java·spring boot·后端