问题描述
如何截获并代理指定进程的所有(或指定)流量(优先考虑Windows),以此使指定程序的流量,而非全局流量通过VPN。
问题出现的环境背景及自己尝试过哪些方法
我们学校有一些网站需要挂VPN才能访问,但每次挂VPN所有应用的流量都会走VPN,不仅占用VPN的带宽还会有较高的延迟。因此想自己写个小程序解决这个问题,或有现成的软件也是极好的。
我试过改路由表,但那样适用性非常差,你必须得事先知道要通过VPN的流量的目标地址,然后一个一个添加到路由表里。如果地址是动态的,且非常多,人工添加就显得不切实际了。
希望得到的结果
如果没有现成的软件,我希望知道相关的system call或其它函数才能自行实现,例如获取一个进程所有的连接、代理指定连接和通过VPN转发数据等函数。如果可以的话,我想用Node.js实现这种功能。
这种需求,在 Linux 上实现比 Windows 简单多了,下面简单介绍下思路,希望有所参考
Linux
利用 network namespace 建立一个独立的网络栈,在里面启动 VPN 并设置成默认路由,最后把需要 VPN 的进程移到该 network namespace 即可。
Windows
有多种方法,这里说一个比较容易实现的。
例如 getaddrinfo, connect, send, recv 等等。
这种方式需要调用 Windows API,纯 node.js 可能做不了,不过可以找一下 node.js 的 Windows API 模块试试。