家用路由器 实现 Web认证

转载需注明,本文地址:http://blog.csdn.net/btyh17mxy/article/details/17281781

简介和原理

        上个月跟某神秘部门一小哥吃饭时听说有人将wifi热点伪装成公共wifi(也叫Wlan,例如移动联通电信的CMCC、China-Unicom、China-Net等)来盗取用户数据,很好奇其实现方式。Google一番后发现,Wlan是基于Web认证实现的。简单说就是通过在路由器上一番设置,让未登录用户无论访问什么网址都显示登录页面,只有登录成功后才能正常上网。然而家庭用的路由器通常不具有那些复杂的功能,似乎只有上千块的路由器才有这些功能。但本文给出了一种使用家用路由器实现web认证的简单方法。

        原理的话还比较简单,无线路由器A(下简称路由器A)连接互联网,笔记本(下简称PC)通过wifi连接路由器A,无线路由器B(下简称路由器B)通过网线连接PC(如图1-1)。将路由器B的工作模式设成“无线AP”(如图1-2)。由PC合路由器B组成一个内网,在该内网中PC充当Router,路由器B只是一个无线交换机,因此PC便可完全控制该子网。

图1-1                                                                                                                                                         

  图1-2

准备工作

        本文介绍的方法是在Ubuntu12.04下实现的,需要用到以下设备和工具:
        0、一台笔记本(或台式)电脑,要求电脑有一个无线网卡和一个有线网卡。
        1、两个普通无线路由器,网线两三根。
        2、iptables
        3、dhcp3-server
        4、Apache
        5、python2.7
        6、webpy(一个python库,django也可以)
        7、一只闲的蛋疼的程序猿


        其中电脑用于充当路由器,一个无线路由器用于提供互联网接入,另一个用于伪装热点,iptables用于实现转发功能,dhcp3-server是DHCP服务器,Apache用于充当web服务器,python2.7和webpy用于实现一些简单的登录网页,一只闲的蛋疼的程序猿用于完成这些工作。各位看官自行准备这些东西。


配置DHCP服务器

        就是将你的笔记本配置成DHCP服务器,在网络中充当Router。

        1、固定有线端口IP地址

在PC上运行

  1. sudo gedit /etc/network/interfaces  
sudo gedit /etc/network/interfaces

插入以下内容

  1. auto eth0  
  2.     iface eth0 inet static  
  3.     address 192.168.4.5  
  4.     netmask 255.255.255.0  
  5.     network 192.168.4.0  
  6.     broadcast 192.168.1.255  
  7.     gateway 192.168.4.1  
auto eth0
    iface eth0 inet static
    address 192.168.4.5
    netmask 255.255.255.0
    network 192.168.4.0
    broadcast 192.168.1.255
    gateway 192.168.4.1

这里应注意我的有线端口叫“eth0”,各位应根据自己情况自行修改。

        2、配置DHCP服务

编辑isc-dhcp-server

  1. sudo gedit /etc/default/isc-dhcp-server  
sudo gedit /etc/default/isc-dhcp-server
增加如下内容

  1. INTERFACES=”eth0”  
INTERFACES="eth0"


编辑dhcpd.conf
  1. sudo gedit /etc/dhcp/dhcpd.conf  
sudo gedit /etc/dhcp/dhcpd.conf
增加如下内容

  1. ddns-update-style interim;  
  2. ignore client-updates;  
  3. allow bootp;  
  4. allow booting;  
  5.   
  6. subnet 192.168.4.0 netmask 255.255.255.0 {  
  7.   
  8.     option routers 192.168.4.5;  
  9.     option subnet-mask 255.255.255.0;  
  10.     next-server 192.168.4.5;  
  11.     filename=“pxelinux.0”;  
  12.     option time-offset -18000; # Eastern Standard Time  
  13.   
  14.     range 192.168.4.10 192.168.4.100;#子网ip从192.168.4.10到192.168.4.100  
  15.     default-lease-time 21600;  
  16.     max-lease-time 43200;  
  17. }  
ddns-update-style interim;
ignore client-updates;
allow bootp;
allow booting;

subnet 192.168.4.0 netmask 255.255.255.0 {

    option routers 192.168.4.5;
    option subnet-mask 255.255.255.0;
    next-server 192.168.4.5;
    filename="pxelinux.0";
    option time-offset -18000; # Eastern Standard Time

    range 192.168.4.10 192.168.4.100;#子网ip从192.168.4.10到192.168.4.100
    default-lease-time 21600;
    max-lease-time 43200;
}


启动DHCP服务,运行:
  1. sudo service isc-dhcp-server start  
sudo service isc-dhcp-server start
如果终端中显示如下形式消息则成功,否则启动失败。
  1. isc-dhcp-server start/running, process XXXX  
isc-dhcp-server start/running, process XXXX
如果启动失败,可以运行以下命令察看Log分析原因
  1. sudo tail -f /var/log/syslog | grep dhcpd  
sudo tail -f /var/log/syslog | grep dhcpd


配置路由器B

开始这一步前应确保上一步已经配置成功了。
然后打开路由器B的设置页面,将“工作模式”改为“无线AP”(如图1-2),等待路由器重启完成后再将“LAN口设置”中的“类型”改为“动态IP(DHCP)”,如图3-3-1。

                                                图3-3-1

修改完成后,在PC上打开浏览器访问“192.168.4.10”,如果能打开路由器B的配置页面则设置成功。

如果设置成功,你可以尝试使用手机通过wifi链接路由器B,此时在手机上只能打开路由器B的设置页面,而不能访问互联网,要想能够访问互联网还需设置转发规则。

设置转发规则(一)

        开启ip转发

  1. sudo gedit /etc/sysctl.conf  
sudo gedit /etc/sysctl.conf

找到net.ipv4.ip_forward= 1,取消这一行的注释,保存后再运行

  1. sysctl -p  
sysctl -p

        设置规则

运行:

  1. sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE  
sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE


这时再回到手机上,打开浏览器应该就可以正常访问互联网了,但是我们离要实现web验证的目标还差那么一丢丢。


设置转发规则(二)

        要想实现web验证功能,我们就要让未经验证的终端不能上网,同样我们也使用iptables的转发功能,运行:

        iptables -t nat -A PREROUTING -s 192.168.4.11/32 -i eth0 -p tcp –dport 80 -j REDIRECT –to-port 8886

        这行命令实现的是将ip地址为192.168.4.11的终端80端口的通讯转发到PC的8086端口,这样该终端就不能正常上网了,由于子网ip范围是从192.168.4.10到192.168.4.100,其中192.168.4.10是路由器B,那么我们就应该对192.168.4.11到192.168.4.100的所有ip都进行转发,这样他们就都不能上网了。


使用webpy完成web验证功能

        创建一个叫”j.py“的Python脚本,写入以下内容:

[python] view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. import web  
  2.   
  3. urls = (”/.*”“hello”)  
  4. app = web.application(urls, globals())  
  5.   
  6. class hello:  
  7.     def GET(self):  
  8.         return “”“ 
  9.         <html> 
  10.         <head> 
  11.         <meta http-equiv=”Content-Language” content=”zh-CN”> 
  12.         <meta HTTP-EQUIV=”Content-Type” CONTENT=”text/html; charset=gb2312”> 
  13.         <meta http-equiv=”refresh” content=”0.1;url=http://192.168.6.28:8888/login/hahaha/heheh”> 
  14.         <title></title> 
  15.         </head> 
  16.         <body> 
  17.         </body> 
  18.         </html> 
  19.         ”“”  
  20.   
  21. if __name__ == “__main__”:  
  22.     app.run()  
import web

urls = ("/.*", "hello")
app = web.application(urls, globals())

class hello:
    def GET(self):
        return """
        <html>
        <head>
        <meta http-equiv="Content-Language" content="zh-CN">
        <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
        <meta http-equiv="refresh" content="0.1;url=http://192.168.6.28:8888/login/hahaha/heheh">
        <title></title>
        </head>
        <body>
        </body>
        </html>
        """

if __name__ == "__main__":
    app.run()

        再创建一个叫”s.py”的Python脚本,写入以下内容:


[python] view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. import web  
  2. import os  
  3. urls = (”/.*”“hello”)  
  4. app = web.application(urls, globals())  
  5.   
  6. class hello:  
  7.     def GET(self):  
  8.         #f = open(“login.html”)  
  9.         return  “”“ 
  10.         <html> 
  11.         <head> 
  12.         <meta http-equiv=”Content-Language” content=”zh-CN”> 
  13.         <meta HTTP-EQUIV=”Content-Type” CONTENT=”text/html; charset=gb2312”> 
  14.         <title></title> 
  15.         </head> 
  16.         <body> 
  17.             <form action=”“ method=”post”> 
  18.               <p>username<input type=”text” name=”name” /></p> 
  19.               <p>password<input type=”text” name=”pwd” /></p> 
  20.               <input type=”submit” value=”Login” /> 
  21.             </form> 
  22.         </body> 
  23.         </html> 
  24.         ”“”  
  25.   
  26. if __name__ == “__main__”:  
  27.     app.run()  
import web
import os
urls = ("/.*", "hello")
app = web.application(urls, globals())

class hello:
    def GET(self):
        #f = open("login.html")
        return  """
        <html>
        <head>
        <meta http-equiv="Content-Language" content="zh-CN">
        <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
        <title></title>
        </head>
        <body>
            <form action="" method="post">
              <p>username<input type="text" name="name" /></p>
              <p>password<input type="text" name="pwd" /></p>
              <input type="submit" value="Login" />
            </form>
        </body>
        </html>
        """

if __name__ == "__main__":
    app.run()

        执行

  1. python ./j.py 8886  
python ./j.py 8886

  1. python ./s.py 8888  
python ./s.py 8888



        这回在链接路由器B的其他终端上无论打开一个什么网址都会显示如图7-1-1的网页。

        

                      图7-1-1
        如果你感觉太麻烦的话,完全可以不用理会“j.py”,只需要执行“python ./s.py 8886”也行(注意是8886)。

        还是简单解释一下吧,iptables将80端口的所有通讯全部转发到了8886端口上,也就是说无论链接路由器B的终端通过80端口访问什么网址,都会指向PC的8886端口。我们在PC上开一个Python的web应用监听8886端口,无论其访问什么url都打开同样的一个登陆页面,这样就实现了简单的web验证功能。至于为什么要用j.py跳转一下,是因为如果不跳转的话即使浏览器中打开了我们设定的登陆页面,但是地址栏里还是会显示用户打开的原始网址,感觉不爽(说的不清楚,诸位自己体验下吧)。

        当然如果要伪装成CMCC的话,你可以将路由器B的SSID修改成“CMCC“,再将登陆页面写成跟CMCC的登陆页面一样的样式。这样一般用户是无法识别的,造成的后果就是轻则wifi帐号被盗,重则被钓鱼各种帐号外泄。


一些后续工作

前面的操作只实现了显示web认证页面的功能,我们还可以在”s.py”的hello类里实现POST方法,获取终端提交的表单,验证其账户合法性,并通过web.ctx.ip获取终端ip,再通过subprocess执行语句删除针对该IP的转发规则(就像下面那样)。
  1. iptables -t nat -D PREROUTING -s 192.168.4.11/32 -i eth0 -p tcp –dport 80 -j REDIRECT –to-port 8886  
iptables -t nat -D PREROUTING -s 192.168.4.11/32 -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8886

还需要说明的是本文中使用的只是一个测试的方法,实际操作中应将所有端口都转发,而不是仅仅转发80端口。而且还可以将PC配置为DNS服务器,这样就可以完全控制网络了。我觉得现实中的黑客有可能就是在PC上配置了DNS服务,那样子他们就能把用户访问的网站替换成黑客的钓鱼网站。















### 回答1: 开发路由器web框架是为了实现路由器Web管理界面的开发和管理,使用户可以方便地通过浏览器对路由器进行配置和管理。 首先,开发路由器web框架需要具备良好的响应性能和稳定性。通过使用高效的编程语言和框架,可以保证用户在使用Web界面时的流畅体验。同时,对于路由器来说,稳定性也非常重要,因为它需要长期稳定地运行。 其次,开发路由器web框架需要具备丰富的功能和易用性。通过提供各种配置选项和管理功能,用户可以轻松地进行网络设置、安全设置、无线网络管理等操作。同时,还可以提供实时的系统状态监控、日志记录和故障排除功能,让用户能够全面了解和管理自己的路由器。 此外,开发路由器web框架还应具备一定的安全性。通过对用户身份验证、访问控制和数据加密等措施的应用,可以保护用户的隐私和数据安全,防止路由器被未经授权的人访问和攻击。 最后,开发路由器web框架需要与路由器硬件和操作系统兼容。这意味着要考虑到不同型号和不同品牌的路由器,以及不同的操作系统平台,确保Web界面可以在各种设备上正常运行和显示,为用户提供统一的使用体验。 总之,开发路由器web框架需要考虑响应性能、稳定性、功能易用性、安全性和兼容性等方面,以提供用户友好的管理界面和良好的使用体验。 ### 回答2: 开发路由器web框架主要是为了实现路由器的网页管理界面,使用户可以通过浏览器进行路由器的设置和管理。一个好的web框架应该具备以下特点: 1. 轻量级:由于路由器的硬件资源有限,所以web框架应该尽量减少对系统资源的占用。轻量级的web框架可以提高系统的响应速度,使用户的操作更加流畅。 2. 安全性:由于路由器管理涉及到敏感信息和网络安全,所以web框架需要具备严密的安全措施,包括身份验证、访问控制、加密通信等,保障用户的数据和网络安全。 3. 灵活性:不同用户对于路由器功能的需求可能有所不同,因此web框架应该具备灵活性,可以适应不同用户的需求。开发人员应该提供丰富的扩展机制,使用户可以根据自己的需求进行定制和扩展。 4. 易用性:web框架应该具备友好的用户界面和清晰的操作流程,使用户可以方便地进行路由器的设置和管理。同时,框架应该具备良好的文档和示例,帮助用户快速上手并解决问题。 5. 性能优化:由于路由器的性能和资源有限,web框架需要进行性能优化,包括压缩资源、缓存数据、异步加载等技术手段,提高系统的响应速度和效率。 总之,开发路由器web框架需要综合考虑路由器的硬件资源、用户需求和系统安全等因素,以提供一个功能完善、性能优秀、易用安全的网页管理界面。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值