分析并实现 360 P1路由器上的朋友专享网络 功能

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

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

2. STA接入此新SSID

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

 u 可以访问外网;

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

 u 无法ping360路由器的ip地址

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

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

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

 

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

主要涉及如下工作:

1. 要支持第二个SSID;且此SSIDMAC是自动生成:基于主SSIDMAC地址自增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_MODE1表示隔离;0表示不隔离;此属性,用于控制该桥端口是否转发报文对本地收发报文不影响

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

实现方案:

 u  利用iptablesphyxdevmatch模块,在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> --- 必须是模块编译   /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接入的终端,一并管理起来,并做显著区别的显示:访客
 

 

posted @ 2015-07-01 06:28  拉古小师傅  阅读(4310)  评论(0编辑  收藏  举报