鍍金池/ 問(wèn)答/Linux  網(wǎng)絡(luò)安全  HTML/ 如何截獲并代理指定進(jìn)程的所有(或指定)流量

如何截獲并代理指定進(jìn)程的所有(或指定)流量

問(wèn)題描述

如何截獲并代理指定進(jìn)程的所有(或指定)流量(優(yōu)先考慮Windows),以此使指定程序的流量,而非全局流量通過(guò)VPN。

問(wèn)題出現(xiàn)的環(huán)境背景及自己嘗試過(guò)哪些方法

我們學(xué)校有一些網(wǎng)站需要掛VPN才能訪問(wèn),但每次掛VPN所有應(yīng)用的流量都會(huì)走VPN,不僅占用VPN的帶寬還會(huì)有較高的延遲。因此想自己寫(xiě)個(gè)小程序解決這個(gè)問(wèn)題,或有現(xiàn)成的軟件也是極好的。

我試過(guò)改路由表,但那樣適用性非常差,你必須得事先知道要通過(guò)VPN的流量的目標(biāo)地址,然后一個(gè)一個(gè)添加到路由表里。如果地址是動(dòng)態(tài)的,且非常多,人工添加就顯得不切實(shí)際了。

希望得到的結(jié)果

如果沒(méi)有現(xiàn)成的軟件,我希望知道相關(guān)的system call或其它函數(shù)才能自行實(shí)現(xiàn),例如獲取一個(gè)進(jìn)程所有的連接、代理指定連接和通過(guò)VPN轉(zhuǎn)發(fā)數(shù)據(jù)等函數(shù)。如果可以的話,我想用Node.js實(shí)現(xiàn)這種功能。

回答
編輯回答
萌二代

這種需求,在 Linux 上實(shí)現(xiàn)比 Windows 簡(jiǎn)單多了,下面簡(jiǎn)單介紹下思路,希望有所參考

Linux

利用 network namespace 建立一個(gè)獨(dú)立的網(wǎng)絡(luò)棧,在里面啟動(dòng) VPN 并設(shè)置成默認(rèn)路由,最后把需要 VPN 的進(jìn)程移到該 network namespace 即可。

Windows

有多種方法,這里說(shuō)一個(gè)比較容易實(shí)現(xiàn)的。

  1. 首先把 VPN 轉(zhuǎn)成 socket 代理。
  2. 通過(guò)注入 DLL 等方式劫持目標(biāo)進(jìn)程的 ws2_32.dll 的關(guān)鍵方法。
    例如 getaddrinfo, connect, send, recv 等等。
  3. 將劫持的流量轉(zhuǎn)發(fā)到 socket 代理。

這種方式需要調(diào)用 Windows API,純 node.js 可能做不了,不過(guò)可以找一下 node.js 的 Windows API 模塊試試。

2017年8月20日 03:27