您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“linux中如何安裝使用graftcp ”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“linux中如何安裝使用graftcp ”這篇文章吧。
簡介
graftcp 可以把任何指定程序(應用程序、腳本、shell 等)的 TCP 連接重定向到 SOCKS5 或 HTTP 代理。
對比 tsocks、proxychains 或 proxychains-ng,graftcp 并不使用 LD_PRELOAD 技巧來劫持共享庫的 connect()、getaddrinfo() 等系列函數達到重定向目的,這種方法只對使用動態鏈接編譯的程序有效。
對于靜態鏈接編譯出來的程序,例如默認選項編譯的 Go 程序,proxychains-ng 就無效了。graftcp 使用 ptrace(2) 系統調用跟蹤或修改任意指定程序的 connect 信息,對任何程序都有效。工作原理后面將會解釋。
項目地址:https://github.com/hmgle/graftcp
安裝
graftcp 在 Linux 系統內運行。graftcp-local 使用 Go 編寫, Go 環境是必需的。
$ git clone https://github.com/hmgle/graftcp.git $ cd graftcp $ make
make 執行完后,即可運行 graftcp-local/graftcp-local 和 ./graftcp。你也可以把它們都安裝進系統:
$ sudo make install
之后 graftcp-local 會隨著系統啟動而自動運行。
用法參數
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
使用示例
假設你正在運行默認地址 "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 瀏覽器,網頁的所有請求都會重定向到 SOCKS5 代理:
$ ./graftcp chromium-browser
通過 graftcp 啟動 Bash / Zsh / Fish,在這個新開的 shell 里面執行的任何新命令產生的 TCP 連接都會重定向到 SOCKS5 代理:
% ./graftcp bash $ wget https://www.google.com
工作原理
要達到重定向一個 app 發起的的 TCP 連接到其他目標地址并且該 app 本身對此毫無感知的目的,大概需要這些條件:
fork(2) 一個新進程,通過 execve(2) 啟動該 app,并使用 ptrace(2) 進行跟蹤,在 app 執行每一次 TCP 連接前,捕獲并攔截這次 connect(2) 系統調用,獲取目標地址的參數,并通過管道傳給 graftcp-local。
修改這次 connect(2) 系統調用的目標地址參數為 graftcp-local 的地址,然后恢復執行被中斷的系統調用。返回成功后,這個程序以為自己連的是原始的地址,但其實連的是 graftcp-local 的地址。這個就叫“移花接木”。
graftcp-local 根據連接信息和目標地址信息,與 SOCKS5 proxy 建立連接,把 app 的請求的數據重定向到 SOCKS5 proxy。
這里可能有個疑問:既然可以修改任何系統調用的參數,那么通過修改 app 的 write(2) / send(2) 的參數,直接往 buffer 里面附加原始目標地址信息給 graftcp-local 不是更簡單嗎?答案是這無法做到。如果直接往運行在子進程的被跟蹤程序的 buffer 添加信息,可能會造成緩沖區溢出,造成程序崩潰或者覆蓋了其他數據。
另外,execve(2) 會分離所有的共享內存,所以也不能通過共享內存的方式讓被跟蹤的 app 的 write buffer 攜帶更多的數據,因此這里采用管道方式給 graftcp-local 傳遞原始的目標地址信息。
簡單的流程如下:
+---------------+ +---------+ +--------+ +------+ | 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 連接的方式?
主要有:全局式、設置環境變量式和僅針對程序(或進程)式。
全局式:比如使用 iptables + RedSocks 可以把系統符合一定規則的流量轉換為 SOCKS5 流量。這種方式的優點是全局有效;缺點是所有滿足該規則的流量都被重定向了,影響范圍較大。
設置環境變量方式:一些程序啟動時會讀取 proxy 相關的環境變量來決定是否將自己的數據轉換為對應代理協議的流量,比如 curl 會讀取 http_proxy, ftp_proxy, all_proxy 環境變量并根據請求 scheme 來決定轉換為哪種代理流量。這種方法只有程序本身實現了轉換的功能才有效,局限性較大。
僅針對程序方式:這種方式可以僅針對特定的程序執行重定向,比如 tsocks 或 proxychains。如前面提到,它們之前都是使用 LD_PRELOAD 劫持動態庫方式實現,對 Go 之類默認靜態鏈接編譯的程序就無效了。graftcp 改進了這一點,能夠重定向任何程序的 TCP 連接。
如果應用程序連接的目標地址是本機,使用 graftcp 會把該連接重定向到 SOCKS5 代理嗎?
不會。默認會忽略目標地址為本地的連接,如果想重定向所有地址的話,可以使用 -n選項。如果想忽略更多的地址,可以把它們加入黑名單 IP 文件;如果想僅重定向某些 IP 地址,可以把這些地址加入白名單 IP 文件。使用 graftcp --help 獲取設置參數。
我的 DNS 請求受到污染,graftcp 會處理 DNS 請求嗎?
不會。graftcp 目前僅處理 TCP 連接。建議使用 dnscrypt-proxy 或 ChinaDNS 等方式解決 DNS 污染問題。
clone(2) 參數有個叫 CLONE_UNTRACED 的標志位,可以避免讓父進程跟蹤到自己,graftcp 是如何做到強制跟蹤的?
graftcp 在子進程調用 clone(2) 之前會把它攔截,清除這個 CLONE_UNTRACED 標志位,所以被跟蹤的子進程最終還是難逃被跟蹤的命運。另外,這個 CLONE_UNTRACED 標志位本意是給內核使用的,普通程序不應該去設置它。
Linux 提供了一種限制被 ptrace(2) 跟蹤的方法:設置 /proc/sys/kernel/yama/ptrace_scope 的值,若 ptrace(2) 失效,請檢查該值是否被修改過。
支持 macOS 嗎?
不。macOS 的 ptrace(2) 是個半殘品。不過理論上參考 DTrace那一套也能實現。
以上是“linux中如何安裝使用graftcp ”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。