用PowerShell与nftables实时监控Windows应用IP地址
开发者和网络管理员常需追踪应用程序连接的IP地址。静态IP列表极易过时,因区域CDN差异和路由路径变化频繁。本PowerShell脚本可实时捕获指定进程的活动(已建立)连接,过滤出公网IPv4地址,并推送至OpenWRT路由器,动态写入nftables规则。
脚本监控指定进程(默认为Telegram),从Get-NetTCPConnection中提取唯一远程地址,排除私有IP段及知名DNS服务器(如8.8.8.8、1.1.1.1),再通过SSH将IP加入nft集合。实现无需人工干预的实时流量管控。
脚本结构与参数配置
脚本支持关键参数,灵活适配不同场景:
ProcessName:要监控的进程名称(如"Telegram")OutputFile:记录IP的日志文件(如"telegram_ips.txt")PollSeconds:连接轮询间隔(默认3秒)RouterHost,RouterUser:SSH目标地址(如"192.168.1.1", "root")NftFamily,NftTable,NftSet:nftables上下文(如"inet", "fw4", "vpn_domains")UseTimeout:可选超时设置(如"1h")SshKeyPath:SSH私钥路径
逻辑采用HashSet去重,并通过字节级检查验证公网IP有效性。
过滤公网IPv4地址
Test-PublicIPv4函数排除RFC1918、链路本地、运营商级NAT及主流DNS地址:
function Test-PublicIPv4([string]$ip) {
try {
$addr = [System.Net.IPAddress]::Parse($ip)
} catch {
return $false
}
if ($addr.AddressFamily -ne [System.Net.Sockets.AddressFamily]::InterNetwork) {
return $false
}
$b = $addr.GetAddressBytes()
if ($b[0] -eq 10) { return $false }
if ($b[0] -eq 127) { return $false }
if ($b[0] -eq 169 -and $b[1] -eq 254) { return $false }
if ($b[0] -eq 172 -and $b[1] -ge 16 -and $b[1] -le 31) { return $false }
if ($b[0] -eq 192 -and $b[1] -eq 168) { return $false }
if ($b[0] -eq 100 -and $b[1] -ge 64 -and $b[1] -le 127) { return $false }
if ($ip -eq "0.0.0.0") { return $false }
if ($ip -eq "8.8.8.8") { return $false }
if ($ip -eq "8.8.4.4") { return $false }
if ($ip -eq "1.1.1.1") { return $false }
if ($ip -eq "1.0.0.1") { return $false }
return $true
}
有效避免本地流量与DNS解析器带来的误判。
与OpenWRT nftables集成
Add-IpToOpenWrt函数执行SSH命令,动态将IP添加至nft集合:
function Add-IpToOpenWrt([string]$ip) {
$target = "$RouterUser@$RouterHost"
if ($UseTimeout) {
$remoteCmd = "nft add element $NftFamily $NftTable $NftSet { $ip timeout $TimeoutValue } 2>/dev/null || true"
} else {
$remoteCmd = "nft add element $NftFamily $NftTable $NftSet { $ip } 2>/dev/null || true"
}
& ssh \
-i $SshKeyPath \
-o IdentitiesOnly=yes \
-o BatchMode=yes \
$target \
$remoteCmd | Out-Null
return $LASTEXITCODE
}
使用-o BatchMode=yes和|| true确保非交互式运行。带超时的条目自动过期,大幅降低维护成本。
主监控循环
在无限循环中:
Get-Process -Name $ProcessName获取进程ID。Get-NetTCPConnection | Where State -eq "Established" -and OwningProcess -eq $PID提取远程地址。- 新发现的公网IP被加入HashSet、日志文件及nftables。
Start-Sleep -Seconds $PollSeconds暂停后进行下一轮检测。
完整流程约3秒完成,兼顾响应速度与系统负载。
核心优势
- 动态追踪:实时获取真实连接的IP,跳过过时静态列表。
- 精准过滤:排除私有网段、DNS及回环地址,数据更干净。
- 自动化更新:直接通过SSH对接OpenWRT,无需API或网页界面。
- 去重机制:利用HashSet防止日志与nft集合中重复。
- 高度灵活:可配置任意进程、路由器或nft上下文。
超越Telegram的应用场景
该方案极具扩展性:将ProcessName替换为任意可执行程序(如Discord、Zoom、浏览器)。若需监控多个进程,可传入PID数组。也可改用Webhook对接外部系统。建议在虚拟机中测试:运行目标应用并生成流量,验证日志输出,再用nft list set检查结果。
— Editorial Team
暂无评论。