netifd和ubus介绍

netifd (Network Interface Daemon) – Technical Reference
ubus (OpenWrt micro bus architecture)

sstp-client加入netifd支持

下面都是记录试错的过程,以备以后调试。只看结果请看最后。

最初的想法:参照pptp协议的方法照葫芦画瓢

实际遇到的问题是pptp协议其实是和pppoe,pppoa,ppp等一起的,而且新版的openwrt中,pptp已经是一个内核模块(kmod-pptp)
附:如何查找模块所在的目录(openwrt论坛Zajec提供的方法)
grep -R "pptp" ./package/* | grep Package
./package/kernel/linux/modules/netsupport.mk:define KernelPackage/pptp
./package/kernel/linux/modules/netsupport.mk:$(eval $(call KernelPackage,pptp))
./package/network/services/ppp/Makefile:define Package/ppp-mod-pptp
./package/network/services/ppp/Makefile:define Package/ppp-mod-pptp/description
./package/network/services/ppp/Makefile:define Package/ppp-mod-pptp/install
./package/network/services/ppp/Makefile:$(eval $(call BuildPackage,ppp-mod-pptp))
找到了package,内容看不懂,大概是都调用generic的方法?(其实做这个已经超出我的能力范围了)

又找了openwrt下pptp协议的早期实现

https://github.com/derlunz/openwrt-raspberrypi/tree/d2040e9f9c718a51f1a052d737df9657719588d8/package/pptp
这个不是内核模块的,编译安装成功,但是其中的pptp.sh所在的目录和其中的结构跟现在的完全不同了。
应该还是用所谓”network scritp"方式实现网络协议的,现在已经改成netifd了。
http://wiki.openwrt.org/doc/devel/network-scripting
参考价值不大。

第二个想法:参照l2tp协议的方法

其实netifd具体实现就是写一个脚本,比如l2tp就是/lib/netifd/proto/l2tp.sh,其中大概的内容就是:
  • 协议名称 add_protocol sstp
  • 网络接口的参数 proto_sstp_init_config
  • 网络接口的连接建立脚本 proto_sstp_setup
  • 网络接口的连接断开脚本 proto_sstp_teardown
先直接拷贝了l2tp.sh为sstp.sh,然后在连接建立脚本中加入sstpc启动命令行。在luci下可以看到这个接口了。按“启动”确实可以启动接口。(用ifconfig可以看见sstp的接口,在系统日志可以看到连接过程)。启动后luci里可以看到ip地址,但连接时间,发包收包看不到,说明支持的不完整,暂时顾不上这些。

如何停止sstpc呢

看别的协议都可以用proto_kill_command "$interface"关闭接口,但目前sstp无效(其实是因为前面启动脚本没写对)
命令行中可以用killall pppd断开,但在连接断开脚本这样写可能会误杀其他的pppd。l2tp协议中有一个专门的守护进程负责关闭l2tp连接。sstpc没有这种机制。
又考虑用kill -9 pid的方法来停止。怎么查sstpc或者pppd的进程号?而且必须是sstp-client的进程,如果还有pptp之类的其他pppd,不能误杀掉。
考虑用ps结合awk来查找到含有sstpc的进程号。又遇到奇怪的问题,在ssh上可以正常取得pid,但在proto_sstp_teardown里取不到。不知道为什么。
再想别的办法。发现sstpc连接之后会在/tmp/run目录下建立sstpc-xxx.pid文件,内容就是pid号。于是考虑用:
kill `cat /tmp/run/$ifname.pid`
在luci中可以正常关闭接口了

防火墙不能正常NAT

即使把sstp接口的名称加入到防火墙wan区中,luci中看到sstp接口的名称ifname也是“空的”。启动和关闭接口时,防火墙不会自动reload。手工reload防火墙,会报错:找不到接口sstp的设备。防火墙无法起效。

目前的办法是把防火墙规则写道/etc/ppp/ip-up.d和/etc/ppp/ip-down.d文件夹中的脚本文件中。

试验过程中报错,大概是文件无效的意思(Can't execute /etc/ppp/ip-up: Invalid argument) ,刚开始还以为调用的参数有什么问题,把脚本内容清空了还是报一样的错。后来发现是文件夹的名字写错了,写成了/etc/ppp/ip-up了,少了一个.d。
改成正确的名称,发现sstpc不会自动调用这个脚本
查询pppd的说明,发现可以用pppd参数ip-up-script /lib/netifd/ppp-up来解决。
脚本中加入语句,可以正常穿透防火墙啊了。语句见OpenWrt使用sstp-client(1)

参考openvpn协议

以上的办法显然不是好办法,太麻烦了。再参考一下别的协议吧,下载openvpn看了一下,失望,好像不是基于netifd的,而是用的shell,配置起来也比较麻烦。不过下载openvpn时有个意外发现:tayga协议。好像在哪听见过这个。重要的是它的介绍是:"TAYGA is an out-of-kernel stateless NAT64 implementation for Linux. It uses the TUN driver to exchange packets with the kernel, which is the same driver used by OpenVPN and QEMU/KVM.“ 其他没看懂,它是out-of-kernel的,这个跟sstp有点像。

参考TAYGA协议

这个协议比较靠谱,有完整的netifd的shell。参照这个完成了sstp.sh

为什么不能正常启动和关闭接口

因为没有用正确的调用netifd的过程,缺了proto_fun_command
proto_run_command "$config" sstpc.... 启动
proto_kill_command "$interface"            关闭
proto_run_command这个必须有。刚开始没看懂,忽略了这个,第一个参数$config是接口名称,proto_run_command里注册了这个接口,如果没有这一步,后面关闭这个接口时自然找不到这个接口,也就不能正常关闭。后面的参数是启动的命令,应该是在proto_run_command这个函数里运行了这个命令。

为什么接口不能像pptp等协议一样穿过防火墙

因为没有正确的初始化接口,其实就是缺了
proto_init_update "$ifname" 1
proto_send_update "$config"

加入Luci支持

以上协议已经基本可用了。但在luci中还无法正常显示。加入luci相对简单,还是照葫芦画瓢吧。参考了
开发OpenWrt路由器上LuCI的模块
其实这个比文章中简单多了,只是加了两个文件
/usr/lib/lua/luci/model/network/proto_sstp.lua
/usr/lib/lua/luci/model/cbi/admin_network/proto_sstp.lua
其中的内容只是把pptp的文件稍微改动了一下。

最终的成果

sstp-client for openwrt:
​https://github.com/harveyhu2012/packages/tree/master/net/sstp-client

luci for sstp-client:
​https://github.com/harveyhu2012/luci/compare/openwrt:master...master

example:
​https://www.dropbox.com/s/n1wsem74pjcjhyu/luci-proto-sstp.png?dl=0

编译好的下载:
http://pan.baidu.com/s/1ntzExjb

注意:

与gfw-vpn同时使用的时候,要注意将vpn服务器的地址加入白名单,否则脸上10秒内断线。

OpenWrt使用sstp-client(2)相关推荐

  1. Mikrotik: Setup SSTP Server for Windows 10 Client

    原文: http://www.dr0u.com/mikrotik-setup-sstp-server-for-windows-10-client/ Basic how-to on SSTP for a ...

  2. OpenWrt下使用docker安装icloudpd实现iPhone照片备份私有云盘nas

    文章目录 一.背景与需求 二.部署方法 2.1 我的环境 2.2 准备工作 2.2.1 检查docker环境是否运行正常 2.2.2 查询宿主系统用户id和组id 2.2.3 规划挂载目录 2.2.4 ...

  3. openwrt中openconnect的配置

    一.背景 最近家里新购置了索尼的x700的蓝光机,美亚折扣后几乎半价于国行,真的很香.这款机器内置了网飞,但需要专门的网络线路,这里不多说,于是需要给家里的软路由做一下配置,于是开始了折腾之旅.下面直 ...

  4. OpenWRT(基于LEDE17.01.4)Open***的Client与Server端内网互通

    经过长达近一个星期的折腾,Open×××客户端终于可以和Server内网的客户端进行通信,其中防火墙占用了大部分时间,主要还是不太熟悉Iptables的各种设置方式以及规则(对CentOS7的Fire ...

  5. linux h3c 802.1客户端,OH3C 的安装及使用 H3C 802.1x Client for OpenWrt

    OH3C是基于Openwrt路由器固件平台的H3C 802.1x兼容客户端,基于YaH3C开发. 目前已经实现的功能有:H3C 802.1x认证 多用户管理 mac绑定设置及自动修改mac 前提 首先 ...

  6. 6.openwrt改变打印串口波特率,添加ssh client,修改wwan口配置为自动获取ip

    1.改变波特率 uboot的波特率是115200,openwrt起来打印串口的波特率是57600,需要统一 根据网上搜索,需要修改dst文件 vim target/linux/ramips/dts/m ...

  7. openwrt怎么做ap_OPENWRT的中继或者桥接模式, Client+AP实现

    实现功能: 无线连接上级路由器, 然后再通过本机路由器实现有线和无线都能上网. 一. Web界面的操作如下, 很简单的 1.网络->无线, 点击"扫描"按钮. 2.在新出现的 ...

  8. openwrt PPTP Client 配置

    1. 编译要求 修改menuconfig编译选项 kernel modules --->Netfilter Extensions ---> <*> kmod-nf-nathel ...

  9. OpenWrt使用sstp-client(1)

    为什么用sstp 前几天pptp还好好的,这几天突然就被干扰了,连接丢包率2%-10%(pingtest.net),用PC测试了各种协议,只有sstp好像还可以用.可能的原因是 1)443端口目前被扫 ...

  10. openwrt监控linux,OpenWRT上判断客户端在线个数

    OpenWRT上判断客户端在线个数,有两种方式: 一.通过DHCP client分配列表 (缺点:client列表会根据超时时间刷新,一般超时时间为12h,) 二.通过arp缓存列表/proc/net ...

最新文章

  1. 机房收费系统【VB版】——上下机
  2. 在linux系统使用nginx部署静态网页
  3. CF1155D Beautiful Array 贪心,dp
  4. Educational Codeforces Round 41(已补D,E)
  5. 【Linux】一步一步学Linux——dpkg-split命令(274)
  6. Qt 有层级关系的qss样式,使用id定位到具体控件
  7. 前端学习(1221):使用过滤器格式化日期
  8. 【机器学习】机器学习从零到掌握之十三 -- 教你理解Logistics回归之梯度上升算法
  9. Vue之非单文件组件介绍
  10. Python学习-将Python3.3.4还原成Python2.6版本
  11. DropDownList 递归绑定分子公司信息
  12. 塔防游戏c语言源代码,转经典塔防游戏TowersTrap-[lua复刻版本,附全部lua源代码]
  13. 20162327WJH 实验三 《敏捷开发与XP实践》 实验报告
  14. 一份完整的数据分析师成长书单
  15. FM860-GI工业级摄像头安装驱动
  16. dva学习-入门安装和目录介绍
  17. 【区块链实战】区块链在哪些行业得到了应用
  18. Android中的蓝牙通信
  19. STM32F0 HAL库软件模拟串口发送数据
  20. 【信息安全技术】实验报告:木马及远程控制技术

热门文章

  1. Charles使用操作步骤及部分用法
  2. 关于无感刷新Token,我是这样子做的
  3. ImageList与ListView控件
  4. Python3.8.0语法汉化规范思路1.0版
  5. Leetcode上测试用例测试结果正确,但提交后有错的问题
  6. proposal presentation
  7. python3 爬csdn博主详情
  8. 分布式架构在云计算平台的应用及优缺点
  9. 手游云测试工具TestBird登陆韩国
  10. OpenGL ES着色器语言(GLSL ES)规范 ——下篇