Windows中为WireGuard配置NAT的简单方法

网上在Linux使用IPtable为WireGuard进行NAT的教程很多,但却没有在Windows中的教程。

实际上在Windows中实现更加简单,但也缺乏一些自由性。下面以Windows7为例:

系统中存在两个接口:本地连接(接入外网的LAN),wg_server(WireGuard的接口)。

在“本地连接”的属性中,将其共享。配置“本地连接”的共享

共享后,此Windows7主机相当于充当了WireGuard虚拟局域网的路由器(网关),但虚拟局域网的IP只有一个(类似于真实局域网中公网IP只有一个),如果真实局域网中的终端想要访问虚拟局域网的终端,就像公网中的设备主动访问NAT内的设备一样,需要配置DMZ主机或者端口映射。

点击上图中的“设置”按钮。设置“端口映射”

确定后,Windows默认会将受共享接口(wg_server)的IP地址(网关地址)改为192.168.137.1,需要手动更改为WireGuard中设定的地址,或者重新连接WireGuard,将自动更改。

Windows7的该功能可能自动开启了DHCP,关闭方法未知,忽略警告暂未发现影响。

确定是有警告弹窗

在受共享的WireGuard终端配置文件中,应将被共享真实局域网的IP段加入到AllowedIPs中。若希望全局使用WireGuard隧道连接公网,则设置0.0.0.0,同时要配置::/0防止IPv6漏出。

客户端WireGuard配置文件

重新连接WireGuard后,即可在客户端连接到真实局域网内的终端了。

注意:每次重启服务端时,都需要重新设置一次Internet连接共享!!

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在 Windows 内核为结构体申请内存,可以使用内存分配函数来实现。常用的内存分配函数有 `ExAllocatePoolWithTag` 和 `ExAllocatePoolWithQuotaTag`。 使用方法如下: ```c #include <wdm.h> // 为结构体 MyStruct 申请内存 MyStruct *pStruct; pStruct = (MyStruct *)ExAllocatePoolWithTag(NonPagedPool, sizeof(MyStruct), 'Tag1'); if (pStruct == NULL) { // 申请内存失败 } else { // 申请内存成功,可以使用 pStruct 指针操作结构体内存 } ``` 需要注意的是,在使用完结构体内存之后,需要使用内存释放函数来释放申请的内存,否则会造成内存泄漏。常用的内存释放函数是 `ExFreePool`。 使用方法如下: ```c ExFreePool(pStruct); ``` ### 回答2: 在Windows内核为结构体申请内存,通常可通过以下步骤: 1. 首先,确定需要申请内存的结构体的大小,可以使用`sizeof`运算符来获取结构体的字节大小。 2. 接下来,使用`ExAllocatePoolWithTag`函数来申请内存。该函数需要传入内存池类型、内存大小和用于标记分配的标签参数。内存池类型常用的有`NonPagedPool`和`PagedPool`,非分页池(`NonPagedPool`)可以用于内核驻留程序,而分页池(`PagedPool`)则主要用于分页可调用驱动程序。 3. 申请内存后,可使用`memset`函数对内存进行清零操作,以初始化结构体内存。 4. 如果申请成功,将返回一个指向所分配内存的指针,可将其保存在一个指针变量,以便后续使用。 示例代码如下: ``` #include <ntddk.h> typedef struct _MY_STRUCT { // 结构体成员 // ... } MY_STRUCT, *PMY_STRUCT; PMY_STRUCT AllocateStructMemory() { PMY_STRUCT pStruct = NULL; pStruct = (PMY_STRUCT)ExAllocatePoolWithTag(NonPagedPool, sizeof(MY_STRUCT), 'MyTa'); if (pStruct != NULL) { // 清零内存 memset(pStruct, 0, sizeof(MY_STRUCT)); } return pStruct; } ``` 以上是在Windows内核为结构体申请内存的简单示例。需要根据实际需求进行相应的适配和调整,并确保正确释放内存,以避免内存泄漏或其他问题。 ### 回答3: 在Windows内核为结构体申请内存,可以使用ExAllocatePoolWithTag函数来实现。ExAllocatePoolWithTag函数是Windows内核提供的内存分配函数,可以用于在驱动程序申请内存。 首先,需要确定要申请的结构体的大小。根据结构体的成员变量类型和对齐方式,可以计算出结构体需要的内存大小。 然后,使用ExAllocatePoolWithTag函数来申请内存。该函数的参数包括所需内存的大小、内存分配标签以及内存分配类型。 内存分配标签是一个用于标识所分配内存的唯一值,可以使用自定义的标签。内存分配类型指定了内存分配的类型,例如NonPagedPool、PagedPool等。 调用ExAllocatePoolWithTag函数后,会返回一个指向已分配内存区域的指针。可以将这个指针强制类型转换为要分配的结构体的指针。 需要注意的是,在使用完内存后,要及时释放以免造成内存泄漏。可以使用ExFreePoolWithTag函数来释放已经申请的内存。 总结起来,在Windows内核为结构体申请内存的步骤如下: 1. 确定结构体的大小; 2. 使用ExAllocatePoolWithTag函数申请内存,指定内存大小、内存分配标签和类型; 3. 将返回的指针强制类型转换为结构体的指针; 4. 使用完内存后,使用ExFreePoolWithTag函数释放内存。 这样就可以在Windows内核为结构体成功申请内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值