Linux下常见的代理配置方式是设置 ALL_PROXY
、 HTTP_PROXY
、 HTTPS_PROXY
之类的环境变量,但经常有软件不遵循规范,不使用这些代理配置,常见的就比如apt,更不必说大量的容器应用开发者根本没有考虑走代理的情况。
其实使用docker compose启动服务之后,使用 ip a
命令就可以查看到docker为这些服务自动创建了一个网桥(类似于br-0123456789ab
),连着这个网桥的有若干网卡,类似于vethbc685a6@if501
,这些网卡都是这组docker compose配置下各个容器的网卡。而有了这些网络接口,我们就可以监听并控制容器网络流量的方向,类似Clash TUN模式的网卡级代理就自然的成为了一个全局代理的解决方案。
dae是一个用 Go 语言开发,基于 eBPF 实现的网卡级代理工具。dae 支持多种代理协议,不仅限于 http 和 socks5,还支持常见的 trojan、vless 等。
下面简单演示一下如何用dae对docker compose启动的服务设置网卡级的代理。直接使用docker也是同样道理,只需要更改下面的lan_interface
配置为容器对应的网络接口(类似于vethbc685a6@if501
)就可以了。
我们先用docker手动创建一个网络组 your_proxy_net_name
作为代理网络组,
docker network create --driver bridge your_proxy_net_name
然后在使用docker compose创建服务时,特别注意指定容器网络,单独配置容器的网络组为your_proxy_net_name
,
services:
api:
container_name: your_container_name
networks:
- default
extra_hosts:
- "host.docker.internal:host-gateway"
networks:
default:
external: true
name: your_proxy_net_name
启动后用ip a
就可以看到我们刚刚创建的网桥的接口名,类似于br-0123456789ab
这样的,记下备用。
如果找不到的话,可以先进入your_container_name
容器中,用ip a
查看该容器的ip地址,回到主机中找到该ip地址对应的网卡(类似于vethbc685a6@if501
),再看它连接到的网桥是哪个(类似于br-0123456789ab
)。
再接着配置dae,直接用docker启动dae
docker run -d \
--name=dae \
--restart=always \
--network=host \
--pid=host \
--privileged \
-v /sys:/sys \
-v /etc/dae:/etc/dae \
daeuniverse/dae:latest
修改dae配置(路径为 /etc/dae/config.dae
),
参考配置 network-configs/dae/config.dae at main · sakarie9/network-configs · GitHub
global{
log_level: info
wan_interface: docker0
lan_interface: br-0123456789ab
auto_config_kernel_parameter: true
}
group {
my_group{
policy: fixed(0)
}
}
routing{
pname(systemd-resolved) -> must_direct
domain(suffix: aliyun.com) -> must_direct
fallback: my_group
}
node{
local:'socks5://localhost:10808'
}
wan_interface
处填写docker0这个网络接口,相当于直连的流量走这个出口。
我在测试的时候发现直接填eth0会有些问题,填eth0的时候还会转发docker daemon的流量,不知道是不是bug,关于本机网卡和 Docker 网卡,还可以看一下这篇解释:network programming - What is the relation between docker0 and eth0? - Stack Overflow
lan_interface
处就填写刚刚得到的网桥接口名br-0123456789ab
另外的routing是分流规则,node是代理节点,包括还有dns的配置,功能非常强大,更详细的说明请查阅dae的文档 dae/docs/zh/how-it-works.md at main · daeuniverse/dae · GitHub
这样配置之后就能成功让docker容器走全局代理了!
参考资料
GitHub - daeuniverse/dae: eBPF-based Linux high-performance transparent proxy solution.
使用 dae 配合 Clash 实现 Linux 网卡级全局代理,支持代理 Docker 容器