那篇文章的代码在 Windows 和 Ubuntu 下都正常运行,但今天在路由器上运行时却报错了:
Traceback (most recent call last): …… File "/root/movpn/tun.py", line 218, in _open_tun fcntl.ioctl(tun, TUNSETIFF, ifr) IOError: [Errno 81] File descriptor in bad state
因为 vtun 运行正常,所以 tun 本身应该是没问题的。又测试了一下,这个错误在 ioctl 的
request
不正确时出现。遂铺天盖地地寻找此值,发现不少相同遭遇,如这里,还有这,但没找到解决方案。
无奈,只好试着自己写段代码把 TUNSETIFF 打出来了..
之前只听说过 交叉编译 这个词,现在就要动手了好鸡冻,好在 OpenWrt 的相关资料很丰富:参照 wiki 以及 这篇帖子 外加一晚上时间终于完成了。
之前只听说过 交叉编译 这个词,现在就要动手了
找了一个 C Hello Word 改了一下:
交叉编译:
上传路由器,执行:
TUNSETNOCSUM = -2147199800 TUNSETDEBUG = -2147199799 TUNSETIFF = -2147199798 TUNSETPERSIST = -2147199797 TUNSETOWNER = -2147199796 TUNSETLINK = -2147199795 TUNSETGROUP = -2147199794
OK,全出来了,话说为啥都是负数 = = 和 CPU 位宽整数长度啥的有关?换一个路由器是否还是这个值?
不知道,管用就行,Python 里
不知道,管用就行,Python 里
TUNSETIFF = -2147199798
就好了。
P.s. 嘛其实回想起来也不复杂,就是编译 OpenWrt 略显蛋疼:经常在各种下载时卡住,挂VPN、断VPN,反复试。 有个 git clone 就是卡在 84% 死活过不去,最后把 git:// 改成 https:// 才好。
from https://blog.sorz.org/p/openwrt-py-tun/