如何截获并代理指定进程的所有(或指定)流量
问题描述
如何截获并代理指定进程的所有(或指定)流量(优先考虑Windows),以此使指定程序的流量,而非全局流量通过VPN。
问题出现的环境背景及自己尝试过哪些方法
我们学校有一些网站需要挂VPN才能访问,但每次挂VPN所有应用的流量都会走VPN,不仅占用VPN的带宽还会有较高的延迟。因此想自己写个小程序解决这个问题,或有现成的软件也是极好的。
我试过改路由表,但那样适用性非常差,你必须得事先知道要通过VPN的流量的目标地址,然后一个一个添加到路由表里。如果地址是动态的,且非常多,人工添加就显得不切实际了。
希望得到的结果
如果没有现成的软件,我希望知道相关的system call或其它函数才能自行实现,例如获取一个进程所有的连接、代理指定连接和通过VPN转发数据等函数。如果可以的话,我想用Node.js实现这种功能。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这种需求,在 Linux 上实现比 Windows 简单多了,下面简单介绍下思路,希望有所参考
Linux
利用 network namespace 建立一个独立的网络栈,在里面启动 VPN 并设置成默认路由,最后把需要 VPN 的进程移到该 network namespace 即可。
Windows
有多种方法,这里说一个比较容易实现的。
例如 getaddrinfo, connect, send, recv 等等。
这种方式需要调用 Windows API,纯 node.js 可能做不了,不过可以找一下 node.js 的 Windows API 模块试试。
windows下也容易实现
1。采用WFP,NDIS,TDI等驱动拦截网络数据包,早期的加速他用VPN,lsp,apihook来拦截网络,但不适应现在的系统了。
2。拦截后把数据包转给应用层。
3。应用层根据数据包中的PID用socks5代理协议来实现分流。
这方面的东西专业研究了十来年了,可以参照8u18.com