简体中文 | English
这是一个简单的基于eBpf使用GO语言编写的透明代理程序,可以进行全局或者按照特定的ip,进程id,进程名称进行透明代理。 该程序可以直接进行透明代理网络转发,支持socks5代理,可以替代redsocks,proxychains软件。也可以搭配其它代理软件或者L7层的代理实现分流,防火墙,MockServer的功能。
安装
直接在release中下载二进制文件
自行编译
- 克隆git仓库:
git clone https://github.com/Dream95/gotproxy.git cd gotproxy git submodule update --init --recursive ./init_env.sh - 编译:
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
示例
- 代理一个特定的进程名称的网络代理:
sudo ./gotproxy --cmd "curl"- 代理网络并进行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'- 仅代理 TCP:
sudo ./gotproxy --proto tcp- 仅代理 UDP:
sudo ./gotproxy --proto udp- 按容器名称代理:
sudo ./gotproxy --container-name curl-test- 容器名 + 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。
一些代码引用自: