-
WR720N安装Openwrt–路由器强制复位
在配置Wr720N的时候,由于操作失误,将/etc目录给删掉了(就是搞exroot搞出来的莫名奇妙的问题). 然后路由器重启的时候,就会处于LED一直闪烁,但是系统怎么也起不起来的情况(目测大概一秒两次的闪烁频率). 没办法,只能想办法重置机器了. 采用了网上的处理方法: 路由器拔电,再插电,然后用一根牙签不断的点击reset键(注意不是长按,是不断的点击). 这个过程可能会持续十几、二十秒左右吧,然后就能从LED看到明显的变化. 如果路由器的LED灯突然快速的闪烁起来的话(这个频率明显跟之前进不了系统的频率不一样,非常的快,每秒可能能闪10次左右的频率) 那么,说明路由器已经进入了安全模式了,这时候就可以使用telnet 192.168.1.1登录路由器,应该是可以直接登录的,没有密码. 登录之后,我使用了下面的两个命令将路由器给重置了: # mount_root # mtd -r erase rootfs_data 然后重启,就可以了,就又可以登录openwrt系统,但是需要重头开始配置了,要安装的软件也要重新再安装一遍了.
-
WR720N安装Openwrt–单线多拨
单线多拨是一个很诱人的东西,之前听都没听说过。我刷Openwrt的初衷比较简单,就是折腾一下linux系统,顺便做做文件服务器什么的。但是在论坛里面看了一下,发现好多人刷Openwrt的主要的目的,一个是翻墙,还有一个就是这个单线多拨了。因为之前一点都不了解,Google了一下,才发现,这个功能确实看起来是那么的诱人! 简单的说,多拨的概念是,一个路由器能同时连接多个ISP,从而使得带宽能够得到叠加。比如说家里面开通了一条电信的宽带,又开通了一个联通的宽带,那么路由器就可以用一个网口接电信的线路,另外一个网口接联通的线路,如果路由器支持多拨的话,那么这两条线路的带宽就可以叠加,家里的上网速度就嗖嗖嗖的上去了。除了这个功能之外,还可以做负载均衡,特定的流量走特定的线路之类的事情。这样的情形,应该叫做多线多拨。 不过,这种同时开通几个宽带的事情,不知道企业里面会不会做,家庭用户应该是不会这样做的吧,有这个必要吗?太能折腾了吧。 多线多拨,对于只是用来上上网的家庭用户的话,只要不是吃饱了撑着,实在没事干,基本上是没有这个需求的。但是如果是单线多拨呢?我觉得只要大家了解了这是干嘛的,估计立马会噌的一下血压升高,脑门发烫,忍不住咽个不自觉留下的口水。好吧,也不至于都这么的x丝,可能只有我是这样的。单线多拨的概念是,在同一个ISP链路上,同时建立多个连接。这实际上并不是一个什么新奇的东西,我们家用的电信的宽带,在没有破解电信猫之前,电信提供的服务是很没意思的,它限制使用用户的数量,只允许家里面4个设备同时上网,每个设备上网的话都需要单独拨号。这种情况实际上就是在一条链路上建了多个PPPOE的连接。只不过后来我们家的电信猫被破解了,电信猫改成了路由模式之后,就不需要每个设备单独拨号了。这里说这个,只是说明单线多拨什么的,其实也没有什么特殊的地方,一直以来,一条物理链路上都是允许建立多个逻辑链路的。但是如果跟刚才举的那个例子对比,单线多拨有一个特殊的地方,那就是,同样是建立多个pppoe的连接,刚才举的例子是,每个设备都只能建立一个自己的pppoe连接,而单线多拨是在同一个设备上(路由器)建立了多个pppoe的连接! 在刷了Openwrt的路由器上,是有软件能够实现这个单线多拨的功能的。但是,多拨了,带宽就一定能叠加吗?这可不一定。我们家宽带是50M的,那我来弄个10拨,同时建10个pppoe连接,那带宽就能到500M吗?太牛逼了吧。一般正常的情况下,大多数的多拨是起不了作用的,因为ISP也不是傻叉,哪有这好事?但是根据网上的说法,在某些时候,某些城市,某些运营商,由于自己的网络配置的问题,多拨就会产生梦寐以求的带宽能叠加的效果!所以,这个单线多拨能不能成功实现带宽叠加,主要不是看技术,拼运气,拼人品,才是最重要的! 上网搜搜,就会发现,有一种说法是,如果端口速度和签约速率不匹配,那么,多拨速率叠加就是可能的。所谓签约速率,就是我们跟ISP签约的时候,告诉我们的速率,比如我们家原来是电信的4M宽带,现在老用户免费升级到了50M。端口速率是我们终端用户不知道的一个运营商内部设置的参数,比如说100M。如果端口速率大于签约速率的话,那么多拨速率叠加就是可能的。 上面的这个说法,不知道是真是假。不管怎么样,反正是拼人品的事,怎么着也得先折腾折腾,说不定就成了呢?所以,先不管这个不可控的因素,咱可以先来研究研究技术上,怎么实现多拨,其他的丢给现实去吧。 关于openwrt上的多拨,实际上有好多个方案。不同的人开发了好几款不同的软件,比如NWan,MWan,MutiWan,M-Route(摘自google…),都能实现单线多拨。我没有研究比较过所有的这几个软件,只使用过mwan3。从我的WR720N的表现来说,mwan3是可以正常工作的。已经记不清楚为什么使用mwan3这个软件了,可能是openwrt的wiki上有关于这个工具的介绍吧。然后我记得在openwrt的论坛里面,这个软件的作者也对这个软件的原理和使用做了比较详细的说明,觉得比较靠谱。 首先mwan3是由openwrt论坛上的一个叫做Adze的用户发布的,我不太了解历史,这个人应该之前已经发布了mwan2软件,mwan3是他发布的最新版本。参考这个链接,里面有Adze对自己的这个软件的描述。我之前也看了他的这个帖子,对软件的基本原来有了一点大概的了解。 实际上mwan3这个软件,并不仅仅局限于用于单线多拨,从Adze的描述来看,mwan3实际上主要是应用于多线多拨,也就是我们一开头描述的那种情况。并且带了一系列复杂的配置参数,主要是应付不同的应用场景的。它采用的技术,就是功能非常强大的linux策略路(ip工具)加上iptables这两个牛逼的东东。根据不同的配置,mwan3能够实现各种各样的流量分流,负载均衡,QOS等等复杂的功能。针对我们的单线多拨需求,实际上仅仅使用了mwan3提供的负载均衡功能。 说到底,要实现单线多拨,我们需要在openwrt上做些什么?其实说起来也不复杂,基本的需求就三个。 在一个物理网口上虚拟出多个“逻辑”网口 每个“逻辑”网口单独拨号各自建立跟ISP的连接 多个“逻辑”网口上建立的多个连接之间做负载均衡 需要做的事情就是上面列出来的这么多,而mwan3所起的作用就是上面的第三个,做负载均衡。 操作的话按照下面的流程来,基本上是参考的恩山论坛上的叫worker的会员提供的操作手册来操作的,参考这个链接,worker还提供了一个pdf版本的操作手册,在链接上应该能够下载到,他已经把整个流程说的很清楚了。 第一步:安装相应的软件包 安装相应的软件模块ip/macvlan/mwan3 # opkg update # opkg install ip kmod-macvlan mwan3,luci-app-mwan3 ip工具包是基本的软件包,应该是自带的(记不清了),在我们这个需求里面,它主要提供网络配置和策略路由功能,macvlan模块主要提供虚拟网卡功能,mwan3提供负载均衡功能。luci-app-mwan3是mwan3的图形化管理工具。 第二步:创建多个虚拟网卡 使用下面的命令创建一个新的虚拟网卡并激活它。 # ip link add link eth0 name macvlan0 type macvlan # ifconfig macvlan0 hw ether FE:BC:51:C4:0A:23 # ifconfig macvlan0 up 其中eth0需要换成路由器上实际的对外的网口(正常的话应该也是eth0),macvlan0就是新生成的虚拟网卡的名称,可以随便命令,还有ether参数,虚拟网卡的以太网的地址,随便给一个就行了。这样,一个虚拟网卡就生成好。 接下来,还可以用同样的方法生成多个虚拟网卡,就看我们需要几拨了。我的WR720N使用了三拨,所以使用的命令最终是下面的这样。 # ip link…
-
WR720N 安装 Openwrt–刷机和基本配置
几年前为了出差方便,买了一个TP-Link的便携式路由器,型号是WR720N V3.带两个网口,还带一个USB口,支持USB网卡使用3G网络。 后来因为家里的无线覆盖有死角,所以就用这个迷你路由器覆盖死角,一直用到现在。 本着折腾的心态,一直想给这个WR720N装上Openwrt,之前官方一直没有支持,但是似乎有一些牛人在网上流传一些自己编译的版本。不过好像刷机还是有点麻烦,就一直没有尝试。直到看到网上林国锋的这篇文章,才知道官方已经支持了WR720N了,非常惊喜,我猜想为什么官方会支持这个型号的路由器,可能主要还是因为它恰好带了一个USB口吧。这样一来,仅仅4M的flash空间再也不是问题,可以折腾的空间变得异常的辽阔。 于是还是参考林国锋的这边文章,给我的WR720N刷了机,基本上就是按照他文章里面的内容来操作的.流程其实也很简单,其实openwrt网站上的文档系统做的已经非常好,也可以直接参考openwrt上的操作流程。 第一步:下载专用固件 目前openwrt的最新版本15.05的Chaos Calmer已经支持WR720N.所以我们可以下载最新的版本(我的WR720N还是用的老版本的14.07的Barrier Breaker,还没升级到最新版本) http://downloads.openwrt.org/chaos_calmer/15.05/ar71xx/generic/openwrt-15.05-ar71xx-generic-tl-wr720n-v3-squashfs-factory.bin 第二步:升级固件 在TP-Link自带的管理网页上(应该是192.168.1.1?)提供了选项进行固件升级,看起来就跟下面的图类似(盗图自林国锋). 选择下载下来的固件,然后点击升级之后,WR720N就进入了刷机,过程需要多长时间忘记了,那么依然盗用参考林国锋的描述,大概一两分钟吧,升级就完成了。 第三步:配置无线 升级完成了,默认无线是没有打开的,我们需要首先通过网线连上路由器,然后telnet上去打开无线。 刷机过程大概一两分钟,路由重启后使用 @telnet@ 命令连接路由 telnet 192.168.1.1 默认应该是不用帐号密码的,如果需要就是admin。接着就是开启无线,命令 # vi /etc/config/wireless 删除 @option disabled 1@ 即可 修改密码并开启ssh # passwd 输入两次密码即可,现在重启 # reboot 第四步:设置拨号上网 如果没有记错的话,更改了password之后,openwrt的ssh服务就自动开启了,等到路由器重启完成之后,就可以使用ssh通过无线连接上WR720N了。自然接下来需要让路由器连接上外网(不然的话,这样的路由器有个鸟用?。。)我家的光猫没有设置路由模式,所以我的WR720N需要自己拨号上网,那么可以按照下面的方法来操作。如果openwrt路由器是作为二级路由配置的话(openwrt不需要自己拨号,直接被分配了内网IP),那么请不要按照下面的方法操作(配置更简单,但是懒得去搜了,自己去openwrt的官网上搜吧)。 # vi /etc/config/network 将配置改成下面这样的: config interface ‘loopback’ option ifname ‘lo’ option proto ‘static’ option ipaddr ‘127.0.0.1’ option netmask…
-
Openwrt使用DNSPod服务做动态域名解析(ddns)–一些优化
一个基本的使用DNSPOD提供的API来实现ddns的脚本已经能够工作了,这是一个基础的脚本,实现的是最基本也是最直接的工作。 除了基础功能的需求,我的wr720n上运行脚本之后,发现了我还有一些其他的额外的需求,脚本需要针对这些需求j来做一些改进和优化。 这些额外的需求是: 我的wr720n上安装了多播的软件(我设置的是3播),所以wrt720上会同时获取3个外网地址。由于有负载均衡,每次访问api网页的时候,可能会从3个接口中的任意一个出去,这实际上是没必要的,因为这会导致多次调用脚本的时候,实际上是一直在三个ip中切来切去。我希望每次更新ip的时候,访问api网页都是通过同一个网络接口出去的。 脚本中使用的验证机制是用户名+密码的机制,这个机制比较的原始。而DNSPOD是支持使用token的机制的。使用token机制看起来会比较的更加安全一点。 执行脚本的时候,先检查一下当前的ip地址跟DNS解析出来的ip地址是否一致,如果不一致才更新ip地址。 每次向服务器更新ip的时候,都要通过调用两次api接口分别用于查询domain_id和record_id,而这其实是一个比较费时间的过程。实际上domain_id和record_id对于某个特定的域名来说是固定的,就是说只要查询一次,下次直接使用就可以了。可以做优化缓存domain_id和record_id。 针对第一个需求,其实使用的方法也很简单。因为脚本使用curl命令去访问DNSPOD的API的,而curl命令是支持指定特定的网络接口的,添加一个选项”–interface xxx”就可以了。wr720n上,比如我希望每次访问api去更新ddns的ip的时候使用”pppoe-VWAN1″接口,那么脚本中的dnspod_update_record_ip()函数可以修改为: dnspod_update_record_ip(){ options=”login_email=${ACCOUNT}&login_password=${PASSWORD}”; curl -k -s –interface pppoe-VWAN1 https://dnsapi.cn/Record.Ddns -d “${options}&domain_id=${DOMAIN_ID}&record_id=${RECORD_ID}&sub_domain=${RECORD_NAME}&record_line=${RECORD_LINE}”; 针对第二个需求,其实解决方法也很简单,参考DNSPOD的API的官方手册就可以了。首先要做的是在DNSPOD的账号里面申请一个token.申请成功之后,在DNSPOD的账户中能够察看到token_id和token.然后在脚本中将所有的使用login_email和login_password组合的地方改为下面的格式即可: login_token=token_id,token 针对第三个需求, 确定DNS解析出来的域名的ip地址的方法,可以使用”nslookup”命令查询,这个命令能够返回查询域名的当前解析出来的ip地址。 而确定当前路由器上的ip地址的方法主要有两种。 一种是网络上有一些提供检测ip地址的网页,只要访问这些网页,就能够返回当前访问者自己的ip地址。 一种是直接使用ifconfig(或者ip命令)命令直接查询openwrt本机上的外网ip地址。 这两种方法各有优势,第一种方法的优点是无论路由器的ip地址是怎么配置的,总能够得到路由器的ip地址,缺点是不能够保证网络上提供ip地址解析服务的网站一直都能提供服务,说不定哪一天就停止服务了。而且是通过网络查询,经过实际测试,速度比较慢。 第二种方法的优点是速度快。但是缺点是,在路由器上,必须配有外网地址。如果openwrt是二级路由器之类的,也就是只配有”192.168.x.x”这样的机器,那就不行了,使用本机的ifconfig命令不能够直接获取到外网的ip地址。 我的wr720n机器是直接通过pppoe连接到外网的,所以是能够通过本机命令获取ip地址的。所以我使用了第二种方法。在脚本中增加下面的一个函数dnspod_is_record_updated(): dnspod_is_record_updated(){ #Format is “Address 1: 117.89.152.129″ record_ip=`nslookup home.proudj.com |tail -n 1 |cut -d ” ” -f 3`; # #Format is ” inet 117.89.152.129 peer 61.155.116.217/32 scope…
-
Openwrt使用DNSPod服务做动态域名解析(dans)–基本功能
ddns的用处自然不用多说了。凡是在家里跑的什么盒子啊,板子啊的,都希望给他们一个域名,这样从外网就能直接访问机器上的各种服务和资源了。家里面的网络,一般都是动态分配IP的,ISP会不定期的改变分配给我们的IP,那么这就需要机器定期的向ddns服务器更新家里面的实时的IP,从而保证域名能够解析到正确的IP地址上。 有很多的ddns的服务都可以使用,花生壳,3322,还有国外的一大堆如no-ip这样的免费ddns的服务可以使用。但是有一个限制就是如果使用他们的免费的服务的话,分配给你的域名一般是服务商自己的二级域名,比如使用3322的服务的话,分配给我的域名就是像”proudj.3322.net”这样的域名。如果想给家里的机器分配一个自己手上拥有自己的域名的二级域名,比如我想给家里的路由器分配一个我自己的proudj.com这个域名的二级域名home.proudj.com,那么一般的服务商要么不支持,要么要收费。 有没有免费的方案呢?我的proudj.com这个域名是在DNSPod做解析的,Google了一下发现,实际上DNSPod是开放了ddns的API的。也就是说是支持ddns的功能的。但是我对如何使用DNSPod的API根本不了解,所以就开始搜搜看有没有一些现成的客户端。网上有不少客户端,基于各种语言实现的都有,但是因为我是想用在WR720N上,就想用shell脚本模式的,一来openwrt上本来就自带shell环境,二来如果是Python这样的客户端,不知道运行起来,WR720N这样的32M内存是不是吃得消。于是在网上搜索shell脚本的实现,实际上网上也有不少版本的shell脚本,但是跑在我的openwrt上,总是会有各种各样的问题。之前因为脚本内容比较长,根本就没看怎么实现,这几天大概看了一下别人的脚本的实现,发现要实现一个简单的DNSPod的ddns的客户端,实际上很简单。 需求: 给家里的openwrt路由器分配一个叫做”home.proud.com”的域名。这样,以后访问路由器的服务和资源的时候,就不需要知道路由器当时的IP地址了,可以直接通过域名进行操作。 实现原理: 在openwrt本机访问链接“https://dnsapi.cn/Record.Ddns”,DNSPod服务器端在收到这个连接请求后会记下访问者的IP地址并用它来更新域名的IP地址。 使用工具: 命令行的curl工具。 curl可以作为http的客户端,去访问链接,还能够返回服务器的相应内容。是很方便的一个命令,在Openwrt上需要单独安装。 所以,实际上DNSPod上使用ddns是非常简单的。只要访问指定的链接就OK了!仅此而已,其他什么事情都不用做了!! 但是,什么都有个但是。这件事情说来确实简单,不过在使用上面的链接的时候,我们还得输入几个参数。这是很容易理解的,既然原理是通过访问api提供的链接,而DNSPod服务器通过解析发送者的IP来确定我们的IP。如此而已,那么我们显然要在访问这个链接的带上上指明了这个解析出来的IP是给哪个域名使用的,不是么?要不然DNSPod是解析出来了我们的IP,但是它哪里知道这个IP是用来更新哪个域名的呢? 那么,查一下DNSPod的API,就会发现实际上访问上面的链接的完整的格式是如下: curl -X POST https://dnsapi.cn/Record.Ddns -d ‘login_email=api@dnspod.com&login_password=password&format=json&domain_id=2317346&record_id=16894439&record_line=默认&sub_domain=www’ 上面的链接中有几个重要的参数: login_email/login_password: DNSPod的账户的用户名和密码,访问上面的链接,是需要做验证的,你必须要证明自己是某个域名的拥有着才行,要不然的话,大家可以随便随便更新,那有人恶性的想篡改别人的域名咋办呢。 domain_id/record_id: 如果我想访问上面的链接,目的是home.proudj.com这个域名更新IP。那么能想到的最简单的方法就是在链接里面把这个域名作为一个参数直接带上。但是,API没有采用这个方式,而是采用了domain_id/record_id的方式。我们在DNSPod可能托管了好多个域名解析,那么每一个域名都有一个唯一的数字,就是domain_id(代表proudj.com)。那对于某个域名,我们可能设置了好多的二级域名。那么对于每一个二级域名都有一个唯一的数字,就是record_id(代表home)。所以实际上可以看出来,domain_id+record_id就能够代表上面的”home.proudj.com”这个完整的二级域名了。 那么,怎么获取domain_id和record_id呢,其实也很简单,还是需要访问API提供的链接就行了,不过是不同的链接。 简单的流程就是,通过获取用户的域名列表能够得到属于你的所有的域名,同时也就能得到每个域名的id,查找到目标域名的domain_id之后,通过另外一个链接查找目的域名的record,能够找到所有的record。得到目的record_id之后就能够调用上面的链接更新IP啦! 下面的这个脚本就是简单的一个实现(这个脚本是 别人抄来的,但是找不到作者了): #!/bin/sh # usage: ./dnspod.sh ddns.conf #contents of file “ddns.conf” defines some variables which is like below: #ACCOUNT=”XXX” #PASSWORD=”XXX” #DOMAIN=”XXX” #RECORD_LINE=”默认” if [ “$#” != 1 ];then echo “param…