Skip to content

Latest commit

 

History

History
106 lines (79 loc) · 3.55 KB

File metadata and controls

106 lines (79 loc) · 3.55 KB

gotproxy

简体中文 | English

这是一个简单的基于eBpf使用GO语言编写的透明代理程序,可以进行全局或者按照特定的ip,进程id,进程名称进行透明代理。 该程序可以直接进行透明代理网络转发,支持socks5代理,可以替代redsocks,proxychains软件。也可以搭配其它代理软件或者L7层的代理实现分流,防火墙,MockServer的功能。

📦 安装和使用

安装

直接在release中下载二进制文件

自行编译

  1. 克隆git仓库:
    git clone https://github.com/Dream95/gotproxy.git
    cd gotproxy
    git submodule update --init --recursive
    ./init_env.sh
  2. 编译:
    make build-bpf && make

使用

gotproxy 需要 root 权限才能运行.

sudo ./gotproxy [flags]
Flag 描述
--cmd 需要代理的进程名称. 如果没有配置,则会进行全局流量代理.
--pids 需要代理的进程id, 按照逗号进行分割.
--container-name 需要代理的容器名称(Docker 运行中的容器名)。
--ip 需要代理的目标ip. 支持ipv4和ipv4 CIDR.
--p-pid 代理程序的进程id. 会自动过滤不代理该进程的网络通信,以免网络循环。如果没有配置, 本程序会自动启动一个转发代理服务.
--p-port 代理服务监听的端口。
--socks5 socks5代理的服务端地址,如果配置,会进行socks5代理.
--socks5-user socks5 账号(RFC1929)。需要同时设置 --socks5-pass
--socks5-pass socks5 密码(RFC1929)。需要同时设置 --socks5-user
--proto 代理协议选择:both(默认)/ tcp / udp。当设置为 tcp 时只重定向 TCP 流量;设置为 udp 时只重定向 UDP 流量。
--no-dns53 关闭 UDP DNS 对 127.0.0.53:53 的自动改写。默认会自动改写为 1.1.1.1:53

正在开发中的功能: 支持ipv6

示例

  1. 代理一个特定的进程名称的网络代理:
sudo ./gotproxy --cmd "curl"
  1. 代理网络并进行socks5转发:
sudo ./gotproxy --socks5 192.168.1.2:1080

其中‘192.168.1.2:1080’是socks5代理服务器的ip和端口

也支持带账号密码的 socks5 上游:

sudo ./gotproxy --socks5 192.168.1.2:1080 --socks5-user alice --socks5-pass 'secret'
  1. 仅代理 TCP:
sudo ./gotproxy --proto tcp
  1. 仅代理 UDP:
sudo ./gotproxy --proto udp
  1. 按容器名称代理:
sudo ./gotproxy --container-name curl-test
  1. 容器名 + pid 同时过滤:
sudo ./gotproxy --container-name curl-test --pids 1234

当同时配置多个进程/容器过滤条件(如 --container-name--cmd--pids)时,使用 OR 关系:命中任意一个条件就会被代理。

已知限制:

  • 理论上应该根据5元组确定一个连接,但是考虑大多数情况目前只根据协议类型和源端口进行连接映射。
  • 在根据进程名称进行代理的场景中,如果进程启动了子进程并使用了execve执行一个新命令,会无法进行代理。
  • 目前的udp代理实现并不完善,某些场景下可能存在问题。
  • 默认会将 UDP DNS 目标 127.0.0.53:53 自动改写为 1.1.1.1:53;如需关闭可设置 --no-dns53

感谢

一些代码引用自: