群晖7.0使用Docker无法挂载tun的解决方案

群晖7.0使用Docker无法挂载tun的解决方案

目录

[TOC]

前言

TUN/TAP虚拟网络设备为用户空间程序提供了网络数据包的发送和接收能力。他既可以当做点对点设备(TUN),也可以当做以太网设备(TAP)。

TUN/TAP 虚拟网络设备的原理比较简单,他在Linux内核中添加了一个TUN/TAP虚拟网络设备的驱动程序和一个与之相关连的字符设备 /dev/net/tun,字符设备tun作为用户空间和内核空间交换数据的接口。当内核将数据包发送到虚拟网络设备时,数据包被保存在设备相关的一个队 列中,直到用户空间程序通过打开的字符设备tun的描述符读取时,它才会被拷贝到用户空间的缓冲区中,其效果就相当于,数据包直接发送到了用户空间。通过 系统调用write发送数据包时其原理与此类似。

值得注意的是:一次read系统调用,有且只有一个数据包被传送到用户空间,并且当用户空间的缓冲区比较小时,数据包将被截断,剩余部分将永久地消失,write系统调用与read类似,每次只发送一个数据包。所以在编写此类程序的时候,请用足够大的缓冲区,直接调用系统调用read/write,避免采用C语言的带缓存的IO函数。

问题

在一次测试想通过群晖的Docker挂载VPN客户端时,提示下面的错误 :

Starting openvpn_vpn_1 ... error

ERROR: for openvpn_vpn_1  Cannot start service vpn: error gathering device information while adding custom device "/dev/net/tun": no such file or directory

ERROR: for vpn  Cannot start service vpn: error gathering device information while adding custom device "/dev/net/tun": no such file or directory

初步怀疑和群晖改装后的linux有关。

解决方法

通过SSH连接到群晖,查看tun模块是否安装

root@idoall:/volume1/docker/openvpn# lsmod | grep tun
tunnel4                 2069  1 sit
ip_tunnel              11240  2 sit,vxlan

测试tun.ko模块是否在工作

root@idoall:/volume1/docker/openvpn# mkdir /dev/net
root@idoall:/volume1/docker/openvpn# mknod /dev/net/tun c 10 200
root@idoall:/volume1/docker/openvpn# chmod 600 /dev/net/tun
root@idoall:/volume1/docker/openvpn# cat /dev/net/tun
cat: /dev/net/tun: File descriptor in bad state

cat命令返回了File descriptor in bad state的错误,说明模块安装正确

这时再启动Docker可以正常运行。

insmod 命令开机启动,持久化载入模块

使用以下命令创建开机脚本

cat <<EOF > /usr/local/etc/rc.d/tun.sh

!/bin/sh -e

insmod /lib/modules/tun.ko
EOF

添加可执行权限

chmod a+x /usr/local/etc/rc.d/tun.sh

这样以后每次开机都会加载 tun 模块

相关文章

解决群晖7.0 Docker版zerotier报错无限重启


博文作者:迦壹
博客地址:群晖7.0使用Docker无法挂载tun的解决方案
转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作!


2 thoughts on “群晖7.0使用Docker无法挂载tun的解决方案

发表回复

您的电子邮箱地址不会被公开。