给没有「隧道分流 / Split Tunneling」功能的 VPN 补上这个能力:开着 VPN 的时候,让指定的软件走本地物理网卡,绕开 VPN。
底层用的是 ForceBindIP,本工具是它的图形界面。
Windows 10/11 · Python 3.8+ · 零第三方依赖 · 可打包成单文件 exe
开着 VPN,电脑上所有软件的流量默认都走 VPN。但有些软件你并不想让它走:
| 类型 | 为什么不该走 VPN |
|---|---|
| 远程桌面、ToDesk、向日葵、GameViewer | 要连内网机器,走 VPN 连不上或者极慢 |
| 百度网盘、迅雷、Motrix | 走 VPN 跑不满速度 |
| 微信、QQ、钉钉 | 容易触发异地登录告警 |
NordVPN 那种「分流」就是干这个的。你的 VPN 没有,就用这个工具。
:: 1. 查本地网卡 IP
ipconfig
:: 2. 以管理员身份打开 CMD
cd "C:\Program Files (x86)\ForceBindIP"
ForceBindIP64.exe 192.168.0.133 "D:\Softwares\Todesk\ToDesk.exe"
ForceBindIP64.exe 192.168.0.133 "C:\Program Files\Netease\GameViewer\GameViewer.exe"每加一个软件粘一行,IP 变了全部作废,而且做完不知道到底生没生效。
双击 run.bat → 勾选软件 → 点「用本地网络启动选中项」→ 点「验证选中项是否生效」。
1. 装 ForceBindIP(一次性,约 100KB)
从 https://r1ch.net/projects/forcebindip 下载安装,默认装到 C:\Program Files (x86)\ForceBindIP。
本工具会自动找到它,找不到时可以手动指定目录。
2. 跑本工具
需要 Python 3.8+(自带 tkinter 即可,不需要 pip install 任何东西)。
双击 run.bat或者直接:
python vpnblocker.py程序会自动弹 UAC 请求管理员权限。
3.(可选)自己打包便携版
python make_portable.py会自动下载官方 embeddable Python、从本机 Python 里补上 tkinter、连同源码一起打成
dist\VPNBlocker-portable.zip(解压后约 29 MB,压缩包约 14 MB)。
本机 Python 大版本必须和脚本顶部的 EMBED_VERSION 一致,否则 tkinter 的二进制对不上。
发布到 Release 时附件名保持 VPNBlocker-portable.zip 不变,下面那个 latest/download 直链才会一直有效。
build.bat 是老的 PyInstaller 单文件方案,仍然可用,但产物会被 Defender 误报(见下),不建议拿来分发。
⬇ 下载便携版 VPNBlocker-portable.zip · 查看全部版本
压缩包约 14 MB,里面带了官方的 Python 运行时。解压 → 双击 run.bat 就能用,本机什么都不用装。
VPNBlocker-portable\
├── run.bat ← 双击这个
├── 使用说明.txt
├── app\ ← 程序源码,可以自己看
└── python\ ← 官方 embeddable Python + tkinter
还是要先装 ForceBindIP(上面第 1 步)。便携版只免掉了 Python,没免掉 ForceBindIP。
为什么是绿色包而不是单个 exe?因为 PyInstaller 打出来的 exe 会被 Windows Defender
误判成 Trojan:Win32/Sabsik.TE.A!ml 直接拦截 —— 这是 PyInstaller 引导程序的已知误报,
和本项目代码无关。便携版跑的是 Python 软件基金会签名的 pythonw.exe,不触发这条规则,
UAC 弹窗还会显示「已验证的发布者:Python Software Foundation」。
(想自己打 exe 的话 build.bat 还在,但产物大概率会被杀软拦,不建议用来分发。)
打开就自动选好了 —— 程序会枚举所有网卡,排掉 VPN 虚拟网卡(TAP / OpenVPN / WireGuard)、 Hyper-V 和 WSL 虚拟交换机、蓝牙、回环,只留下真正在上网的物理网卡。
绑定方式建议保持默认的「网卡 GUID」:GUID 是网卡的唯一标识,路由器重新分配 IP 也不会失效。 选「IP 地址」的话,IP 一变就得重新设置。
「兼容模式 -i」是 ForceBindIP 的一个开关,少数软件需要它才能绑定成功。默认不勾, 如果某个软件启动后验证显示没生效,勾上再试一次。
四种方式,随便用哪种:
- + 添加软件 → 从正在运行的程序里选 —— 列出当前有窗口的程序,像 NordVPN 那样勾选
- + 添加软件 → 浏览 exe 文件 —— 标准的文件选择框,可多选
- + 添加软件 → 粘贴完整路径 —— 直接把路径粘进去
- 扫描已安装软件 —— 扫开始菜单 + 注册表 + 运行中进程,★ 标记的是推荐分流的软件
- 也可以直接把 exe 拖进窗口
扫描已安装软件:
从正在运行的程序里选(上面的搜索框可以过滤):
第一次运行会自动加上并勾选远程桌面 mstsc.exe —— 开着 VPN 上外网、同时远程连内网机器,
是最常见的分流需求。
勾选之后点「▶ 用本地网络启动选中项」。日志里会打印实际执行的完整命令,方便你对照排错。
必须通过这个工具启动才有效。 绑定是在程序启动那一刻完成的,你双击桌面图标启动的软件不受本工具管。 如果软件已经在运行,工具会提示你先结束再启动(微信、ToDesk 这类单实例软件尤其重要 —— 直接再启动只会唤起旧窗口,绑定不会生效)。
启动后在软件里做一次联网操作,再点「✔ 验证选中项是否生效」。工具会查这个进程的 TCP/UDP 端点, 看本地地址是不是你选的那张网卡:
| 结果 | 含义 |
|---|---|
| ✔ 走本地 | 确认绑定成功 |
| × 没走本地 | 没绑上,仍然走默认路由(VPN)。会告诉你实际绑到哪张网卡了 |
| ! 走本机代理 | 这个软件连的是 127.0.0.1:xxxx,走的是本地代理,ForceBindIP 管不到(见下) |
| 暂时看不出来 | 进程还没产生带具体地址的连接,先在软件里点一下联网操作 |
日志第一行就是实际执行的 ForceBindIP 命令,出问题时可以直接照着它到 CMD 里复现。 (截图里的「演示程序」是截图用的测试进程,实际使用时这里就是 ToDesk、微信这些。)
不知道怎么用可以点右上角「使用说明」,里面写清楚了原理、步骤和限制:
这些是 ForceBindIP 本身的限制,不是本工具的 bug:
- DNS 可能泄漏。 ForceBindIP 只绑定程序自己的 socket,DNS 查询仍然走系统默认网关(可能是 VPN)。 绝大多数场景没影响;如果你要求连 DNS 都不能泄漏,ForceBindIP 做不到。
- 对本地代理型 VPN 无效。 如果你用的是 Clash / v2ray 这种模式(软件连的是
127.0.0.1:7890), 真正对外发包的是代理程序,不是这个软件,绑定它没有意义。要在代理软件的规则里放行, 或者在该软件里关掉代理。验证功能会明确告诉你是不是这种情况。 Clash 的 TUN 模式是虚拟网卡,属于本工具能处理的范围。 - 反注入的程序会失败。 带反调试/反作弊保护的程序(不少游戏)会拒绝 DLL 注入。
- 子进程不一定继承绑定。 会自己拉起子进程的软件,子进程可能仍然走 VPN。
- 被启动的软件继承管理员权限。 副作用:以管理员运行的微信、百度网盘, 没法直接从资源管理器把文件拖进去。
| 文件 | 作用 |
|---|---|
vpnblocker.py |
程序入口 + 主窗口 |
netinfo.py |
网卡枚举、VPN/虚拟网卡过滤 |
forcebind.py |
定位 ForceBindIP、读 PE 头判 32/64 位、启动并回查目标 PID |
procinfo.py |
ctypes 进程枚举、按路径查 PID、结束进程 |
verify.py |
查 TCP/UDP 端点判断流量走哪张网卡 |
appscan.py |
扫描已安装软件 |
appconfig.py |
配置读写 |
dnd.py |
ctypes 实现的文件拖放 |
dialogs.py |
各种弹窗 |
winutil.py |
PowerShell 调用封装 |
run.bat |
双击运行(需要本机装了 Python) |
make_portable.py |
组装便携版 zip(自带 Python 运行时) |
build.bat |
老的 PyInstaller 单文件方案,会被杀软误报,保留备用 |
img/ |
README 用的截图 |
配置文件在 %APPDATA%\VPNBlocker\config.json。
只用 Python 标准库(tkinter / ctypes / winreg / subprocess)。零第三方依赖。
打包才需要 pyinstaller,build.bat 会自动装。
在 Windows 11 + Python 3.11.9 上验证过:
- 绑定到以太网 GUID → 程序 socket 的本地地址是
192.168.0.133,连接正常 - 绑定到 Hyper-V 虚拟交换机 GUID → 本地地址变成
172.24.192.1,连接报「网络不可达」
也就是说 IP 和 GUID 两种绑定方式都真实生效,验证功能能如实反映绑定结果。
核心能力来自 ForceBindIP(作者 Richard Stanway), 本项目只是给它做了一个好用的图形界面,不包含也不分发 ForceBindIP 本身。




