WNDR4300刷OpenWrt手记

 

一、新机刷OpenWrt方法

1)安装官方OpenWRT版本

1. 下载OpenWrt升级包:http://downloads.openwrt.org/barrier_breaker/14.07/ar71xx/nand/openwrt-ar71xx-nand-wndr4300-squashfs-sysupgrade.tar 

2. 进入原版系统,在固件升级的配置项处,选择刚刚下载的文件进行升级

3. 重启后就是OpenWrt系统

注:已经安装openWrt的系统进行升级也是用同样方法

 

2)安装开启128M的Flash支持的自定义版本

1. 在linux环境下载OpenWRT源码:

 

wget https://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/nand/OpenWrt-ImageBuilder-15.05.1-ar71xx-nand.Linux-x86_64.tar.bz2

 

2. 解压,修改Makefile文件,然后重新编译固件,让OpenWRT支持128MB NAND的空间

tar -jxvf OpenWrt-ImageBuilder-15.05.1-ar71xx-nand.Linux-x86_64.tar.bz2
cd OpenWrt-ImageBuilder-15.05.1-ar71xx-nand.Linux-x86_64/target/linux/ar71xx/
image/
sed -i -e 's/23552k/121856k/' ./Makefile
sed -i -e 's/25600k/123904k/' ./Makefile
cd ../../../..
sudo make image PROFILE=WNDR4300
ll bin/ar71xx/
# 该目录下为产出的文件:
# 升级用的固件(使用方法同:“新机刷OpenWrt方法”):openwrt-15.05.1-ar71xx-nand-wndr4300-squashfs-sysupgrade.tar
# 刷机用的固件(使用方法同:“救砖方法”):openwrt-15.05.1-ar71xx-nand-wndr4300-ubi-factory.img

 

也可以从该地址直接下载按照以上方法编译后的固件:

 

http://download.csdn.net/detail/zhiyuan411/9644939

(安装该版本后并未开启luci,只能通过telnet来登录,telnet使用方法新手自行百度,登录后使用passwd设置密码后,才能使用SSH登录;SSH登录后可以安装luci包)

 

3. 使用自定义版本

使用升级用的固件:squashfs-sysupgrade.tar文件,并不能改变分区大小。

需要使用刷机用的固件:ubi-factory.img。

注意:以上第1种方法使用后会使部分文件丢失;第2种方法使用后会使全部文件丢失。请注意备份。

 

二、救砖方法

1. 下载OpenWrt刷机包:http://downloads.openwrt.org/barrier_breaker/14.07/ar71xx/nand/openwrt-ar71xx-nand-wndr4300-ubi-factory.img

2. 下载TFTP软件:http://www.wayos.cn/down/other/tftp.rar

3. 把电脑用网线连在路由器,电脑改为固定IP:192.168.1.2,子网掩码:255.255.255.0,ip网关:192.168.1.1

4. WNDR4300用电源键断电

5. 用细针等物件按住reset键不放(reset键在4300的底部,序列号的的最左侧,是个小圆孔,标有:restore factory settings)

6. 按下4300电源键,通电

7. 直到电源灯由黄色闪烁到绿色闪烁,松开reset

8. 使用TFTP软件上传固件:路由器IP填192.168.1.1,密码留空,固件文件选择刚刚下载的OpenWrt刷机包那个img文件,点击“刷新固件”

9. 等待TFTP软件显示绿色圆点,表示刷机成功。再等待几分钟,就可以看到电源键变绿,4300起来了。

10. 此时,局域网已经支持DHCP,并可以通过 http://192.168.1.1 来进入luci管理平台,广域网口插入网线,设置后可以上网。

 

注:恢复后没有5G的配置项,解决办法:已经正常运行时,把4300断电,然后插电重启。就会看到5G的配置项。

 

三、新刷OpenWrt的初始化设置

1) 必要的设置和工具

1. 进入luci管理平台,进行一系列设置,尤其是以下几点:(如果未开启luci,则只能通过telnet来登录,登录后使用passwd设置密码后,才能使用SSH登录;SSH登录后可以安装luci包)

a) Network->wireless设置中选择enable wireless,并具体配置;从而可以通过无线连接。

b) System->Admin设置中为root用户设置密码,设置密码后就可以使用SSH方式来访问。

c) 设置时区为上海,服务器会变为正确的时间

2. 使用SSH方式访问WNDR4300,例如使用secureCRT客户端,配置好192.168.1.1,使用22端口,使用root用户和上面设置的密码登陆

设置些常用的命令,在/etc/profile添加以下内容:

 

alias ll='ls -l -h'
#alias diff=cmp

 

执行以下命令,安装luci中文界面:

 

 

opkg update
opkg install luci-i18n-chinese
#opkg install luci-i18n-base-zh-cn
#然后可以在luci的system菜单中设置为中文语言

 

安装以下常用命令工具:

 

 

#支持mkfs.ext2、mkfs.ext3、mkfs.ext4等命令
opkg install e2fsprogs
#支持ext2、ext3、ext4等分区
opkg install kmod-fs-ext4

 

执行以下命令将4300被保留的90多M空间加以使用:

 

注:此方法有瑕疵,实际应用中发现实际可用空间是远小于90M的,尝试写入了60M数据,再读取时就会出现IO ERROR,原因未知。故完美方案可参见头部的:“安装开启128M的Flash支持的自定义版本”

mkfs.ext4 /dev/mtdblock11
mkdir /local
mount /dev/mtdblock11 /local
#mount -t ext4 /dev/mtdblock11  /local -o rw,sync


上面的方法在重启后,保留的90多M空间就又不可见,故使用如下方法:

将以下语句加入到/etc/rc.local文件中,使得每次重启后都会加载保留的90多M空间到/local目录

 

mount /dev/mtdblock11 /local
#mount -t ext4 /dev/mtdblock11  /local -o rw,sync

 

修改/etc/opkg.conf,增加以下语句:

dest local /local

 

修改/etc/profile,增加以下语句:

注:opkg的alias延迟到设置完外挂硬盘后再启用,否则无法识别硬盘

 

export PATH=$PATH:/local/bin:/local/usr/bin:/local/sbin:/local/usr/sbin
export LD_LIBRARY_PATH=/usr/lib:/lib:/local/lib:/local/usr/lib 

alias opkg='opkg -d local'


执行以下命令,使得上面的配置立刻生效:

 

 

 

source /etc/profile

# /local/usr目录下建立链接:
mkdir -p /local/usr
mkdir -p /usr/include
cd /local/usr
ln -s /usr/share share
ln -s /usr/include include
# /local目录下建立链接:
cd /local
ln -s /etc etc
ln -s /www www

这样以后就可以使用opkg命令来把工具默认安装到local目录了。

为了兼容基于trunk代码编译的ipk包,执行以下语句:

 

# 原因见:http://www.ddhow.com/blog/postinst.html
echo -e "\ndefault_postinst() {\n\
\treturn 0\n\
}\n\
default_prerm() {\n\
\treturn 0\n\
}" >> /lib/functions.sh

 

2)安装常用软件

 

opkg install kmod-nls-iso8859-1 kmod-nls-utf8  # 安装语言组件iso-8859-1和utf8
opkg install libncurses
opkg install diffutils #用于使用diff命令
opkg install curl #用于使用curl命令
opkg install unzip #用于使用unzip命令
opkg install file #用于使用file命令
opkg install grep #y用于使用grep命令
opkg install openssl-util #可以使用wget直接获取https的文件
/bin/opkg -d root install luci-app-commands #安装luci界面的shell执行工具
# /bin/opkg -d root install luci-i18n-commands-zh-cn

 

安装vim编辑器

 

opkg update
opkg install vim #使用vim编辑器
unalias vim

 

然后编辑/etc/profile,修改alias选项:

 

# 注释掉以下的默认设置
#[ -x /usr/bin/vim ] && alias vi=vim || alias vim=vi
# 添加以下设置
alias vi='vim'

 

然后新建~/.vimrc,加入以下内容:

 

set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
set encoding=utf-8
set termencoding=utf-8

set noai
set tabstop=4 | set shiftwidth=4 | set expandtab

 

打开cron程序:

 

/etc/init.d/cron enable #打开自启动
/etc/init.d/cron restart

 

 

四、原理分析

1)opkg的缓存目录介绍

 

查看配置文件/etc/opkg.conf的设置可知:

其可用应用列表的缓存文件路径为:/var/opkg-lists,其实是/tmp目录下,每次重启路由器都会丢失,所以,需要重新执行opkg update来重新获取。该目录下的文件为gzip压缩后的文件,改为.gz后缀后解压缩,就可以看到文件里是一个又一个的应用信息,每个应用信息的格式如下:

 

Package: 6in4
Version: 17-1
Depends: libc, kmod-ipv6, kmod-sit
Source: package/network/ipv6/6in4
Section: net
Maintainer: Jo-Philipp Wich <xm@subsignal.org>
Architecture: all
Installed-Size: 1195
Filename: 6in4_17-1_all.ipk
Size: 1832
MD5Sum: 29f999770388c190dfafd4f6d95c70f2
SHA256sum: c48761496b35e4c5e78c3f00c73f8dd7506a5dbfedb8555020e56f0f77a4e906
Description:  Provides support for 6in4 tunnels in /etc/config/network.
 Refer to http://wiki.openwrt.org/doc/uci/network for
 configuration details.

 

其在下载应用过程中,会在/tmp目录下生成一些opkg-xxxxxx的目录,其中xxxxxx为随机字符,这些目录中会存储些下载时的临时文件,当下载正常完成时,这些目录会被自动删除。

在${dest}usr/lib/opkg目录下为opkg维护的本机已安装的应用数据信息,其中${dest}是在opkg.conf中指定的,有多个dest,就有多个这种目录,各自维护一份已安装的应用数据。其status文件存储了已经安装的应用的信息,info目录下则具体存放了每个应用的具体信息,对每个应用而言共4种类型的文件:.control和.list是必须的,分别存储了应用的基础信息和安装之后的文件信息;而.prerm和.postinst则是可选的,分别在安装之前和之后执行,用于做些初始化和清理的操作。

 

2) 分区加载说明

系统内部分区的意义如下:

"u-boot":128KB,设备初始化程序+引导程序代码本身
"kernel" :1MB,存放系统内核的二进制代码,按照x86下的讲法是Raw分区,就是这里只有内核的二进制,不存在文件系统。
"rootfs":xxMB,完整的系统文件包含只读和可写,大小随openWrt的编译版本不同而不同
"rootfs_data":xxMB,在rootfs中的可写部分的位置

系统启动时,对分区的加载如下:

1. 首先uboot启动了kernel完成之后,由kernel加载"ROM分区"(就是rootfs减去rootfs_data得到的那一块分区)
2. ROM分区采用的是Linux内核支持的squashFS文件系统(一种压缩只读文件系统),加载完毕后将其挂载到/rom目录,同时也挂载为根文件系统即/目录。
3. 系统将使用JFFS2文件系统格式化rootfs_data这部分并且将这部分挂载到/overlay目录。
4. 将/overlay透明挂载为/分区。
5. 将一部分内存挂载为/tmp目录。

注:openWrt采用了一种叫Overlay透明挂载技术,首先将/rom挂载为/根文件,然后再用/overlay覆盖在/之上,这样,当你进行文件系统的变更,修改,所做的操作将在overlay中记录。rom是不改变的。

 

五、挂载USB硬盘并实现Windows共享访问

安装USB驱动等:

opkg update
opkg install kmod-usb-core
opkg install kmod-usb-ohci #安装usb ohci控制器驱动
#opkg install kmod-usb-uhci  #UHCI USB控制器
opkg install kmod-usb2 #安装usb2.0
opkg install kmod-usb-storage #安装usb存储设备驱动
opkg install usbutils #安装了这个后可以用 lsusb
opkg install kmod-fs-ntfs #ntfs内核驱动
#opkg install mount.ntfs-3g #挂载ntfs助手
opkg install mount-utils #挂载卸载工具
opkg install ntfs-3g #挂载NTFS
opkg install kmod-fs-vfat #挂载FAT
opkg install fdisk #硬盘分区管理工具
opkg install blkid                   #用于查看USB设备uuid信息  # blkid
opkg install block-mount       #安装block-mount,安装之后luci的System--Mount Points下可以直接查看挂载点信息。

 

然后可以插上移动硬盘,可以通过以下命令来加载

 

lsusb #查看usb设备
mkdir /mnt/g500 #创建加载目录
ntfs-3g /dev/sda1 /mnt/g500 -o noatime,big_writes,async #加载移动硬盘,且使用big_writes等参数提高性能

将加载移动硬盘的命令加入到rc.local中,以完成开机自动加载:

 

mount -t ntfs-3g /dev/sda1 /mnt/g500 -o noatime,big_writes,async

 

安装samba共享

 

/bin/opkg -d root install luci-app-samba
# /bin/opkg -d root install luci-i18n-samba-zh-cn
sed -i -e 's@/usr/sbin/smbd@/local/usr/sbin/smbd@' -e 's@/usr/sbin/nmbd@/local/usr/sbin/nmbd@' /etc/init.d/samba #替换为正确的执行路径
/etc/init.d/samba enable #该句无法成功使其开机自启动,因为此时/local目录还没有加载,故实际上需要将下句加入到rc.local中
/etc/init.d/samba restart #启动samba

 

注意:因为samba是安装在local目录,故启动时执行init.d/samba时并没有完成加载local目录,不会成功。解决办法是将启动samba命令加入到rc.local中

 

然后重启路由器,再进入luci管理界面,就可以看到多出来一个“服务”菜单,下面有“网络共享”,即是samba的配置。

修改模板以增加对中文目录的支持:

#添加以下项
unix charset = UTF-8
dos charset = cp936
#去掉原来的unix charset项


添加共享目录后即可在windows下访问,例如添加:

共享名:openwrt
目录:/tmp
允许匿名用户访问:是
其他:为空


然后可以在windows下的explorer中输入如下路径来访问路由器的/tmp目录(可读写):

\\192.168.1.1\openwrt

对g500目录也做类似设置,以方便访问。

为samba共享设置密码

1. 终端下执行:touch /etc/samba/smbpasswd; smbpasswd -a root,然后输入密码,该密码可以和root账号的登陆密码不同。

2. 在luci管理平台中:服务->网络共享,“共享主目录”设置为0,以防止root的主目录被共享出来;"共享目录"中,"允许用户"填写root,"允许匿名用户"取消勾选;"编辑模板"中改为:#invalid users = root

3. 重启路由器

 

六、安装迅雷离线下载和监视外接硬盘状态

1)安装迅雷离线下载

参考帖子:http://luyou.xunlei.com/thread-1058-1-1.html 

1. 首先下载应用:http://pan.baidu.com/s/1o6juTIy

2. 上传到路由器的/tmp目录

3. 在路由器执行以下命令来强制安装:

 

/bin/opkg -d root --force-depends  --force-overwrite install /tmp/luci-app-xunlei_0.11-14_all.ipk #注意:luci的程序必须安装到以/为根目录


安装后重启路由器,可以在“服务”菜单下看到“迅雷远程下载”的菜单,

 

第一次运行,需要在该菜单:

在 启用 和 更新 那打勾,

挂载点:填入移动硬盘的挂载目录:/mnt/g500

迅雷程序安装路径:写入:/local,使用拓展的空间(安装的程序大约5M多)

点击应用后会联网自动更新迅雷程序,等几分钟启动好后显示激活码出来,打开 迅雷远程下载页面 登录后添加激活码绑定路由器

 

如果没有自动显示激活码出来,参见以下步骤:

等待更新迅雷程序完毕后,可以在local目录下看到一个xunlei目录。

执行以下命令来启动xunlei并加入开机运行:

 

/etc/init.d/xunlei enable #该句无法成功使其开机自启动,因为此时/local目录还没有加载,故实际上需要将下句加入到rc.local中
/etc/init.d/xunlei restart

 

注意:因为xunlei是安装在local目录,故启动时执行init.d/xunlei时并没有完成加载local目录,不会成功。解决办法是将启动xunlei命令加入到rc.local中


再点击“迅雷远程下载”管理界面里的“获取启动信息”,就可以看到激活码。

 

2)监视外接硬盘状态

可能由于迅雷下载或者硬盘自身原因,外接移动硬盘经常“断线”而导致迅雷离线下载功能不可用。故添加以下脚本monitor_g500.sh:

 

#! /bin/sh
mailTo="myAddr@139.com"
subject="g500 is FAILed, please fixed it manual"
mailContent="g500 is FAILed:\n"

flagFile="/root/flag.monitor_g500"
g500="INFO: "

df | grep -q 'g500'
if [[ $? -eq 0 ]];then
    echo "df is ok"
else
    echo "df is MISSing g500"
    g500=${g500}"df is MISSing g500; "
fi

lsusb | grep -q 'SATA'
if [[ $? -eq 0 ]];then
    echo "lsusb is ok"
else
    echo "lsusb is MISSing SATA"
    g500=${g500}"lsusb is MISSing SATA; "
fi

ls /mnt/g500 | grep -q 'TDDOWNLOAD'
if [[ $? -eq 0 ]];then
    echo "mnt Dir is ok"
else
    echo "mnt Dir is MISSing TDDOWNLOAD"
    g500=${g500}"mnt Dir is MISSing TDDOWNLOAD; "
fi

ls /dev | grep -q 'sda'
if [[ $? -eq 0 ]];then
    echo "dev Dir is ok"
else
    echo "dev Dir is MISSing sda"
    g500=${g500}"dev Dir is MISSing sda; "
fi

if [[ "$g500" == "INFO: " ]];then
    echo "check g500 is OK. clean flag file"
    if [[ -e "${flagFile}" ]];then
        rm -f "${flagFile}"
    fi
else
    touch "${flagFile}"

    #try remount
    grep -q 'remount' "${flagFile}"
    if [[ $? -eq 1 ]];then
        echo "start try remount"
        echo "remount" >> "${flagFile}"
        umount -f /mnt/g500
        umount -l /mnt/g500
        /usr/bin/ntfs-3g /dev/sda1 /mnt/g500 -o noatime,big_writes,async
        exit 0
    fi

    #try reboot
    grep -q 'reboot' "${flagFile}"
    if [[ $? -eq 1 ]];then
        echo "start try reboot"
        echo "reboot" >> "${flagFile}"
        reboot
        exit 0
    fi

    #try mail
    grep -q 'mail' "${flagFile}"
    if [[ $? -eq 1 ]];then
        echo "start try mail"
        echo "mail" >> "${flagFile}"
        mailContent=${mailContent}${g500}"\n"
        mailContent=${mailContent}`df -h`"\n"
        mailContent=${mailContent}`lsusb`"\n"
        mailContent=${mailContent}`ls -l /mnt/g500`"\n"
        mailContent=${mailContent}`ls /dev`"\n"
        echo -e "To: ${mailTo}\nSubject: ${subject}\n\n${mailContent}\n" | msmtp -t
        exit 0
    fi

    echo "g500 is FAILed, NOW waiting be fixed by manual."
fi

 

添加定时任务如下:

 

*/10 * * * * source /etc/profile;/root/monitor_g500.sh #> /tmp/log.monitor_g500
#0 6 * * * rm -f /root/flag.monitor_g500

 

3)安装aira2

迅雷于2017年7月17日起陆续停止提供第三方远程下载服务。以上方案不再可用,可以安装aira2替代离线下载,但不支持远程管理界面(安装花生壳远程域名后可以支持)。

参考:http://blog.csdn.net/zhangbangqian/article/details/43121785 

1. 安装aira2

 

opkg update
opkg install aria2
mkdir /etc/aria2
touch /etc/aria2/aria2.session

 

 

配置aria2.conf文件,‘vi /etc/aria2/aria2.conf’,输入内容如下:

 

dir=/mnt/g500/TDDOWNLOAD

disable-ipv6=true

enable-rpc=true

rpc-allow-origin-all=true

rpc-listen-all=true

#rpc-listen-port=6800

continue=true

input-file=/etc/aria2/aria2.session

save-session=/etc/aria2/aria2.session

max-concurrent-downloads=3


测试配置文件:运行以下命令,若没有报错即配置成功,可以按ctrl+c退出。

 

 

aria2c --conf-path=/etc/aria2/aria2.conf

 

 

2. 设置aria2开机启动

运行命令:'vi /etc/rc.local',添加以下内容:

 

/usr/bin/aria2c --conf-path=/etc/aria2/aria2.conf -D


3. 安装web界面

 

首先下载zip包:https://github.com/binux/yaaw 

将zip包上传到路由器的/tmp目录,

然后,执行以下命令:

 

cd /tmp
unzip yaaw-master.zip
cd /www
cp -rf /tmp/yaaw-master download


访问如下地址来访问aira2的管理界面:

 

http://192.168.1.1/download 
 

七、安装广告屏蔽程序adbyby

adbyby首页:http://www.adbyby.com/ 

依次执行以下命令:

 

cd /tmp
wget http://info.adbyby.com/download/openwrt.tar.gz
tar -zvxf openwrt.tar.gz
mkdir /local/adbyby
mv ./bin /local/adbyby/
cd /local/adbyby/bin
chmod 777 adbyby
#重要,不改正这个有可能会导致adbyby无法正确监听,从而任何http的请求全部不可访问
sed -i -e 's/listen-address=127.0.0.1:8118/listen-address=0.0.0.0:8118/' adhook.ini


把adbyby加入到开机启动中,在/etc/rc.local中添加以下命令:

 

 

/local/adbyby/bin/adbyby &  #需要在比较靠前的位置,因为它启动才能访问到互联网


为路由设置透明代理,在/etc/firewall.user中添加以下配置:

 

 

iptables -t nat -A PREROUTING -s 192.168.1.128/26 -p tcp --dport 80 -j REDIRECT --to-ports 8118
iptables -t nat -A PREROUTING -s 192.168.1.128/26 -p tcp --dport 8080 -j REDIRECT --to-ports 8118
iptables -t nat -A PREROUTING -s 192.168.1.128/26 -p tcp --dport 8090 -j REDIRECT --to-ports 8118

其中, -s 192.168.1.128/26 的意思是对指定的ip段才生效,配合修改路由器的DHCP分配的服务器地址为“开始:130,客户数:60”,修改地址为:路由器管理后台->网络->接口->LAN->修改->DHCP服务器。

这样通过路由器自动化分配的地址可以使用广告过滤,也可以自己设置为192.168.1.[10-50]等地址来不使用广告过滤。

重启路由器,使以上设置生效。

 

adbyby在监听的流量大时容易挂掉,一旦adbyby挂掉,就不能再访问网页,故需要自己写个脚本监视,如果adbyby挂掉,则重新启动它。crontab -e 后添加以下内容:

 

 

*/1 * * * * source /etc/profile;/root/monitor_adbyby.sh #> /tmp/log.monitor_adbyby


而~/monitor_adbyby.sh的内容如下:

 

 

#! /bin/sh

time="04:59:"

# restart adbyby everyday
date | grep "$time"
if [[ $? -eq 0 ]];then
    echo "now is the time, need restart adbyby."
    killall adbyby
    sleep 1
fi

ps | grep -v grep | grep -v monitor | grep -q adbyby

if [[ $? -eq 1 ]]; then
    echo "no adbyby, need restart"
    killall adbyby
    /local/adbyby/bin/adbyby &
else
    echo "adbyby is ok"
fi

 

八、goagent -- 已过时

 

1,需要安装python等基础环境:

 

opkg install python
#如果运行python出错,则安装以下版本 
#opkg install python-mini
opkg install pyopenssl python-openssl
#如果启动goagent时提示please install python-gevent,则需要安装:opkg install python-greenlet_0.4.2-1_ar71xx.ipk 和 gevent_1.0-1_ar71xx.ipk(后者依赖前者,注意版本号,如果运行出现错误请下载准确的该版本)
#如果报Bus error,需要:opkg install --force-reinstall python-base
# sed -i 's/PROTOCOL_SSLv3/PROTOCOL_SSLv23/' /local/usr/lib/python2.7/site-packages/gevent/ssl.py
#自行百度或该处下载:http://www.right.com.cn/forum/thread-135868-1-1.html


2,需要有google Appengine的appId,自行百度“goagent 注册”,需要自己网上找个美国的代理服务器,按照百度到的教程,访问谷歌的网站去注册google Appengine来完成goagent服务器端的安装。

 

3,下载goagent代码,最新的代码在:

https://github.com/goagent/goagent (注:已经成为历史,作者转移重心到goproxy上了,原goagent代码全部删除)

最新的代码不知道兼容性如何,可以下载这版代码:

https://nodeload.github.com/goagent/goagent/legacy.zip/3.0(同上,整个工程被删除了,需要自行寻找可用版本的备份)

4,将goagent代码上传到路由器的/tmp目录并解压

 

opkg install unzip
cd /tmp
unzip goagent-goagent-v3.2.3-14-gf635c39.zip 
cd /local
mv /tmp/goagent-goagent-f635c39 ./goagent
cd /local/goagent/local
rm ./*.dll
rm ./*.exe
# rm ./packages.egg
# rm ./python27.zip
rm -rf ../server
sed -i -e "s@var autoproxy = 'PROXY 127.0.0.1:8087';@var autoproxy = 'PROXY 192.168.1.1:8087';@" ./proxy.pac
cp ./proxy.pac /www/
cp ./CA.crt /www/ca.crt

 

5,修改/local/goagent/local/proxy.ini文件

将ip改成0.0.0.0
将appid改成你的appid,多个appid用“|”分隔

6,将以下命令加入到rc.local以开机启动goagent:

 

# need PATH etc.
source /etc/profile
/local/usr/bin/python /local/goagent/local/proxy.py > /dev/null 2>&1 &


7,在浏览器配置代理如下:

 

使用自动配置脚本:地址:192.168.1.1/proxy.pac

下载http://192.168.1.1/ca.crt并导入证书到受信任的根证书。

以后访问google等网站时,会自动化使用代理;而访问国内网站时,则不会使用代理。

 

说明:goagent启动时会报如下的warning:

 

WARNING - [Dec  7 04:09:16] please install *libnss3-tools* package to import GoAgent root ca

该warning并不影响使用或者影响证书,原因是openwrt并不使用系统证书,而该组件是用于在linux下向系统导入证书。

 

 

goagent也不稳定,需要添加监控脚本:

crontab -e 后添加以下内容:

 

 

*/5 * * * * source /etc/profile;/root/monitor_goagent.sh #> /tmp/log.monitor_goagent

 

而~/monitor_goagent.sh的内容如下:

 

(需要先将4个安装包放到/local/setup目录下)

#! /bin/sh
mailTo="myAddr@139.com"
subject="goagent fix failed"
mailContent="goagent is FAILed, and fix failed.\n"

flagFile="/root/flag.monitor_goagent"

ps | grep -v grep | grep -v monitor | grep -q goagent

if [[ $? -ne 0 ]]; then
    # if fix failed, then give up
    if [[ -e "${flagFile}" ]];then
        echo "fix failed once, so quit"
        exit 0
    fi

    echo "no goagent, need restart"
    killall python
    python /local/goagent/local/proxy.py > /dev/null 2>&1 &

    #check if ok
    sleep 5
    ps | grep -v grep | grep -v monitor | grep -q goagent

    if [[ $? -ne 0 ]];then
        echo "restart failed, try reinstall ipks."
        opkg install /local/setup/python-base_2.7.9-5_ar71xx.ipk
        opkg install /local/setup/python-light_2.7.9-5_ar71xx.ipk
        opkg install /local/setup/python-greenlet_0.4.2-1_ar71xx.ipk
        opkg install /local/setup/gevent_1.0-1_ar71xx.ipk
        sed -i 's/PROTOCOL_SSLv3/PROTOCOL_SSLv23/' /local/usr/lib/python2.7/site-packages/gevent/ssl.py

        echo "after reinstall, restart again"
        python /local/goagent/local/proxy.py > /dev/null 2>&1 &

        #check fix if ok again
        sleep 5
        ps | grep -v grep | grep -v monitor | grep -q goagent

        if [[ $? -ne 0 ]];then
            echo "fix failed, report via mail and touch the flag"
            echo -e "To: ${mailTo}\nSubject: ${subject}\n\n${mailContent}\n" | msmtp -t
            touch "${flagFile}"
        fi
    fi

else
    echo "goagent is ok, clean the flag"
    if [[ -e "${flagFile}" ]];then
        rm -f "${flagFile}"
    fi
fi

 

 

九、安装邮件程序并监视路由器信息

1)安装邮件程序

1. 安装msmtp

 

opkg update
opkg install msmtp


2. 配置msmtp

 

修改配置文件:/etc/msmtprc,以下为163邮箱为例,其他邮箱请自行查找SMTP设置并替换即可

 

account default

# The SMTP smarthost.
host smtp.163.com
port 994
auth login
user yourUserName@163.com
password yourPassword

# Construct envelope-from addresses of the form "user@oursite.example".
auto_from off
from yourUserName@163.com
#maildomain oursite.example

# Use TLS.
tls on
tls_starttls off
tls_certcheck off
#tls_trust_file /etc/ssl/certs/ca-certificates.crt

# Syslog logging with facility LOG_MAIL instead of the default LOG_USER.
syslog LOG_MAIL


3. 发送邮件

 

使用以下语句发送:

 

#echo -e "To: myAddr@139.com\nSubject: Openwrt Report\n\nThe Router is still running." | msmtp -t
mailTo="myAddr@139.com"
subject="Openwrt Report"
mailContent="The Router is still running."
echo -e "To: ${mailTo}\nSubject: ${subject}\n\n${mailContent}\n" | msmtp -t

 

2)监视路由器信息

通过以下脚本:reportInfo.sh,每天汇报路由器的IP信息:

 

#! /bin/sh
mailTo="myAddr@163.com"
subject="Openwrt Report"
mailContent="The Router is still running."

mailContent=${mailContent}`ifconfig -a`"\n"

echo -e "To: ${mailTo}\nSubject: ${subject}\n\n${mailContent}\n" | msmtp -t

添加定时任务如下:

 

 

0 7 * * * source /etc/profile;/root/reportInfo.sh #> /tmp/log.reportInfo

 

 

十、修改host和自动更换google-hosts

 

1)修改hosts的方法

1. 修改/etc/hosts文件

2. 修改/etc/dnsmasq.conf文件,支持通配符进行匹配设置,格式类似如下:

address=/www.jd.com/127.0.0.1

3. 在/tmp/hosts下添加hosts文件,文件名称随意命名均可,内容格式和hosts文件一致。

但注意:1.该方式可以生效的原因是在/tmp/etc/dnsmasq.conf配置文件中指定了:addn-hosts=/tmp/hosts;2.每次路由器重启,/tmp目录下的内容都会被清空

 

以上三种方式修改后,都需要重启dnsmasq才能生效,重启的命令如下:

/etc/init.d/dnsmasq restart

 

做如上修改后,在局域网内访问www.jd.com时就会首先使用路由器配置的本地地址进行访问。但有时候,在电脑上生效的时间会滞后,可能有什么缓存因素等。

 

2)通过脚本自动拉取最新的google-hosts

新建updateGoogleHosts.sh文件,如下内容:

 

#! /bin/sh

mailTo="myAddr@139.com"
subject="Google Hosts is Replaced"
mailContent="#Google Hosts is Replaced: \n"

cd /tmp
rm -f 2015-google-hosts.html;
wget -U 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36' --header 'Referer: http://igge.gq/' 'http://igge.gq/2015/07/16/11/' -O '2015-google-hosts.html'
if [[ -e 2015-google-hosts.html ]];then
    echo "wget 2015-google-hosts.html succeed"
else
    echo "wget 2015-google-hosts.html failed, exit"
    exit 99
fi
hostsUrl=`sed -e 's/<a /\n/g' -e 's/<\/a>/\n/g' ./2015-google-hosts.html | grep -E 'http://gcdn.gq/wp-content/uploads/2015[^"=>]*txt' | sed -e 's@^.*\(http://gcdn.gq/wp-content/uploads/2015[^"=>]*txt\).*$@\1@' | sort | tail -1`
echo $hostsUrl
if [[ -n "$hostsUrl" ]];then
    rm -f tmp4hosts.txt
    wget -U 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36' --header 'Referer: http://igge.gq/2015/07/16/11/' "$hostsUrl" -O 'tmp4hosts.txt';
    if [[ -e tmp4hosts.txt ]];then
        echo "wget tmp4hosts.txt succeed"
    else
        echo "wget tmp4hosts.txt failed, exit"
        exit 99
    fi
    if [[ -e tmp4hosts.txt.md5 ]];then
        md5sum -c -s tmp4hosts.txt.md5
        if [[ $? -eq 0 ]];then
            echo "Hosts file not changed, exit"
            exit 0;
        fi
    fi
    hostsNum=`wc -l tmp4hosts.txt | cut -d ' ' -f 1`
    echo $hostsNum
    if [[ "$hostsNum" -gt 1000 ]];then
        echo "check OK, start replace the hosts"
        echo '127.0.0.1 localhost' > /etc/hosts;
        sed -e '1d' tmp4hosts.txt | tr -d '\r' >> /etc/hosts;
        md5sum tmp4hosts.txt > tmp4hosts.txt.md5
        /etc/init.d/dnsmasq restart
        echo "replace the hosts finished. Send mail."
        mailContent=${mailContent}"#"${hostsUrl}"\n"`cat tmp4hosts.txt`
        echo -e "To: ${mailTo}\nSubject: ${subject}\n\n${mailContent}\n" | msmtp -t
    else
        echo "its lines is too little, abort replace and exit"
    fi
fi
cd -

 

 

 

#####【已废弃】仅备份待查之用
#####因为laod.cn已经不再提供本地下载,故该文件已经过时无法实现其原有功能
#! /bin/sh 

cd /tmp
rm -f 2015-google-hosts.html;
wget 'http://laod.cn/hosts/2015-google-hosts.html'
hostsUrl=`sed -e 's/<a /\n/g' -e 's/<\/a>/\n/g' ./2015-google-hosts.html |grep -E 'http://laod.cn/wp-content/uploads/2015/[^"=]*txt' | sed -e 's@^.*\(http://laod.cn/wp-content/uploads/2015/[^"=]*txt\).*$@\1@' | sort | tail -1`
if [[ -n "$hostsUrl" ]];then
    rm -f tmp4hosts.txt
    wget "$hostsUrl" -O 'tmp4hosts.txt';
    if [[ -e tmp4hosts.txt.md5 ]];then
        md5sum -c -s tmp4hosts.txt.md5
        if [[ $? -eq 0 ]];then
            echo "Hosts file not changed, exit"
            exit 0;
        fi
    fi
    hostsNum=`wc -l tmp4hosts.txt | cut -d ' ' -f 1`
    if [[ "$hostsNum" -gt 100 ]];then
        echo '127.0.0.1 localhost' > /etc/hosts;
        sed -e '1d' tmp4hosts.txt >> /etc/hosts;
        /etc/init.d/dnsmasq restart
    fi
fi
cd -

 

设立定时任务,每晚自动执行:

 

0 5 * * * source /etc/profile;/root/updateGoogleHosts.sh #> /tmp/log.updateGoogleHosts

 

 

 

 

十一、查看各个ip的下载速率

新建shell脚本,内容如下:

 

#!/bin/sh
echo "Collecting data..."
echo ""
cat /proc/net/arp | grep : | grep ^192 | grep -v 00:00:00:00:00:00| awk '{print $1}'> /tmp/mac-arp
iptables -N UPLOAD
iptables -N DOWNLOAD
while read line;do iptables -I FORWARD 1 -s $line -j UPLOAD;done < /tmp/mac-arp
while read line;do iptables -I FORWARD 1 -d $line -j DOWNLOAD;done < /tmp/mac-arp

sleep 1

echo "Download speed:"
echo ""
iptables -nvx -L FORWARD | grep DOWNLOAD | awk '{print $2/1024/1" KB/s ",$1/10" packets/s", $9}' | sort -n -r
echo ""
echo "Upload speed:"
echo ""
iptables -nvx -L FORWARD | grep UPLOAD | awk '{print $2/1024/1" KB/s ",$1/10" packets/s", $8}' | sort -n -r

while read line;do iptables -D FORWARD -s $line -j UPLOAD;done < /tmp/mac-arp
while read line;do iptables -D FORWARD -d $line -j DOWNLOAD;done < /tmp/mac-arp
iptables -X UPLOAD
iptables -X DOWNLOAD 


运行即可

 

十二、设置多个路由器无线桥接并定时重启下游路由器

1. 多个路由器无线桥接

现在有3个路由器,A,B,C,意图将他们进行无线桥接,以覆盖尽可能大的范围。

3个路由器的连接方式为:A连接外网,B无线桥接到A的无线网络上,C无线桥接到B的无线网络上。

为了保证网速,B和A之间最好可以直接看见彼此,中间没有任何遮挡物。同理,B和C之间也不应该有任何遮挡物。

 

步骤和要点:

1. 将路由器A的wan口连接入户网线,并在管理后台设置可以连接外网

2. 路由器A的管理后台将lan口设置为192.168.1.1,掩码255.255.255.0;无线设置SSID号为CMCC-2.4G,信道:11(不要选择“自动”),密码:123456;打开DHCP,自动分配地址为192.168.1.100-192.168.1.199

3. 路由器B的管理后台将lan口设置为192.168.1.2,掩码255.255.255.0;无线设置SSID号为CMCC-2.4G-B,信道:11,密码:123456,开启WDS并“扫描”,然后选中CMCC-2.4G,填入密码123456;关闭DHCP;重启路由器生效。

4. 路由器C的管理后台将lan口设置为192.168.1.3,掩码255.255.255.0;无线设置SSID号为CMCC-2.4G-C,信道:11,密码:123456,开启WDS并“扫描”,然后选中CMCC-2.4G-B,填入密码123456;关闭DHCP;重启路由器生效。

 

这个时候就可以使用CMCC-2.4G,CMCC-2.4G-B,CMCC-2.4G-C网络上网,连接到这些网络时会自动分配IP(其实都是由路由器A分配的)。

注:3个路由器可以使用相同的SSID号,但是不是所有路由器都可以很好支持相同SSID,并且切换仍然不太稳定。

 

2. 定时重启下游路由器

考虑到无线桥接方式下,种种原因可能造成下游路由器不太稳定,故在主路由器上运行重启路由器的脚本restartRouter.sh:

 

#! /bin/sh

# restart router_B
curl -H "Host:192.168.1.2" -H "Authorization:Basic YWRtaW46MTIzNDU2" -e "http://192.168.1.2/userRpm/SysRebootRpm.htm" "http://192.168.1.2/userRpm/SysRebootRpm.htm?Reboot=%D6%D8%C6%F4%C2%B7%D3%C9%C6%F7"

# wait 10 min for router's restart
sleep 600

# restart router_C
curl -H "Host:192.168.1.3" -H "Authorization:Basic YWRtaW46MTIzNDU2" -e "http://192.168.1.3/userRpm/SysRebootRpm.htm" "http://192.168.1.3/userRpm/SysRebootRpm.htm?Reboot=%D6%D8%C6%F4%C2%B7%D3%C9%C6%F7"

 

 

其中YWRtaW46MTIzNDU2为字符串“admin:123456”的BASE64编码结果,为路由器的用户名和密码。


并设置crontab -e让其每天定时重启路由器:

 

0 4 * * * source /etc/profile;/root/restartRouter.sh #> /tmp/log.restartRouter

 

十三、使用花生壳实现动态域名

首先,设置外网可以访问:

1. 修改转发规则,将外网8080的请求转发到内网(因为外网80端口一般被运营商屏蔽不可访问),从而从远程登录路由器管理后台等,修改/etc/config/firewall的设置,增添如下配置:

 

config redirect
	option target 'DNAT'
	option src 'wan'
	option dest 'lan'
	option proto 'tcp'
	option dest_ip '192.168.1.1'
	option dest_port '80'
	option name 'wan-web-access'
	option src_dport '8080'

 

2. 修改uhttpd设置,取消rfc1918过滤,即修改/etc/config/uhttpd设置如下:

 

option rfc1918_filter '0'

 

3. 设置samba相关端口的转发,但限于运营商的端口屏蔽,不一定能有效;也是在/etc/config/firewall增加如下设置:

 

config redirect
	option target 'DNAT'
	option src 'wan'
	option dest 'lan'
	option proto 'udp'
	option src_dport '137'
	option dest_ip '192.168.1.1'
	option dest_port '137'
	option name 'wan-samba-access137'
#	option enabled '0'

config redirect
	option target 'DNAT'
	option src 'wan'
	option dest 'lan'
	option proto 'udp'
	option src_dport '138'
	option dest_ip '192.168.1.1'
	option dest_port '138'
	option name 'wan-samba-access138'
#	option enabled '0'

config redirect
	option target 'DNAT'
	option src 'wan'
	option dest 'lan'
	option proto 'tcp'
	option src_dport '139'
	option dest_ip '192.168.1.1'
	option dest_port '139'
	option name 'wan-samba-access139'
#	option enabled '0'

config redirect
	option target 'DNAT'
	option src 'wan'
	option dest 'lan'
	option proto 'tcp'
	option src_dport '445'
	option dest_ip '192.168.1.1'
	option dest_port '445'
	option name 'wan-samba-access445'
#	option enabled '0'

config redirect
	option target 'DNAT'
	option src 'wan'
	option dest 'lan'
	option proto 'tcp'
	option src_dport '21'
	option dest_ip '192.168.1.1'
	option dest_port '21'
	option name 'wan-samba-access21'
	option enabled '0'

 

 

然后,设置动态域名

1. 登陆花生壳注册后可以免费申请一个动态域名

2. 添加以下脚本来实现自动注册路由器的IP到花生壳的动态域名,脚本名称updateOrayDDNS.sh:

 

#! /bin/sh
mailTo="myAdrr@139.com"
subject="Openwrt IP Report"
mailContent="The Router's IP changed.\n"

USER="花生壳用户名"
PASS="花生壳密码"
DOMAIN="花生壳域名"
IP=`ifconfig eth0.2|awk -F "[: ]+" '/inet addr/{print $4}'`
ORAYFILE="/tmp/orayResponse.txt"
URL="http://${USER}:${PASS}@ddns.oray.com/ph/update?hostname=${DOMAIN}&myip=${IP}"

if [ -f "$ORAYFILE" ]; then
    old_ip=`cat "$ORAYFILE" | awk '{ print $2}'`
    if [ "${old_ip}" = "${IP}" ]; then
       exit
    fi
fi

wget -q -O "$ORAYFILE"  ${URL}

#mail
mailContent=${mailContent}"Now is: "`cat "$ORAYFILE"`
echo -e "To: ${mailTo}\nSubject: ${subject}\n\n${mailContent}\n" | msmtp -t

 

3. 添加定时任务

*/10 * * * * source /etc/profile;/root/updateOrayDDNS.sh #> /tmp/log.updateOrayDDNS

 

4. 安全设置

此时外网就可以通过域名访问到路由器的80端口,目前默认为路由器管理后台的登录页面。也可以通过域名来远程访问samba共享了。

1)在终端下,将/www目录的index.html改名为login.html,从而,以后使用http://192.168.1.1/login.html来登录管理后台。也可以远程使用域名来访问管理后台。

2)在管理后台的页面:系统->管理权,重新设置复杂的管理员密码,以后终端登录时也要使用该密码才能登录成功;设置ssh访问中的接口选择“lan”,即只能本地登录终端,不能远程登录。

 

5. 路由器网站的操作模式

通过动态域名,可以远程访问到路由器上搭建的web服务器。

OpenWrt默认的80端口为uhttpd服务器,它是一种适合嵌入式平台的web服务器,支持CGI,lua脚本,以及静态html文件。

由于samba共享已经可以远程访问,目前/tmp目录被samba共享,可以设置以下脚本用于将/tmp/www里的文件拷贝到/www下,该脚本可以在管理后台的"系统->自定义命令"中执行,实现远程开发。

脚本copyWWW.sh内容如下:

 

#! /bin/sh

if [[ -d /tmp/www ]];then
    cd /tmp
    tar -czvf www.`date +%Y%m%d%H%M%S`.tar.gz /www
    cp -rf ./www/* /www/
    cd -
fi

 

十四、磁盘检查和文件检查

 

磁盘检查使用如下命令:

 

#或者fsck.ext3, fsck.ext2
fsck.ext4 -p -c -f -v /dev/mtdblock11
#以上的自动检查失败时,使用下面的手动检查
#fsck.ext4 -y -c -f -v /dev/mtdblock11

 

对文件列表的内容进行检查使用如下脚本testFileCracked.sh:

 

#! /bin/sh

FILENAME=$1.list

if [ ! -e $FILENAME ];then
    echo "NO FILE!!"
    exit 99
fi

cat $FILENAME | xargs  ls -l -h
cat $FILENAME | xargs file
echo "========================="
echo "========================="

 

安装应用并进行检查的脚本installCheck.sh如下:

 

#! /bin/sh

FORCE=""

for arg in "$@"
do
    if [ $arg == "-f" ];then
        FORCE="--force-reinstall"
        continue
    fi
    # add -d local for used this script without my Env, like alias opkg='opkg -d local'.
    /bin/opkg -d local install $FORCE $arg
    /root/testFileCracked.sh $arg
done

 

将以下命令加入/etc/profile:

 

 

alias opkginstall='/root/installCheck.sh'

 

十五、安装百度盘同步工具

参见工具首页:http://www.syncy.cn/ 

1. 下载工具到本地,含:python-curl和SyncY的ipk

2. 上传这2个ipk到路由器的/tmp目录

3. 首先安装以下环境准备,主要是python(如下,只是一个命令式安装,未自己排查不用的lib库的话,需要10多M的空间):

 

opkg install libcurl
opkg install libopenssl
opkg install kmod-nls-utf8
#2.7版本的python
opkg install python

4. 然后安装以下工具:

 

 

cd /tmp
# 注意选对python-curl的版本,有些老的不兼容
opkg install python-curl_7.19.0-1_ar71xx_15.05.ipk
opkg install SyncY-Python-luci_2.5.3-1_all.ipk

5. 重启后,进入luci后台:服务->SyncY,进行后续的设置。

6. 具体设置如下,设置好后点击“保存&应用”

 

开机自动启动 勾选
同时同步的任务数 = 1
每个任务的线程数 = 1
添加“同步目录”:(1)本地目录:/mnt/g500/BaiduPanSync;云端目录:/我的应用程序/SyncY/BaiduPanSync;同步类型:4-双向同步;(2)本地目录:/mnt/g500/BaiduPanDownload;云端目录:/我的应用程序/SyncY/BaiduPanDownload;同步类型:2-单向下载;

7. 点击“绑定百度账号”,出现“已完成百度授权,继续账号绑定”的提示则为成功;如果没有成功在终端手动执行下“syncy.py”,查看并解决下出错的原因。

8. 根据“已完成百度授权,继续账号绑定”的下方的提示文字操作,完成后点击该按钮,会提示绑定成功。

9. 点击“启动”按钮。此时就可以正常启动同步任务。

10. 如果需要立即做一次数据同步或下载,只需要点击一次“停止运行”,再点击一次“启动”即可。syncy.py在启动时会立刻进行一次检查并同步。

 

十六、检测网络状态,自动重启

 

 

新建monitor_pingAlive.sh文件内容如下:

 

#! /bin/sh

flagFile="/root/flag.pingAlive"
mailTo="myAdr@139.com"  
subject="Openwrt Restart"  
mailContent="Ping Alive Failed. The Router is restarting." 

ping -q -c 1 www.baidu.com | grep -q '0% packet loss'

if [[ $? -eq 0 ]];then
    # network is alive; delete flag file
    if [[ -e "${flagFile}" ]];then
        rm -f "${flagFile}"
    fi
else
    # network is NOT alive; when first fail, mark and reboot.
    if [[ ! -e "${flagFile}" ]];then
        touch "${flagFile}"
        echo -e "To: ${mailTo}\nSubject: ${subject}\n\n${mailContent}\n" | msmtp -t
        reboot
    fi
fi


添加自动执行:

 

 

*/1 * * * * source /etc/profile;/root/monitor_pingAlive.sh

 

 

 

 

 

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页