需求
1 、我想通过 api 访问 openai 服务,开发环境在本地。
2 、我想无痛代理流量,并不想修改代码,所以应该涉及 dns 解析和类似 tun 代理的方式配合。
先前的实践
1 、使用过 socat 代理到 sock5 ,但这个需要修改 api_base ,后面 ssl 握手总有问题。
大家有什么工具推荐吗?感觉这个应该是比较普遍的需求?

已解决,谢谢各位。

proxifier

proxychains

sniproxy 代理加 socks5 ,hosts 写 127.0.0.1 ,最无痛的方式。

配置 iptables ,设置 tproxy

我还以为 Linux 配个环境变量就好了

proxychains

如果你是用的 python 的话,装个 socks 代理库,然后设置环境变量就行了requests 安装 pysockshttpx (openai 库用的 http client) 安装 socksio然后设置环境变量 HTTPS_PROXY=socks5://user:pass@host:port参考 www.python-httpx.org/advanced/proxies/

如果你是用的 Python 的话,假设本地已经有 http/socks5://127.0.0.1:7890 代理import osos.environ['HTTP_PROXY'] = ' 127.0.0.1:7890'os.environ['HTTPS_PROXY'] = ' 127.0.0.1:7890'

github.com/hmgle/graftcp github.com/rofl0r/proxychains-ng

看错了。。。。不要修改代码,忽略

github.com/nadoo/glider/tree/master/config/examples/9.transparent_proxy_without_dnsmasq

cgproxy -> 本机 v2ray tproxy -> socks5

我编写了监听 443 端口的程序,按照 https 解析 tls 的 hello 数据包,提取 SNI 里面的目标域名,然后进行转发。因此我只需要在 host 文件里面添加域名解析到我的服务就行,如下所示,此时系统任何程序访问 域名 时都会连接 127.0.0.1:443 我这个服务,我的服务代理转发这些请求,因此不需要修改任何客户端逻辑。 相关实现参考: www.agwa.name/blog/post/writing_an_sni_proxy_in_go当然这个方案只针对 tls 连接,其他流量需要自己编写相关代码。

用这个 直接 gg cmd github.com/mzz2017/gg

用 linux 的网络命名空间功能 + github.com/xjasonlyu/tun2socks + github.com/netblue30/firejail 可以实现:如果你的 socks 代理端口是本机的 7890 (注意必须是本机的),在本机上执行如下脚本 (这个脚本依赖 tun2socks):#!/bin/bashmkdir -p /etc/netns/proxy/echo nameserver 8.8.8.8 > /etc/netns/proxy/resolv.confip netns add proxyip netns exec proxy ip link set lo upip link add veth0 type veth peer name eth0 netns proxyip addr add 172.16.1.1/24 dev veth0ip link set veth0 upip netns exec proxy ip addr add 172.16.1.2/24 dev eth0ip netns exec proxy ip link set eth0 upip netns exec proxy ip route add default via 172.16.1.1 dev eth0 metric 10ip netns exec proxy ip tuntap add mode tun dev tun0ip netns exec proxy ip addr add 198.18.0.1/15 dev tun0ip netns exec proxy ip link set tun0 upip netns exec proxy ip route add default via 198.18.0.1 dev tun0 metric 1ip netns exec proxy nohup tun2socks -device tun0 -proxy socks5://172.16.1.1:7890 -interface eth0 > /var/log/proxy-tun2socks.log &然后使用 firejail 来执行应用程序,以下以 vscode 为例:firejail --noprofile --netns=proxy --quiet code我平常跑 vscode 和 jetbrains 全家桶都是用这种方式跑的。

tsocks.sourceforge.net/about.php配置文件写好,然后 tsocks python ./main.py 就行

直接搞个 openwrt 的旁路由吧,网关直接指向旁路由就好

运行前修改环境变量即可 export HTTP_PROXY=...export HTTPS_PROXY=...

这个我做过,利用 LD_PRELOADHook C 函数实现流量劫持到代理具体见: github.com/Intika-Linux-Proxy/Proxybound

vim ~/.bashrc然后添加以下内容:# set/unset clash proxyalias setproxy='export http_proxy=127.0.0.1:7890; export https_proxy=127.0.0.1:7890; export socks_proxy=127.0.0.1:7891'alias delproxy='unset http_proxy; unset https_proxy;unset socks_proxy'再执行一下:source ~/.bashrc打开终端默认不使用代理,需要使用的时候就执行一下 setproxy ,不需要使用的时候 delproxy 。方便得很

dae

#15 如果需要绕过代理访问本地局域网的其他主机,可以在末尾添加如下 4 行:echo 1 > /proc/sys/net/ipv4/ip_forwardiptables -t nat -I POSTROUTING -s 172.16.1.1/255.255.255.0 -j MASQUERADEip netns exec proxy ip route add 192.168.1.0/24 via 172.16.1.1 dev eth0ip netns exec proxy ip route add 10.0.0.0/24 via 172.16.1.1 dev eth0这将强制 192.168.1.0/24 和 10.0.0.0/24 网段不走代理

#22 加上这 4 行后就可以使用局域网其他主机的 socks 代理,比如把 socks5://172.16.1.1:7890 替换为 socks5://192.168.1.3:7890:ip netns exec proxy nohup tun2socks -device tun0 -proxy socks5://192.168.1.3:7890 -interface eth0 > /var/log/proxy-tun2socks.log &

1)proxychain2)iptables+tproxy3)旁路由4)gptapi.us任选其一即可

以前很流行的 github.com/zcotape/redsocks2

iptables + redsocks

github.com/semigodking/redsocks 这个才是

哪有那么麻烦啊,你都明确访问 openai 了,你把 openai route 到 tun 啊,tun 再走 socks 。

路由+tun2socks

requests 支持系统代理的,直接配置 http_proxy, https_proxy, all_proxy 即可。 docs.python-requests.org/en/latest/user/advanced/#proxies

谢谢各位。我最终采用 SNIProxy 的方案。我把我的解决方案粘贴一下:基于 gost 的 SNIProxy 方案时间:2024-06-18 15:28:561 、curl -LO github.com/go-gost/gost/releases/download/v3.0.0-rc8/gost_3.0.0-rc8_linux_amd64.tar.gztar zxvf gost*.tar.gz2 、启动sudo ./gost -L sni://:80 -L sni://:443 -F socks5://127.0.0.1:1081curl -H 'Host: www.google.com' 127.0.0.1 成功。3 、设置/etc/hosts127.0.0.1 generativelanguage.googleapis.com4 、清理 dns 缓存sudo systemctl restart systemd-resolvedsudo service nscd restartsudo service dnsmasq restart5 、重跑应用程序。成功。总结:1 、流量路径:应用程序请求 generativelanguage.googleapis.com -> 本地 dns 解析到 127.0.0.1 -> gost sni 代理 -> 本地 v2ray socks5 代理 -> balabala... ->(远程 DNS 解析)2 、效果:应用程序不用做任何改动,同时能够细粒度地控制需要走 proxy 的域名。参考:1 、 gost.run/concepts/proxy/2 、 gost.run/tutorials/protocols/sni/3 、 wener.me/story/sni-proxy#%E8%83%BD%E4%B8%8D%E8%83%BD%E4%B8%8D%E9%99%90%E5%88%B6%E5%9F%9F%E5%90%8D%E6%89%80%E6%9C%89%E9%83%BD%E4%BB%A3%E7%90%86=========================================gost 这个工具没细究,看起来有点 v2ray 的味道。