在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

問題描述

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

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

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

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

希望得到的結(jié)果

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

回答
編輯回答
萌二代

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

Linux

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

Windows

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

  1. 首先把 VPN 轉(zhuǎn)成 socket 代理。
  2. 通過注入 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 可能做不了,不過可以找一下 node.js 的 Windows API 模塊試試。

2017年8月20日 03:27