WifiDog:A captive portal suite

What is it composed of ?

A: It is composed of 2 components:

  1. The client is a daemon process - this gets installed on every wireless router
  2. The auth server is a web application - this gets installed in a central location

    What do I need ?

    1. Basic proficiency in a GNU/Linux environment
    2. A GNU/Linux OS with netfilter compiled into the kernel
    3. The iptables package
    4. The GNU C compiler (gcc). Other compilers may work, but we have not tested and will not support them.
    5. The latest Wifidog tarball which can be obtained from SourceForge

    Pre-installation

    This is where a lot of people run into problems, so let's state this in bold:

    MAKE SURE EVERYTHING WORKS FIRST BEFORE INTRODUCING Wifidog INTO THE ENVIRONMENT

    That especially means:

    • The router must boot properly
    • The router must bring up the interfaces properly
    • The router must set up the routes properly
    • The router must connect to the internet properly
    • DNS settings must be set or obtained properly. DNS must work.
    • DHCP settings (client, server or both) must be set or obtained properly.
    • The ipt_mac.o kernel module must be loaded.
    • If using NAT, the router must setup NAT/masquerading rules with iptables properly
    • Clients on the desired (WIFI) network must be able to bind, associate, lease and connect the internet properly
    • All the above must happen automatically when the router starts or gets rebooted

    Do NOT proceed with installing Wifidog until you've satisfied the above. It will not work otherwise and you will waste lots of time.

    Installation

    Wifidog, like many open source projects, is distributed with standard autotools utilities to make installation easy. Unpack the tarball (from Sourceforge) or get the lastest source from SVN (see Download menu), then follow the standard:

    ./autogen.sh
    make
    make install

    If you do not install it with make install, then you will find the compiled wifidog gateway binary in src/wifidog (also don't forget to copy wifidog.conf to /etc).

    OpenWrt? ipkg

    More details can be found in the README.openwrt file.

    mkdir ~/wifidog.openwrt
    cd ~/wifidog.openwrt
    wget http://downloads.openwrt.org/whiterussian/newest/OpenWrt-SDK-Linux-i686-1.tar.bz2
    tar -jxvf OpenWrt-SDK-Linux-i686-1.tar.bz2
    svn checkout https://dev.wifidog.org/svn/trunk/wifidog
    cd wifidog
    ./autogen.sh
    make ipk OPENWRTSDK=~/wifidog.openwrt/OpenWrt-SDK-Linux-i686-1

    If there were no errors, your package should be in ~/wifidog.openwrt/OpenWrt-SDK-Linux-i686-1/bin/packages

    Configuration

    Edit /etc/wifidog.conf and follow the instructions in the file. Things should be self-explanatory.

    Running Wifidog for the first time

    Run Wifidog with the following switches:

    wifidog -f -d 7
    -f means to run in foreground (do not become a background daemon)
    -d 7 increases debug output level to the maximum

    Testing

    As a client on the WiFi network (or whatever interface is configured as the LAN interface in /etc/wifidog.conf), open a web browser and try to browse to your favourite web site.

    Monitor the output of the running Wifidog to see what it's doing.
    aaarticlea/png;base64,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" alt="" />

WifiDog系统的更多相关文章

  1. 2012高校GIS论坛

    江苏省会议中心 南京·钟山宾馆(2012年4月21-22日) 以"突破与提升"为主题的"2012高校GIS论坛"将于4月在南京举行,由南京大学和工程中心共同承办 ...

  2. 海蜘蛛WiFiDog固件 MTK7620 OEM,带云AC功能、探针、广告插入,MTK7620解包打包维修默认参数

    修改内容: 1.系统默认管理员员帐号密码 2.系统默认LAN 接口地址 3.系统默认DHCP及保留地址 4.系统默认云AC远程地址及协议内容 5.系统默认JS插入地址 6.系统默认探针位置 7.默认顶 ...

  3. 极路由1s,固件需要刷入RipOS系统的加40块

    极路由1s,固件需要刷入RipOS系统的加40块,集成wifidog功能,wifi广告路由器的理想选择功能. 经过测试,无线性能稳定,无线可带32个手机客户端. 具体配置: 7620CPU ,主频58 ...

  4. wifidog源码分析 - 认证服务器心跳检测线程

    引言 但wifidog启动时,会自动启动认证服务器心跳检测线程,此线程默认每隔60s与认证服务器交互一次,会将路由器的信息(系统启动时长,内存使用情况和系统平均负载)告知认证服务器,并通过一个&quo ...

  5. wifidog接口文档(转)

    目录(?)[-] 网关心跳协议 请求信息 回复格式 例子 用户状态心跳协议 请求格式 注意 回复格式 状态码 例子 跳转协议 请求格式 例子 注册协议 请求格式 例子 wifidog是搭建无线热点认证 ...

  6. Wifidog的协议梳理

    上篇文章结合wifidog的协议,讲解了如何实现wifi认证.这篇文章会详细讲解一下wifidog的协议. wifidog的认证流程图 用户连接WIFI会跳转到以下地址: 1 2 3 4 5 6 7 ...

  7. Wifidog初分析

    一.综述 wifidog是搭建无线热点认证系统的解决方案之一,他比nocat.nodog更适合互联网营销思路.常见的使用在openwrt系统上,它实现了路由器和认证服务器的数据交互,在路由器方(客户端 ...

  8. Wifidog及认证过程初分析

    Wifidog初分析 一.综述 wifidog是搭建无线热点认证系统的解决方案之一,他比nocat.nodog更适合互联网营销思路.常见的使用在openwrt系统上,它实现了路由器和认证服务器的数据交 ...

  9. wifidog用php实现验证流程

    原创性声明 此博文的出处 为 http://blog.csdn.net/zhujunxxxxx/article/details/25384909假设进行转载请注明出处.本文作者原创,邮箱zhujunx ...

随机推荐

  1. windows msiexec quiet静默安装及卸载msi软件包

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoUAAAA4CAIAAAAEgBUBAAAIj0lEQVR4nO2dQXLcOAxFdbXJ0aZys6

  2. 基于PCA的特征提取

    图像处理方面的知识也学了一段时间了,总是光看理论的话,感觉联系不上实际,第一次把理论综合的实现出来,对这些理论的印象才感觉的更深刻,也能够为后续的学习打下良好的基础. PCA是比较老的算法,但是可靠性 ...

  3. Linux中输入命令按tab提示后会自动转义解决方案(xjl456852原创)

    linux在命令行输入命令时,如果有$字符,按tab键时会自动在前面加入转义字符,反而达不到自己需要的效果. 例如: 在Centos7下,我要进入一个环境变量,并编辑一个文件: 比如我要进入$JAVA ...

  4. [置顶] VB6基本数据库应用(三):连接数据库与SQL语句的Select语句初步

    同系列的第三篇,上一篇在:http://blog.csdn.net/jiluoxingren/article/details/9455721 连接数据库与SQL语句的Select语句初步 ”前文再续, ...

  5. 如何让网页打开就运行JS代码,不用onclick

    打开网页直接运行是要调用window.onload( )函数: <html>    <head>    </head>    <body>    < ...

  6. WPF DataGrid 之数据绑定--实例2

    1.前台Grid定义 <!--数据绑定--> <DataGrid Grid.Row="1" Name="gridOne" Margin=&qu ...

  7. OpenGL ES 2.0 变换

    基本变换都是通过将表示点坐标的向量与特定的变换矩阵相乘完成的. 进行基于矩阵的变换时,三位空间中点的位置需要表示成齐次坐标形式. 齐次坐标形式:在X.Y.Z3个坐标值后面增加第四个量W,未变换时W值一 ...

  8. coconHashMap实现原理分析

    1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1 ...

  9. tttt

    while(scanf("%d",&n)!=EOF) { res=-1; level(tmp,n,res,1); printf("%d/n",res); ...

  10. [翻译]How to Find a Solution ( 如何找到问题的答案,来自Top Coder 网站)

    原文链接: https://www.topcoder.com/community/data-science/data-science-tutorials/how-to-find-a-solution/ ...