笔者分析了360 P1路由器上的朋友专享网络功能,发现其主要由如下子功能组成:

1. APP点击“立即开启”,则路由器会多出一个新的SSID:360朋友专享网络-8463。此SSID不加密;同时,原有的主SSID不变

2. STA接入此新SSID后

u  可以获得IP地址,且获得的IP地址与接入主SSID设备获取的IP地址在同一个网段;

u 可以访问外网;

u 不可以访问360路由器的Web,

u 无法ping通360路由器的ip地址

u 无法ping通其他连入此路由器的其他客户端(包括连入360路由器的任何一个SSID)

u 在路由器的下挂终端列表中,可以看到此STA。且标记为“访客”

3. 此朋友网络在开启后,会有120秒的倒数计时。到时候,此网络会变成隐藏

笔者手里也有一个基于MTK7620N的路由器,且基于OpenWRT的原生SDK(R43400),故笔者考虑将上述功能移植到此路由器中(APP部分除外)。

主要涉及如下工作:

1. 要支持第二个SSID;且此SSID的MAC是自动生成:基于主SSID,MAC地址自增1

实现方案:

支持第二个SSID,需要修改/etc/config/wireless,增加一个wifi-iface的section 配置项

2. 第二个SSID需要实现:与其他桥接口的隔离:需要在brctl+桥协议栈上,上做定制开发

实现方案:

l  修改brctl_cmd.c(bridge-utils-1.5/brctl),在数组commands中,增加一个新命令:

{ 3, "setisolation", br_cmd_setisolation,

"<bridge> <port> <1/0>\tset port isolation" },

l 修改brctl_cmd.c(bridge-utils-1.5/brctl),加入新函数br_cmd_setisolation的实现定义:调用函数br_set_isolation_enable

l 修改libbridge_devif.c(bridge-utils-1.5/libbridge),增加新函数br_set_isolation_enable的实现:直接利用port_set接口,对/sys/devices/virtual/net/xxx/brport/isolate_mode的值进行修改。

注意:isolate_mode参数在内核中已经存在,对应内核桥端口属性中已经有的属性:BR_ISOLATE_MODE,1表示隔离;0表示不隔离;此属性,用于控制该桥端口是否转发报文对本地收发报文不影响

3.  从第二个SSID接入的终端所发出的报文,仅仅可以路由转发,不可以访问本地(当然,DHCP报文允许到本地)

实现方案:

u  利用iptables的phyxdev的match模块,在INPUT链上建立如下规则:仅仅允许DHCP报文以及DNS报文可以到本地

Iptables –I INPUT –m physdev –physdev-in wlan2 –p udp –sport 68 --dport 67 –j ACCEPT

Iptables –I INPUT –m physdev –physdev-in wlan2 –p udp --dport 53 –j ACCEPT

Iptables –I INPUT –m physdev –physdev-in wlan2 –j DROP

u 需要做如下编译配置:

用户态:network->firewall->iptables->iptables-mod-extra

内核态:Networking support->networking options->netfilter->Advanced netfilter configuration

Networking support->networking options->netfilter->Bridged IP/ARP packets filtering

Networking support->networking options->netfilter->core netfilter configuration -> netfilter xtables support

Networking support->networking options->netfilter->core netfilter configuration -> “physdev” match support <M> --- 必须是模块编译   u /proc/sys/net/bridge/bridge-nf-call-iptables 需要为 1

4. 第二个SSID需要实现:与接入同一个SSID的其他STA隔离:需要在iw+驱动上做定制开发

实现方案:

u  扩充genl_netlink参数实现新命令:   dev
<devname> set inner_deliver <on|off>

control the STAs which belong to the same ssid can transfer data to each other or not。

u 修改compat-wireless-2014-11-04/net/mac80211/ieee80211_i.h文件,在结构体ieee80211_sub_if_data中增加成员:inner_deliver

u 修改ieee80211_deliver_skb (compat-wireless-2014-11-04\net\mac80211\rx.c),增加同一个SSID下的STA之间是否转发的判断处理:

if(sdata->inner_deliver != 1) {

printk("in ieee80211_deliver_skb, not deliver skd \n");

dev_kfree_skb(skb);

skb = NULL;

}

5. 第二个SSID上发出的beacon帧,需要定时处理为:隐藏SSID参数

实现方案:

u  修改/etc/config/wireless,对第二个SSID,增加如下配置:

config wifi-iface

option device 'radio0'

option network 'lan'

option mode 'ap'

option encryption 'none'

option maxassoc '32'

option ssid 'LeU_0acc_2'

option hidden '1'  --- 决定ssid是否广播,即是否隐藏

u  使用脚本命令:
wifi up radio0,使得hostapd重启

6. 设备管理模块需要将从第二个SSID接入的终端,一并管理起来,并做显著区别的显示:访客

分析并实现 360 P1路由器上的朋友专享网络 功能的更多相关文章

  1. 分析并实现 360 P1路由器上的测速功能(也可以针对金山测速功能)

    现在各种智能路由器以及一些PC上的防火墙软件,都提供网络测速功能.笔者对此进行了研究,并在自己的路由器上也实现了此功能.下面做一下总结 一般的网络测速,主要关注两个方面:网络延迟和下载速率 1.网络延 ...

  2. 打破常规——大胆尝试在路由器上搭建SVN服务器

    注册博客园挺久了,一直比较懒,虽然有几次想写点文章,但是一直没有行动,今天给大家带来一篇比较有意思的文章,不涉及技术上的,希望大家轻拍.本文的文字和图片全部为原创,尊重作者转载请注明出处! 说起路由器 ...

  3. 在路由器上搭建SVN服务器

    在路由器上搭建SVN服务器 SVN托管服务大家都不陌生了,我最早开始用的是谷歌提供的SVN,因为在上面托管的项目都是开源的,所以当有些项目不方便在网上公开的时候,就需要自己搭建SVN服务器了.wind ...

  4. 教你如何在Drcom下使用路由器上校园网(以广东工业大学、极路由1S HC5661A为例)

    免责声明: 在根据本教程进行实际操作时,如因您操作失误导致出现的一切意外,包括但不限于路由器变砖.故障.数据丢失等情况,概不负责: 该技术仅供学习交流,请勿将此技术应用于任何商业行为,所产生的法律责任 ...

  5. 一步步实现windows版ijkplayer系列文章之六——SDL2源码分析之OpenGL ES在windows上的渲染过程

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  6. iptables及其在路由器上的应用 (待完善)

    1. iptables基本定义 Table (表名) Explanation (注释) nat nat表的主要用处是网络地址转换,即Network Address Translation,缩写为NAT ...

  7. 将 DNSCrypt 部署到 Openwrt 路由器上+ DNSmasq 解析国内域名用本地 DNS[ZT+实践]

    原文地址: 1.https://typcn.com/legacy/blog/posts/openwrt-dnscypt.html 2.http://www.openwrt.pro/post-376.h ...

  8. 交换机/路由器上的 S口 F口 E口

    S口是serial接口的意思,也叫高速异步串口,主要是连接广域网的V.35线缆用的,说白了就是路由器和路由器连接时候用的,可以用命令设置带宽,一般也就在10M.8M左右.F口是FastEthernet ...

  9. 【旧文章搬运】分析了一下360安全卫士的HOOK

    原文发表于百度空间及看雪论坛,2009-10-08 看雪论坛地址:https://bbs.pediy.com/thread-99128.htm 看时间,09年的国庆节基本上就搞这玩意儿了...==== ...

随机推荐

  1. hdu1227 Fast Food

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=1227 #include <iostream> #include <cstdio&g ...

  2. SVN-项目 XXX 受源代码管理。向源代码管理注册此项目时出错。建议不要对此项目进行任何修改

    错误描述:  项目 XXX 受源代码管理.向源代码管理注册此项目时出错.建议不要对此项目进行任何修改 解决办法: 使用记事本打开,项目csproj文件删除图中几行,重新打开解决方案就可以了 原因分析: ...

  3. (转)NIO 内存映射文件

    内存映射文件 I/O 是一种读和写文件数据的方法,它可以比常规的基于流或者基于通道的 I/O 快得多. 内存映射文件 I/O 是通过使文件中的数据神奇般地出现为内存数组的内容来完成的.这其初听起来似乎 ...

  4. ExportAsFixedFormat Visio文件另存为其他几种格式的处理

    Visio文件另存为其他几种格式的处理,以及另存为Web文件等相关操作. 1.Visio导出为PDF格式 在一般情况下,PDF格式是较为常用的内容格式,因此Visio文档(Vsd格式)导出为PDF也是 ...

  5. DataGridView绑定泛型List时,利用BindingList来实现增删查改

    DataGridView绑定泛型List时,利用BindingList来实现增删查改  一.   DataGridView绑定泛型List的种种 1.DataGridView数据绑定对比(DataTa ...

  6. Elasticsearch的javaAPI之query dsl-queries

    Elasticsearch的javaAPI之query dsl-queries 和rest query dsl一样,elasticsearch提供了一个完整的Java query dsl. 查询建造者 ...

  7. Less is better than never

    很多时候,在正确的做一件事之前,我们总会尝试一些笨办法或者白费一些力气: 很多时候,即使在正确的做一件事,由于这事情并非一日之功,而没有收到立竿见影的效果: 之后,我们的内心便容易动摇,怀疑,甚至想要 ...

  8. [LeetCode][Java] Substring with Concatenation of All Words

    题目: You are given a string, s, and a list of words, words, that are all of the same length. Find all ...

  9. Asp.Net 之 二维码生成

    首先,引用 ThoughtWorks.QRCode.dll . 简单二维码生成及解码代码: //生成二维码方法一 private void CreateCode_Simple(string nr) { ...

  10. Gradle在Android中的基本使用

    1.基本概念 程序开发作为一种工程作业,不光是编写代码,还涉及到工程的各种管理(依赖,打包,部署,发布,各种渠道的差异管理.....).很多时候,我们反复的build,clean,签名,打包,发布,那 ...