您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“l(fā)inux中如何安裝使用graftcp ”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“l(fā)inux中如何安裝使用graftcp ”這篇文章吧。
簡介
graftcp 可以把任何指定程序(應(yīng)用程序、腳本、shell 等)的 TCP 連接重定向到 SOCKS5 或 HTTP 代理。
對比 tsocks、proxychains 或 proxychains-ng,graftcp 并不使用 LD_PRELOAD 技巧來劫持共享庫的 connect()、getaddrinfo() 等系列函數(shù)達(dá)到重定向目的,這種方法只對使用動態(tài)鏈接編譯的程序有效。
對于靜態(tài)鏈接編譯出來的程序,例如默認(rèn)選項(xiàng)編譯的 Go 程序,proxychains-ng 就無效了。graftcp 使用 ptrace(2) 系統(tǒng)調(diào)用跟蹤或修改任意指定程序的 connect 信息,對任何程序都有效。工作原理后面將會解釋。
項(xiàng)目地址:https://github.com/hmgle/graftcp
安裝
graftcp 在 Linux 系統(tǒng)內(nèi)運(yùn)行。graftcp-local 使用 Go 編寫, Go 環(huán)境是必需的。
$ git clone https://github.com/hmgle/graftcp.git $ cd graftcp $ make
make 執(zhí)行完后,即可運(yùn)行 graftcp-local/graftcp-local 和 ./graftcp。你也可以把它們都安裝進(jìn)系統(tǒng):
$ sudo make install
之后 graftcp-local 會隨著系統(tǒng)啟動而自動運(yùn)行。
用法參數(shù)
graftcp-local:
$ graftcp-local/graftcp-local -h Usage of graftcp-local/graftcp-local: -config string Path to the configuration file -http_proxy string http proxy address, e.g.: 127.0.0.1:8080 -listen string Listen address (default ":2233") -logfile string Write logs to file -loglevel value Log level (0-6) (default 1) -pipepath string Pipe path for graftcp to send address info (default "/tmp/graftcplocal.fifo") -select_proxy_mode string Set the mode for select a proxy [auto | random | only_http_proxy | only_socks5] (default "auto") -service string Control the system service: ["start" "stop" "restart" "install" "uninstall"] -socks5 string SOCKS5 address (default "127.0.0.1:1080") -syslog Send logs to the local system logger (Eventlog on Windows, syslog on Unix)
graftcp:
$ graftcp -h Usage: graftcp [options] prog [prog-args] Options: -a --local-addr=<graftcp-local-IP-addr> graftcp-local's IP address. Default: localhost -p --local-port=<graftcp-local-port> Which port is graftcp-local listening? Default: 2233 -f --local-fifo=<fifo-path> Path of fifo to communicate with graftcp-local. Default: /tmp/graftcplocal.fifo -b --blackip-file=<black-ip-file-path> The IP in black-ip-file will connect direct -w --whiteip-file=<white-ip-file-path> Only redirect the connect that destination ip in the white-ip-file to SOCKS5 -n --not-ignore-local Connecting to local is not changed by default, this option will redirect it to SOCKS5 -h --help Display this help and exit
使用示例
假設(shè)你正在運(yùn)行默認(rèn)地址 "localhost:1080" 的 SOCKS5 代理,首先啟動 graftcp-local:
$ graftcp-local/graftcp-local
通過 graftcp 安裝來自 golang.org 的 Go 包:
$ ./graftcp go get -v golang.org/x/net/proxy
通過 graftcp 打開 Chromium / Chrome / Firefox 瀏覽器,網(wǎng)頁的所有請求都會重定向到 SOCKS5 代理:
$ ./graftcp chromium-browser
通過 graftcp 啟動 Bash / Zsh / Fish,在這個新開的 shell 里面執(zhí)行的任何新命令產(chǎn)生的 TCP 連接都會重定向到 SOCKS5 代理:
% ./graftcp bash $ wget https://www.google.com
工作原理
要達(dá)到重定向一個 app 發(fā)起的的 TCP 連接到其他目標(biāo)地址并且該 app 本身對此毫無感知的目的,大概需要這些條件:
fork(2) 一個新進(jìn)程,通過 execve(2) 啟動該 app,并使用 ptrace(2) 進(jìn)行跟蹤,在 app 執(zhí)行每一次 TCP 連接前,捕獲并攔截這次 connect(2) 系統(tǒng)調(diào)用,獲取目標(biāo)地址的參數(shù),并通過管道傳給 graftcp-local。
修改這次 connect(2) 系統(tǒng)調(diào)用的目標(biāo)地址參數(shù)為 graftcp-local 的地址,然后恢復(fù)執(zhí)行被中斷的系統(tǒng)調(diào)用。返回成功后,這個程序以為自己連的是原始的地址,但其實(shí)連的是 graftcp-local 的地址。這個就叫“移花接木”。
graftcp-local 根據(jù)連接信息和目標(biāo)地址信息,與 SOCKS5 proxy 建立連接,把 app 的請求的數(shù)據(jù)重定向到 SOCKS5 proxy。
這里可能有個疑問:既然可以修改任何系統(tǒng)調(diào)用的參數(shù),那么通過修改 app 的 write(2) / send(2) 的參數(shù),直接往 buffer 里面附加原始目標(biāo)地址信息給 graftcp-local 不是更簡單嗎?答案是這無法做到。如果直接往運(yùn)行在子進(jìn)程的被跟蹤程序的 buffer 添加信息,可能會造成緩沖區(qū)溢出,造成程序崩潰或者覆蓋了其他數(shù)據(jù)。
另外,execve(2) 會分離所有的共享內(nèi)存,所以也不能通過共享內(nèi)存的方式讓被跟蹤的 app 的 write buffer 攜帶更多的數(shù)據(jù),因此這里采用管道方式給 graftcp-local 傳遞原始的目標(biāo)地址信息。
簡單的流程如下:
+---------------+ +---------+ +--------+ +------+ | graftcp | dest host | | | | | | | (tracer) +---PIPE----->| | | | | | | ^ | info | | | | | | | | ptrace | | | | | | | | v | | | | | | | | +---------+ | | | | | | | | | | | connect | | connect | | connect | | | | +--------------->| graftcp +-------->| SOCKS5 +-------->| dest | | | | | | -local | | or | | host | | | app | | req | | req | HTTP | req | | | |(tracee) +--------------->| +-------->| proxy +-------->| | | | | | | | | | | | | | | | resp | | resp | | resp | | | | |<---------------+ |<--------+ |<--------+ | | +---------+ | | | | | | | +---------------+ +---------+ +--------+ +------+
常見問題解答及技巧
有哪些重定向 TCP 連接的方式?
主要有:全局式、設(shè)置環(huán)境變量式和僅針對程序(或進(jìn)程)式。
全局式:比如使用 iptables + RedSocks 可以把系統(tǒng)符合一定規(guī)則的流量轉(zhuǎn)換為 SOCKS5 流量。這種方式的優(yōu)點(diǎn)是全局有效;缺點(diǎn)是所有滿足該規(guī)則的流量都被重定向了,影響范圍較大。
設(shè)置環(huán)境變量方式:一些程序啟動時會讀取 proxy 相關(guān)的環(huán)境變量來決定是否將自己的數(shù)據(jù)轉(zhuǎn)換為對應(yīng)代理協(xié)議的流量,比如 curl 會讀取 http_proxy, ftp_proxy, all_proxy 環(huán)境變量并根據(jù)請求 scheme 來決定轉(zhuǎn)換為哪種代理流量。這種方法只有程序本身實(shí)現(xiàn)了轉(zhuǎn)換的功能才有效,局限性較大。
僅針對程序方式:這種方式可以僅針對特定的程序執(zhí)行重定向,比如 tsocks 或 proxychains。如前面提到,它們之前都是使用 LD_PRELOAD 劫持動態(tài)庫方式實(shí)現(xiàn),對 Go 之類默認(rèn)靜態(tài)鏈接編譯的程序就無效了。graftcp 改進(jìn)了這一點(diǎn),能夠重定向任何程序的 TCP 連接。
如果應(yīng)用程序連接的目標(biāo)地址是本機(jī),使用 graftcp 會把該連接重定向到 SOCKS5 代理嗎?
不會。默認(rèn)會忽略目標(biāo)地址為本地的連接,如果想重定向所有地址的話,可以使用 -n選項(xiàng)。如果想忽略更多的地址,可以把它們加入黑名單 IP 文件;如果想僅重定向某些 IP 地址,可以把這些地址加入白名單 IP 文件。使用 graftcp --help 獲取設(shè)置參數(shù)。
我的 DNS 請求受到污染,graftcp 會處理 DNS 請求嗎?
不會。graftcp 目前僅處理 TCP 連接。建議使用 dnscrypt-proxy 或 ChinaDNS 等方式解決 DNS 污染問題。
clone(2) 參數(shù)有個叫 CLONE_UNTRACED 的標(biāo)志位,可以避免讓父進(jìn)程跟蹤到自己,graftcp 是如何做到強(qiáng)制跟蹤的?
graftcp 在子進(jìn)程調(diào)用 clone(2) 之前會把它攔截,清除這個 CLONE_UNTRACED 標(biāo)志位,所以被跟蹤的子進(jìn)程最終還是難逃被跟蹤的命運(yùn)。另外,這個 CLONE_UNTRACED 標(biāo)志位本意是給內(nèi)核使用的,普通程序不應(yīng)該去設(shè)置它。
Linux 提供了一種限制被 ptrace(2) 跟蹤的方法:設(shè)置 /proc/sys/kernel/yama/ptrace_scope 的值,若 ptrace(2) 失效,請檢查該值是否被修改過。
支持 macOS 嗎?
不。macOS 的 ptrace(2) 是個半殘品。不過理論上參考 DTrace那一套也能實(shí)現(xiàn)。
以上是“l(fā)inux中如何安裝使用graftcp ”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。