You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用TUNSETIFF时提示Operation not permitted的问题求助

解决Docker中调用TUNSETIFF时的"Operation not permitted"错误

环境信息

  • 宿主机系统:Ubuntu 22.04.1 LTS
  • Docker版本:20.10.17, build 100c701
  • Python版本:3.10.6

原运行容器命令:

docker run --rm -it --network host --cap-add=NET_ADMIN --device=/dev/net/tun ubuntutest bash -c "tuntaptest.py"

已尝试但无效的选项:

  • docker run --rm -it --network host --privileged
  • docker run --rm -it --network host --cap-add=SYS_ADMIN

问题代码片段:

import struct
import fcntl

TUNSETIFF: int = 0x400454ca
IFF_TUN: int = 0x0001
IFF_NO_PI: int = 0x1000

tun = open('/dev/net/tun', 'r+b', buffering=0)
ifr: bytes = struct.pack('!16sH', bytes('tun0', 'utf-8'), IFF_TUN | IFF_NO_PI)
fcntl.ioctl(tun, TUNSETIFF, ifr)

可行解决方法

1. 强制以root用户运行容器

操作TUN设备需要root权限,若容器默认以非root用户启动,会导致权限不足。添加--user root参数:

docker run --rm -it --network host --cap-add=NET_ADMIN --device=/dev/net/tun --user root ubuntutest bash -c "tuntaptest.py"

2. 验证宿主机TUN模块状态

宿主机必须加载tun模块才能让容器使用TUN设备:

# 检查模块是否加载
lsmod | grep tun

# 未加载则手动加载
sudo modprobe tun

进入容器后确认设备权限:

ls -l /dev/net/tun
# 正常输出应为 crw-rw-rw- 1 root root ...

3. 修正结构体字节序

struct.pack使用的网络字节序(!)可能与系统预期的主机字节序不匹配,改为主机字节序打包:

# 去掉格式符前的!,使用主机默认字节序
ifr: bytes = struct.pack('16sH', bytes('tun0', 'utf-8'), IFF_TUN | IFF_NO_PI)

或明确指定小端/大端(根据系统架构调整):

# 小端架构(如x86_64)用<
ifr: bytes = struct.pack('<16sH', bytes('tun0', 'utf-8'), IFF_TUN | IFF_NO_PI)

4. 确认容器内依赖完整性

确保容器镜像中安装了网络配置工具(如iproute2),虽然不直接影响ioctl,但后续配置TUN接口会用到:

# 在容器内执行
apt update && apt install -y iproute2

内容的提问来源于stack exchange,提问作者vk-code

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 21:35:26