群晖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无法挂载tun的解决方案
转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作!
2 thoughts on “群晖7.0使用Docker无法挂载tun的解决方案”
How is the COVID situation over there?
Where there is a will, there is a way.