在 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.6Docker 版本 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 失败:不允许操作

防止直接调用托管在 docker 容器中的微服务的最佳方法

如何在运行 Go 的 Busybox Docker 容器中进行 HTTPS 调用?

从另一个容器调用 docker 容器

无法从另一个 docker 容器中的烧瓶应用程序对驻留在 docker 容器中的 django 应用程序进行“获取”调用 [重复]

Docker-Compose API 调用和端点容器化