vernesong / OpenClash

A Clash Client For OpenWrt
MIT License
16.86k stars 3.1k forks source link

[Bug] docker容器下跑openclash时,--cap-add 精细化控制 #3849

Closed e6e6 closed 3 months ago

e6e6 commented 5 months ago

Verify Steps

OpenClash Version

v0.46.003-beta

Bug on Environment

Docker

OpenWrt Version

openwrt 23.05.3

Bug on Platform

Linux-armv6

Describe the Bug

  1. 旁路网关模式
  2. --privileged 运行包含 openclash 的 openwrt 镜像是没有问题
  3. --cap-add=NET_ADMIN --cap-add=SYS_RESOURCE --cap-add=SYS_PTRACE 来运行容器,openclash 能正常启动,但是客户端无法做任何解析

To Reproduce

docker运行的命令分别是

sudo docker run -d --restart=on-failure:3 --hostname=OneCloud --name onecloud --network openwrt --cap-add=NET_ADMIN --cap-add=SYS_RESOURCE --cap-add=SYS_PTRACE --device=/dev/net/tun openwrt:23.05.3 /sbin/init

sudo docker run -d --restart=on-failure:3 --name onecloud --network openwrt --privileged --device=/dev/net/tun openwrt:23.05.3 /sbin/init

cap-add 的方式,分别附加了 NET_ADMIN,SYS_RESOURCE,SYS_PTRACE。其他的根据 https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities 说明,属于默认行为。 此类方式能启动 openwrt 容器,能启动 openclash,进入容器也能正常代理,客户机网关和 dns 都指向容器 ip 后,客户机无法做任何解析

privileged 的方式,一切正常

OpenClash Log

正常log

OpenClash Config

No response

Expected Behavior

期望能用 --cap-add 的方式来做精细化控制 --privileged 方式,太容易让宿主机出问题,譬如内核崩溃

Additional Context

No response

vernesong commented 5 months ago

https://github.com/vernesong/OpenClash/blob/c0cd0f19901d418c18261a8a2efbbcb25e57a68c/luci-app-openclash/root/etc/init.d/openclash#L796 这里有需要的权限

e6e6 commented 5 months ago

https://github.com/vernesong/OpenClash/blob/c0cd0f19901d418c18261a8a2efbbcb25e57a68c/luci-app-openclash/root/etc/init.d/openclash#L796

这里有需要的权限

capabilties="cap_sys_resource,cap_dac_override,cap_net_raw,cap_net_bind_service,cap_net_admin,cap_sys_ptrace"

其中,cap_dac_override,cap_net_raw,cap_net_bind_service是默认就有的

https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities

只需要额外添加cap_net_admin,cap_sys_resource,cap_sys_ptrace

我也测试过给 cap_net_admin,cap_sys_admin权限,也是同样问题

是否有什么权限用到了,但是没列出来

症状是,客户机完全无法dns解析

vernesong commented 5 months ago

没解析你要看内核有没有日志,还是防火墙没配置好

e6e6 commented 5 months ago

没解析你要看内核有没有日志,还是防火墙没配置好

内核也无日志 防火墙将 input output都接受了

这个周末有时间再做一个复现

对了顺带提一下,docker stop xxx,大概率host也会崩溃,目前不清楚是debian环境问题,还是docker 开privileged问题,所以--restart只给了3次机会,否则会进入无限重启的噩梦。

github-actions[bot] commented 3 months ago

This issue is stale because it has been open 60 days with no activity. Remove stale label or comment or this will be closed in 5 days