在 docker 容器中调用 OpenConnect *** 客户端显示 TUNSETIFF 失败:不允许操作
Posted
技术标签:
【中文标题】在 docker 容器中调用 OpenConnect *** 客户端显示 TUNSETIFF 失败:不允许操作【英文标题】:Calling OpenConnect *** client in docker container shows TUNSETIFF failed: Operation not permitted 【发布时间】:2015-08-13 09:02:56 【问题描述】:我在基于 ubuntu 的 docker 容器中调用 openconnect。它成功连接到服务器并提示我输入密码,但随后
Got CONNECT response: HTTP/1.1 200 OK
CSTP connected. DPD 30, Keepalive 20
TUNSETIFF failed: Operation not permitted
我搜索 TUNSETIFF 单词,每个答案都是关于未在 sudo 中运行的命令,但我已经是容器内的 root。还有什么问题?
【问题讨论】:
尝试使用--privileged
启动容器。
是的,它有效。谢谢。
【参考方案1】:
默认情况下,Docker 容器以一组减少的 linux 功能启动(请参阅man capabilities
)。精简后的集合不包含一些与网络相关的功能(大概是为了让容器无法嗅探来自主机或其他容器的流量)。
要启动具有完整网络功能的容器,请使用 --cap-add
参数显式添加 SYS_NET_ADMIN
功能,例如:
docker run -d --cap-add SYS_NET_ADMIN myimage
或者使用--privileged
为容器提供全套特权,例如:
docker run -d --privileged myimage
【讨论】:
很遗憾,SYS_NET_ADMIN
在 docker 17.xx 中不可用,您可以使用 SYS_ADMIN
执行一系列系统管理操作 或 NET_ADMIN
执行各种与网络相关的操作。无论如何 --cap-add NET_ADMIN 将处理 openconnect。
如果你没有以特权运行容器,但只添加了NET_ADMIN
能力,你需要通过隧道设备,例如:docker run -d --cap-add NET_ADMIN --device /dev/net/tun myimage
@karlsebal 这个操作系统或版本依赖吗? NET_ADMIN
和设备允许我启动一个容器。但是,在 macOS 10.15.6 和 Docker 版本 20.10.7,构建 f0df350 上的连接对我不起作用,产生 Cannot open "/proc/sys/net/ipv4/route/flush": Read-only file system
【参考方案2】:
通过特权运行容器
docker run -d --privileged myimage
正如 Adrian 指出的那样,或者在添加 NET_ADMIN
功能的情况下运行它并通过隧道设备,例如:
docker run -d --cap-add NET_ADMIN --device /dev/net/tun myimage
【讨论】:
【参考方案3】:使用 --privileged 启动容器。 (感谢 Adrian Mouat 的回答)。
【讨论】:
很高兴它对你有用。我在下面添加了完整的答案。我猜 --cap-add SYS_NET_ADMIN 也可以。以上是关于在 docker 容器中调用 OpenConnect *** 客户端显示 TUNSETIFF 失败:不允许操作的主要内容,如果未能解决你的问题,请参考以下文章
在 docker 容器中调用 OpenConnect *** 客户端显示 TUNSETIFF 失败:不允许操作
如何在运行 Go 的 Busybox Docker 容器中进行 HTTPS 调用?
无法从另一个 docker 容器中的烧瓶应用程序对驻留在 docker 容器中的 django 应用程序进行“获取”调用 [重复]