WireGuard跨网段流量转发实战:Linux → Windows双VPN代理 + SNAT完整配置
VPN

WireGuard跨网段流量转发实战:Linux → Windows双VPN代理 + SNAT完整配置

mohuangNPC
2026-04-24 / 0 评论 / 4 阅读 / 正在检测是否收录...

前言

最近遇到一个wg节点之间相互访问的问题,记录一下操作过程

问题

涉及机器

  • 机器A(linux) 172.40.100.3
  • 本机B(windows) 172.32.100.2(vpn1),172.40.100.2(vpn2)

描述

机器A有一个需求,那就是访问172.32.100.6的流量时需要把流量转发给本机B,由本机B去代为请求,并正确响应,其中172.32.100.0/24(vpn1)与172.40.100.0/24(vpn2)分别隶属不同的wg peer端

解决步骤

机器A增加路由

首先机器A的AllowedIPs中需要增加一个172.32.100.6/32的路由,具体作用为当机器A访问172.32.100.6的相关流量时会走当前(vpn2)的网卡

vpn2服务端增加路由转发

接下来去172.40.100.0/24组网的wg服务端中,在wg的conf中的对应peer(172.40.100.2)中的AllowedIPs也增加172.32.100.6/32,目的为了当流量到服务端时,转发给本机A节点

验证机器A -> 本机B

此时本机B使用wireshark抓包vpn2网卡,在机器A中ping 172.32.100.6, 会发现已经可以抓到流量了

本机B配置IP转发

因为本机B是windows所以默认没有开启ip转发,执行命令

Set-NetIPInterface -InterfaceAlias "vpn1" -Forwarding Enabled
Set-NetIPInterface -InterfaceAlias "vpn2" -Forwarding Enabled

该命令的作用为将vpn1和vpn2开启ip转发,可以让vpn2的目标ip为172.32.100.6的流量转发给vpn1,但注意该命令非持久化,重启电脑或者网卡重新开启关闭就会失效,最好写到wg脚本中

//查看各个网卡转发是否开启
Get-NetIPInterface | Select-Object ifIndex,InterfaceAlias,AddressFamily,Forwarding
验证vpn2 -> vpn1

此时本机B使用wireshark抓包vpn1网卡,在机器A中ping 172.32.100.6, 会发现已经可以抓到流量了,172.40.100.x -> 172.32.100.6

进行SNAT

此时虽然vpn1可以收到,但是因为源ip为172.40.100.x, 所以回包可能会出现问题,此时需要做一个snat,执行命令

New-NetNat -Name "wg-nat" -InternalIPInterfaceAddressPrefix 172.40.100.0/24

该命令的作用是创建一个wg-nat规则,可以更改源ip,
粗暴理解:当某个包从A网卡到B网卡的时候,B网卡会收到的源IP会改为B网卡的IP
AI解释:当一个包从A网卡进入 → 被系统转发 → 从B网卡发出时 → 发出时源IP会被改成B网卡的IP(如果命中NAT规则)

  1. 包进入(zgbzw2), 不改
  2. 系统决定转发 , 查路由
  3. 从 vpn 发出去 , 此时 NAT 生效 , 改源IP
//获取nat规则
 Get-NetNat
 //删除nat规则
 Remove-NetNat -Name "wg-nat"
验证

此时在机器A中ping 172.32.100.6即可成功

0

评论 (0)

取消