网上在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连接共享!!
若需每次启动计算机就自动进行连接共享,可以创建任务计划程序,每次启动后执行以下ps1脚本。脚本中的网络连接名称需根据实际情况自行修改。
$NetShare = New-Object -ComObject HNetCfg.HNetShare
$Wan = $null
$Lan = $null
foreach ($int in $NetShare.EnumEveryConnection) {
$props = $NetShare.NetConnectionProps.Invoke($int)
if ($props.Name -eq "本地连接") {
$Wan = $int;
}
if ($props.Name -eq "wg_server") {
$Lan = $int;
}
}
$WanConfig = $NetShare.INetSharingConfigurationForINetConnection.Invoke($Wan);
$LanConfig = $NetShare.INetSharingConfigurationForINetConnection.Invoke($Lan);
$WanConfig.DisableSharing();
$LanConfig.DisableSharing();
$WanConfig.EnableSharing(0);
$LanConfig.EnableSharing(1);