Category: Openwrt

  • Linux策略路由简介(翻译)

    最近想回忆一下之前研究过的linux下的策略路由,想对linux的策略路由来一个简单的介绍,不过看了来自Scott’s Weblog 的这篇博客之后,觉得它还真是够简单,好在概念还很清晰,对于理解linux的策略路由的基本的概念和框架足够了。所以我突然想翻译一下(不知道是不是有人也会翻译别人的博客的内容,翻译博客是不是层次太低了一点。。),贴在自己的博客里。从来没试过翻译,这次来试试吧。Let’s Go!以下是原文的翻译。 在这篇博客里,我要来介绍一下在最新的Ubuntu版本里面实现的Linux策略路由机制(可能在其他Linux的发行版里也已经同样实现了,不过我使用的是Ubuntu 12.04 LTS版本)。实际上,由于Linux的策略路由机制的引入,给Linux机器的网络数据路由功能提供了极大的灵活性。在后续的博客里面,我会讨论一个相当实际的Linux策略路由的配置用例。不过在这篇文章中,我们还是现在关注一下Linux策略路由的概念以及怎么使用吧。 策略路由包含了好几方面: 策略路由表(table):Linux系统中包含了三个默认的路由表:local表(这个路由表不能人为的编辑或者删除),main表,和default表。有一点需要注意的是,如果我们增加一个路由,但是没有指定它是属于哪个路由表的情况下,这个路由实际上是被加入到了main表中,而不是default表。这一点跟我们直观的想象是不一样的。 策略路由规则(rule):同样的,Linux系统中有三个默认的rule,分别对应于三个默认的路由表。 在我们应用Linux的策略路机制实现我们的特殊的需求时,一般我们需要做三件事情: 我们需要创建一张定制的策略路由表(table)。 我们需要创建一个或者多个定制的策略路由规则(rule)。 我们需要在创建的策略路由表中加入一个或者多个路由信息(route)。 让我们一步一步的介绍一下上面的三个步骤。 创建一个自己定制的策略路由表 第一步就是要创建一个自己定制的策略路由表。实际上,创建一个路由表,等同于在文件/etc/iproute2/rt_tables里面添加一行新的记录。所以比如我们想要创建一个叫custom的路由表的话,实际上也就可以使用下面的命令直接对rt_tables文件进行操作。 # echo 200 custom >> /etc/iproute2/rt_tables 上面的这个命令创建了一个名字叫做custom, id为200的路由表。请记住这个路由表的名字,因为我们在下面介绍路由规则(rule)和以及编辑路由表的时候,就是用的这个路由表。需要知道的是,因为这个路由表是直接存放在rt_tables文件中的,所以,在Linux机器重启之后,这个路由表也会仍然存在。 创建策略路由规则(rule) 在创建了路由表之后,下一步就是创建路由规则(rule),路由规则会告诉系统使用哪个路由表(table)去做路由。在本文中,作为一个例子,我想根据数据的源地址来制定一个路由规则。这其实是策略路由的一个很常见的应用,而且因为这个路由规则是依据源地址的,所以这样的场景也叫作源地址路由(source routing). 使用下面的命令来创建一个策略路由规则: # ip rule add from “source_address” lookup “table_name” 假设我们有这样的需求,对于所有的从IP地址192.168.30.200来的数据,我们希望系统将其交给我们之前创建的叫做custom的路由表去做路由。那么我们只要使用下面的命令来创建这个rule就可以了。 # ip rule add from 192.168.30.200 lookup custom 我们可以使用下面的命令来查看当前系统中所有有效的路由规则: # ip rule list 我在这篇文章的开头也说过,对应于local, main和default这三个系统中的路由表,分别也各自有一个对应的规则。在我们新增了自己的路由规则之后,在上面的命令的输出中,应该也能够看到它。 但是,这里还有一个小问题,那就是用这样的方式创建的路由规则(rule)并不是永久的,也就是说,如果系统重启之后(或者是网络重启),使用上面这样的命令创建的rule就会随之丢失了。如果想要创建的路由规则在重启系统或者重启网络之后也不会丢失,那么我们需要在/etc/network/interfaces这个文件里面加入一行: post-up ip…

  • 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–USB口有关的那些事

    拥有一个USB口,而且价格便宜,是WR720N相对于其他能够刷openwrt的无线路由器的一个小小的比较优势。有些路由器能刷openwrt,价格也很便宜,但是一般没有USB口,有些路由器有USB口,那么一般价格就比较贵。而在笃信信价比至上的x丝人群的眼中,WR720N就那么闪亮的登场并俘获了许多粉丝。它很便宜,能刷openwrt,而且还带USB口! 之前买它的时候,并不知道USB口对于刷openwrt会有不小的作用,只是觉得,如果能接3G上网卡上网,也是很酷的一件事情。等到刷了机之后,才发现当初的这个决定是多么的英明和有前瞻性,不由得佩服得连连点头。 为什么在刷openwrt的路由器上有一个USB会很有用,其实也很简单。有了USB口就可以接各种各样的USB外设,比如摄像头,比如USB口的打印机,比如zigbee网关什么的。只有能想到的,一般就都能够被openwrt支持。这样,安装了openwrt的无线路由器的功能就再也不局限于路由器了!它能够摇身一变,成为一些听起来很高大上的东西,比如家庭网关..或者物联网平台。。不过对于我而言,上面的这些都太高大上了一点,我的需求很简单也很直接,我可以接U盘和硬盘到WR720N上去,这样就能扩展这个无线路由器的容量了! 因为WR720N的Flash只有4M,4M可以装的一下一个精简版的openwrt系统没有问题,我记得刷机之后4M的flash好像也就剩下几十K的大小了。这样的话,虽然基本的无线路由器系统能够正常运行没有问题,但是扩展起来真的就没什么空间了。很多的扩展功能是需要安装软件的,软件是需要空间存放的,如果空间都没有的话,那么说openwrt能实现再多的牛逼功能,那都是空谈加扯淡而已,巧妇难为无米之炊。所以,如果有了USB口的话,我们就能够接上USB口的大容量存储设备,而Openwrt是提供了方法能够将整个的文件系统或者部分的文件系统迁移到外部存储设备上的(真是贴心!)。这样的话,存储空间就再也不是问题,空间有多大,就看你愿买多大的U盘或者移动硬盘了。那你想装什么软件就装什么软件吧,想搞什么服务就搞什么服务吧,这时候我们只要考虑CPU,RAM吃不吃得消就行了,而存储空间,再也不是瓶颈。 而且对于我来说,一个很有用的Use Case是,有了大的存储空间,我就可以把我的那些照片啊,视频啊什么的,都存储在无线路由器上,这样内网的所有的机器都能够统一访问这些文件了,而且如果做了DDNS的话,那么在外网也能访问这些文件了!这不就是一个文件服务器么,虽然性能应该很烂。 多么诱人的想法!而这些想法,正是因为WR720N有了一个USB口,而变为了可能。多么的幸福,不由得再次连连点头。 那来瞧瞧,怎么样操作,Openwrt就能够将文件系统转移到外部的U盘上,也就是openwrt号称的overlay技术. 第一步:准备工作 根据openwrt的文档系统的说明,如果要让WR720N支持外接USB存储设备的话,需要将路由器上的那个物理开关拨到3G模式,要不然不行! 准备一个U盘,并将其分为两个分区,并将一个分区格式化为ext4文件系统(或者ext2,ext3分区都可以),另外一个作为swap分区。具体怎么分区,google一下,会有一大串操作说明。我是在linux虚拟机里面操作的。 分区结束之后,将U盘连到路由器上。 第二步:让Openwrt支持USB存储设备 Openwrt需要安装模块才能够支持外设的USB存储设备,使用下面的命令。 # opkg update # opkg install kmod-usb-storage 上面的操作完成之后,重启一下路由器,重启完成之后,应该就能在/dev/目录下发现类似叫做”sd1″的设备了,这就说明openwrt已经能够识别U盘了。 接着使用下面的命令,让openwrt支持EXT4文件系统和exroot. # opkg update # opkg install block-mount kmod-fs-ext4 其中的kmod-fs-ext4是用来让openwrt支持EXT4文件系统的,安装完这个模块后,除了EXT4文件系统,同时也向下兼容EXT3和EXT2文件系统。 而block-mount模块是用来支持exroot的,就是让openwrt能够将文件系统转移到外部存储设备上。 然后重启让模块生效。 # reboot 第三步:overlay操作 在路由器重启完成之后,连接的U盘就已经能够完全被Openwrt系统识别和操作了。这时候我们就可以做overlay操作,也就是将文件系统搬移到U盘里面去!完成之后,文件系统的大小,就再也不是那个可怜的4M了,U盘有多大,文件系统就有多大! overlay的展现形式,按照Openwrt文档上的描述,其实是有两种: 一种是完全拷贝,将文件系统完全拷贝到外部存储中,然后系统启动的时候,直接跳转到外部存储设备中启动(?) 还有一种形式是将文件系统的内容拷贝到外部存储设备中,然后编辑原文件系统中的fstab文件,让其在系统启动之后运行时将外部设备中的文件系统挂载为系统的根文件系统,覆盖一开始的文件系统。 我使用了后一种形式。将系统根目录下的/overlay这个节点里面的内容拷贝到外部U盘中,然后编辑fstab文件。 首先需要挂载外部U盘。假设U盘的设备节点是/dev/sda1的话,那么将其挂载到/mnt/sda1上。 # mkdir /mnt/sda1 # mount -t ext4 /dev/sda1 /mnt/sda1 然后将系统的/overlay目录下的所有的内容都拷贝到/mnt/sda1里面去。 # tar…

  • 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…