溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

linux中如何安裝使用graftcp

發(fā)布時間:2021-12-16 11:56:57 來源:億速云 閱讀:295 作者:小新 欄目:系統(tǒng)運(yùn)維

這篇文章主要為大家展示了“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è)資訊頻道!

向AI問一下細(xì)節(jié)

免責(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)容。

AI