使用dae为Docker容器配置网卡级代理

Linux下常见的代理配置方式是设置 ALL_PROXYHTTP_PROXYHTTPS_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 容器

7 个赞

感谢你的分享!

1 个赞

我前一个月也是为了让25块钱买的京东云服务器用起来,折算下来5块钱六个月,返20元京豆。

让docker中wg-easy的流量走docker的mihomo各种查最后找到的dae方法。

我是mihomo开放socks或者mixed。

wg-easy容器host,dae让wg0网卡走lan,就可以wireguard更加密通信。

但是有点抖动,难道是机场不行,但是不像 直接使用socks代理还好。

不知道为啥了 不过够用了

又来学习技术了

感谢佬分享……

感谢分享。感觉dae还是有点复杂,不是很想学,要是mihomo也能这样的好了