自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

終端程序不支持SOCKS5/HTTP代理怎么辦?有了這個神器后,終于可以跨越高山和大海了!

運維 系統(tǒng)運維
今天就給大家介紹一款神器 graftcp,graftcp 可以把任何指定的終端程序的 TCP 連接重定向到 SOCKS5 或 HTTP 代理,并且不會影響其它的終端程序。是不是很好的解決了你的痛點呢?

 [[285492]]

你是否經(jīng)常有在終端下通過一些實用程序進行工作的需求呢,比如:Git 等。但是由于這些終端程序默認(rèn)并不支持 Socks 5 代理或 HTTP 代理,在訪問一些需要科學(xué)上網(wǎng)的網(wǎng)絡(luò)服務(wù)時速度或許會非常的慢。

通常我們的解決方法就是使用環(huán)境變量 export ALL_PROXY=socks5://proxyAddress:port 或者 export http_proxy=http://proxyAddress:port 給所有終端程序配置一個全局代理,這樣做雖然有效但并不是最佳解決方案。

今天就給大家介紹一款神器 graftcp,graftcp 可以把任何指定的終端程序的 TCP 連接重定向到 SOCKS5 或 HTTP 代理,并且不會影響其它的終端程序。是不是很好的解決了你的痛點呢?

簡介

graftcp 可以把任何指定程序(應(yīng)用程序、腳本、shell 等)的 TCP 連接重定向到 SOCKS5 或 HTTP 代理。

對比 tsocks、proxychains 或 proxychains-ng,graftcp 并不使用 LD_PRELOAD 技巧來劫持共享庫的 connect()、getaddrinfo() 等系列函數(shù)達(dá)到重定向目的,這種方法只對使用動態(tài)鏈接編譯的程序有效。

對于靜態(tài)鏈接編譯出來的程序,例如默認(rèn)選項編譯的 Go 程序,proxychains-ng 就無效了。graftcp 使用 ptrace(2) 系統(tǒng)調(diào)用跟蹤或修改任意指定程序的 connect 信息,對任何程序都有效。工作原理后面將會解釋。   

  1. 項目地址:https://github.com/hmgle/graftcp 

安裝

graftcp 在 Linux 系統(tǒng)內(nèi)運行。graftcp-local 使用 Go 編寫, Go 環(huán)境是必需的。 

  1. $ git clone https://github.com/hmgle/graftcp.git  
  2. $ cd graftcp  
  3. $ make 

make 執(zhí)行完后,即可運行 graftcp-local/graftcp-local 和 ./graftcp。你也可以把它們都安裝進系統(tǒng): 

  1. $ sudo make install 

之后 graftcp-local 會隨著系統(tǒng)啟動而自動運行。

用法參數(shù)

graftcp-local: 

  1. $ graftcp-local/graftcp-local -h  
  2. Usage of graftcp-local/graftcp-local:  
  3.   -config string  
  4.         Path to the configuration file  
  5.   -http_proxy string  
  6.         http proxy address, e.g.: 127.0.0.1:8080  
  7.   -listen string  
  8.         Listen address (default ":2233")  
  9.   -logfile string  
  10.         Write logs to file  
  11.   -loglevel value  
  12.         Log level (0-6) (default 1)  
  13.   -pipepath string  
  14.         Pipe path for graftcp to send address info (default "/tmp/graftcplocal.fifo")  
  15.   -select_proxy_mode string  
  16.         Set the mode for select a proxy [auto | random | only_http_proxy | only_socks5] (default "auto")  
  17.   -service string  
  18.         Control the system service: ["start" "stop" "restart" "install" "uninstall"]  
  19.   -socks5 string  
  20.         SOCKS5 address (default "127.0.0.1:1080")  
  21.   -syslog  
  22.         Send logs to the local system logger (Eventlog on Windows, syslog on Unix) 

graftcp: 

  1. $ graftcp -h  
  2. Usage: graftcp [options] prog [prog-args]  
  3. Options:  
  4.   -a --local-addr=<graftcp-local-IP-addr>  
  5.                     graftcp-local's IP address. Default: localhost  
  6.   -p --local-port=<graftcp-local-port>  
  7.                     Which port is graftcp-local listening? Default: 2233  
  8.   -f --local-fifo=<fifo-path>  
  9.                     Path of fifo to communicate with graftcp-local.  
  10.                     Default: /tmp/graftcplocal.fifo  
  11.   -b --blackip-file=<black-ip-file-path>  
  12.                     The IP in black-ip-file will connect direct  
  13.   -w --whiteip-file=<white-ip-file-path>  
  14.                     Only redirect the connect that destination ip in the  
  15.                     white-ip-file to SOCKS5  
  16.   -n --not-ignore-local  
  17.                     Connecting to local is not changed by default, this  
  18.                     option will redirect it to SOCKS5  
  19.   -h --help  
  20.                     Display this help and exit 

使用示例

假設(shè)你正在運行默認(rèn)地址 "localhost:1080" 的 SOCKS5 代理,首先啟動 graftcp-local: 

  1. $ graftcp-local/graftcp-local 

通過 graftcp 安裝來自 golang.org 的 Go 包: 

  1. $ ./graftcp go get -v golang.org/x/net/proxy 

通過 graftcp 打開 Chromium / Chrome / Firefox 瀏覽器,網(wǎng)頁的所有請求都會重定向到 SOCKS5 代理: 

  1. $ ./graftcp chromium-browser 

通過 graftcp 啟動 Bash / Zsh / Fish,在這個新開的 shell 里面執(zhí)行的任何新命令產(chǎn)生的 TCP 連接都會重定向到 SOCKS5 代理:

 

  1. % ./graftcp bash  
  2. $ wget https://www.google.com 

工作原理

要達(dá)到重定向一個 app 發(fā)起的的 TCP 連接到其他目標(biāo)地址并且該 app 本身對此毫無感知的目的,大概需要這些條件:

  •  fork(2) 一個新進程,通過 execve(2) 啟動該 app,并使用 ptrace(2) 進行跟蹤,在 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)用。返回成功后,這個程序以為自己連的是原始的地址,但其實連的是 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 不是更簡單嗎?答案是這無法做到。如果直接往運行在子進程的被跟蹤程序的 buffer 添加信息,可能會造成緩沖區(qū)溢出,造成程序崩潰或者覆蓋了其他數(shù)據(jù)。

另外,execve(2) 會分離所有的共享內(nèi)存,所以也不能通過共享內(nèi)存的方式讓被跟蹤的 app 的 write buffer 攜帶更多的數(shù)據(jù),因此這里采用管道方式給 graftcp-local 傳遞原始的目標(biāo)地址信息。

簡單的流程如下: 

  1. +---------------+             +---------+         +--------+         +------+  
  2. |   graftcp     |  dest host  |         |         |        |         |      |  
  3. |   (tracer)    +---PIPE----->|         |         |        |         |      |  
  4. |      ^        |  info       |         |         |        |         |      |  
  5. |      | ptrace |             |         |         |        |         |      |  
  6. |      v        |             |         |         |        |         |      |  
  7. |  +---------+  |             |         |         |        |         |      |  
  8. |  |         |  |  connect    |         | connect |        | connect |      |  
  9. |  |         +--------------->| graftcp +-------->| SOCKS5 +-------->| dest |  
  10. |  |         |  |             | -local  |         |  or    |         | host |  
  11. |  |  app    |  |  req        |         |  req    | HTTP   |  req    |      |  
  12. |  |(tracee) +--------------->|         +-------->| proxy  +-------->|      |  
  13. |  |         |  |             |         |         |        |         |      |  
  14. |  |         |  |  resp       |         |  resp   |        |  resp   |      |  
  15. |  |         |<---------------+         |<--------+        |<--------+      |  
  16. |  +---------+  |             |         |         |        |         |      |  
  17. +---------------+             +---------+         +--------+         +------+ 

常見問題解答及技巧

有哪些重定向 TCP 連接的方式?

主要有:全局式、設(shè)置環(huán)境變量式和僅針對程序(或進程)式。

全局式:比如使用 iptables + RedSocks 可以把系統(tǒng)符合一定規(guī)則的流量轉(zhuǎn)換為 SOCKS5 流量。這種方式的優(yōu)點是全局有效;缺點是所有滿足該規(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)換為哪種代理流量。這種方法只有程序本身實現(xiàn)了轉(zhuǎn)換的功能才有效,局限性較大。

僅針對程序方式:這種方式可以僅針對特定的程序執(zhí)行重定向,比如 tsocks 或 proxychains。如前面提到,它們之前都是使用 LD_PRELOAD 劫持動態(tài)庫方式實現(xiàn),對 Go 之類默認(rèn)靜態(tài)鏈接編譯的程序就無效了。graftcp 改進了這一點,能夠重定向任何程序的 TCP 連接。

如果應(yīng)用程序連接的目標(biāo)地址是本機,使用 graftcp 會把該連接重定向到 SOCKS5 代理嗎?

不會。默認(rèn)會忽略目標(biāo)地址為本地的連接,如果想重定向所有地址的話,可以使用 -n選項。如果想忽略更多的地址,可以把它們加入黑名單 IP 文件;如果想僅重定向某些 IP 地址,可以把這些地址加入白名單 IP 文件。使用 graftcp --help 獲取設(shè)置參數(shù)。

我的 DNS 請求受到污染,graftcp 會處理 DNS 請求嗎?

不會。graftcp 目前僅處理 TCP 連接。建議使用 dnscrypt-proxy 或 ChinaDNS 等方式解決 DNS 污染問題。

clone(2) 參數(shù)有個叫 CLONE_UNTRACED 的標(biāo)志位,可以避免讓父進程跟蹤到自己,graftcp 是如何做到強制跟蹤的?

graftcp 在子進程調(diào)用 clone(2) 之前會把它攔截,清除這個 CLONE_UNTRACED 標(biāo)志位,所以被跟蹤的子進程最終還是難逃被跟蹤的命運。另外,這個 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那一套也能實現(xiàn),見issue 12?;蛟S有興趣的同學(xué)可以趟下這趟渾水。 

 

責(zé)任編輯:龐桂玉 來源: 運維之美
相關(guān)推薦

2023-11-01 07:14:55

2013-02-18 09:19:11

谷歌X PhoneNexus

2009-11-03 08:56:02

linux死機操作系統(tǒng)

2022-12-19 11:31:57

緩存失效數(shù)據(jù)庫

2022-07-05 11:48:47

MySQL死鎖表鎖

2022-02-21 14:32:32

SpringBoot框架微服務(wù)

2017-06-12 11:14:52

程序員技術(shù)停滯

2011-11-18 10:52:00

2022-07-05 14:19:30

Spring接口CGLIB

2022-10-14 08:18:07

Guavaweb應(yīng)用

2011-11-16 10:02:48

DNSDNS記錄DNS記錄消失

2013-01-22 10:54:51

HTML5App移動應(yīng)用

2021-05-26 10:15:52

開發(fā)技能工具

2023-12-25 08:22:02

2018-01-30 15:08:05

2020-07-10 08:46:26

HTTPS證書劫持網(wǎng)絡(luò)協(xié)議

2021-01-05 10:48:38

RedisAOF日志RDB快照

2024-08-06 08:08:14

2009-02-27 14:12:00

socks5代理服務(wù)器服務(wù)器

2020-02-24 11:02:37

斷網(wǎng)網(wǎng)絡(luò)故障
點贊
收藏

51CTO技術(shù)棧公眾號