分公司需要连接本部192.168.1.2:8080的某服务, 但不希望外网其他人可以访问。
首先想到的是路由器端口映射+Windows防火墙,但是分公司的IP使用的是PPPoE,地址是动态的。而Windows防火墙只支持设置静态IP。因此想到使用在分公司上绑定域名,192.168.1.2解析该域名,并动态创建出防火墙白名单。
方案如下:
- 设置本部路由器的端口映射, 外网8080端口映射到192.168.1.2:8080
- 分公司设置花生壳域名, test.com
- 在192.168.1.2上编写如下PowerShell脚本,并设置为开机自启动
$host.ui.RawUI.WindowTitle="刷新分公司的ip并加入防火墙白名单"
$SitesToBlock = "test.com"
$RuleName = "允许"
$oldIp = ""
cls
while (1) {
Try
{
echo "Parse domain $SitesToBlock 's ip"
$IPAddress = $SitesToBlock | Resolve-DnsName -NoHostsFile | Select-Object -ExpandProperty IPAddress
echo "Domain $SitesToBlock 's ip is: $IPAddress"
if ($IPAddress -ne $oldIp) {
echo "Refresh firewall rule"
Remove-NetFirewallRule -DisplayName "$RuleName" -ErrorAction Ignore
New-NetFirewallRule -DisplayName "$RuleName" -Direction Inbound -LocalPort "3000" -Protocol TCP -Action Allow -RemoteAddress "$IPAddress,192.168.1.0/24" -Description "要修改此规则,请修改'FlushLinyiCompanyFireWallRule.ps1'脚本, 否则变更会被脚本覆盖!"
}
$oldIp = $IPAddress
}
Catch
{
Write-Warning "Error occured: $Error"
}
timeout 10
}