如何截获并代理指定进程的所有(或指定)流量

问题描述

如何截获并代理指定进程的所有(或指定)流量(优先考虑Windows),以此使指定程序的流量,而非全局流量通过VPN。

问题出现的环境背景及自己尝试过哪些方法

我们学校有一些网站需要挂VPN才能访问,但每次挂VPN所有应用的流量都会走VPN,不仅占用VPN的带宽还会有较高的延迟。因此想自己写个小程序解决这个问题,或有现成的软件也是极好的。

我试过改路由表,但那样适用性非常差,你必须得事先知道要通过VPN的流量的目标地址,然后一个一个添加到路由表里。如果地址是动态的,且非常多,人工添加就显得不切实际了。

希望得到的结果

如果没有现成的软件,我希望知道相关的system call或其它函数才能自行实现,例如获取一个进程所有的连接、代理指定连接和通过VPN转发数据等函数。如果可以的话,我想用Node.js实现这种功能。

阅读 5.9k
2 个回答

这种需求,在 Linux 上实现比 Windows 简单多了,下面简单介绍下思路,希望有所参考

Linux

利用 network namespace 建立一个独立的网络栈,在里面启动 VPN 并设置成默认路由,最后把需要 VPN 的进程移到该 network namespace 即可。

Windows

有多种方法,这里说一个比较容易实现的。

  1. 首先把 VPN 转成 socket 代理。
  2. 通过注入 DLL 等方式劫持目标进程的 ws2_32.dll 的关键方法。
    例如 getaddrinfo, connect, send, recv 等等。
  3. 将劫持的流量转发到 socket 代理。

这种方式需要调用 Windows API,纯 node.js 可能做不了,不过可以找一下 node.js 的 Windows API 模块试试。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题