使用Image Builder编译自动翻墙OpenWrt固件

Image Builder又叫Image Generator,利用它我们可以方便地定制适合自己无线路由器的固件

编译OpenWrt自定义翻墙固件的注意事项

  • 不要用“root”用户编译
  • 进入到编译系统目录中执行编译相关命令,如:~/Downloads/openwrt
  • 在编译版的路径中不能够出现空格
  • 如果已经用root用户下载并解压了源码,可用命令改属主成普通用户:sudo chown -R user:user ~/Downloads/openwrt

下载适合自己无线路由器的Image Builder, NetGear WNDR4300 为例

  • 进入 http://downloads.openwrt.org/

  • 选择 Stable Releases或 Development Snapshots

    • 目前的 Stable Releases: http://downloads.openwrt.org/releases/18.06.1/targets/
    • Development Snapshots: http://downloads.openwrt.org/snapshots/targets/
  • 选择 CPU类型,如 ar71xx: http://downloads.openwrt.org/releases/18.06.1/targets/ar71xx/

  • 选择 Flash 类型, 如nand或generic,如果是 WNDR4300 路由器,则选 nand: http://downloads.openwrt.org/releases/18.06.1/targets/ar71xx/nand/

下载命令举例:

cd ~/Downloads
wget http://downloads.openwrt.org/releases/18.06.1/targets/ar71xx/nand/openwrt-imagebuilder-18.06.1-ar71xx-nand.Linux-x86_64.tar.xz
tar -xf openwrt-imagebuilder-18.06.1-ar71xx-nand.Linux-x86_64.tar.xz
# 为操作方便,重命名为短目录
mv openwrt-imagebuilder-18.06.1-ar71xx-nand.Linux-x86_64 openwrt-imagebuilder-nand

下载包含默认翻墙配置文件的openwrt-fanqiang项目

  • git下载openwrt-fanqiang项目

      cd ~/Downloads
      git clone https://github.com/softwaredownload/openwrt-fanqiang
    
  • 或者下载zip文件

    https://github.com/softwaredownload/openwrt-fanqiang/archive/master.zip

本地项目文件夹是: ~/Downloads/openwrt-fanqiang

复制openwrt-fanqiang里面的翻墙配置文件到config-wndr4300目录下

建立一个配置文件夹,以路由器型号结束,如 ~/Downloads/config-wndr4300

cd ~/Downloads
mkdir config-wndr4300

cd openwrt-fanqiang
cp -R openwrt/default/* ~/Downloads/config-wndr4300/
cp -R openwrt/wndr4300/* ~/Downloads/config-wndr4300/

上面的操作,先复制共用的配置文件 openwrt/default/* 到 config-wndr4300目录下

然后复制WNDR4300专用的配置文件(如果存在)到 openwrt/WNDR4300/* 到 config-wndr4300目录下,如果有同名文件就覆盖

如果你要贡献本项目,也是先在openwrt-fanqiang/openwrt目录下先建立路由器型号为名称的文件夹,再把专用的配置文件放到此文夹下。注意文件夹和文件名都是小写的

修改TL-WNDR4300路由器翻墙配置文件

主要修改以下文件

config-wndr4300/etc/shadowsocks-libev/config.json
config-wndr4300/usr/bin/ss-firewall-asia
config-wndr4300/etc/uci-defaults/defaults

为了方便以后升级,可以写个bash文件自动修改配置文件

一切操作尽量自动化,你甚至可以自动化一切操作:下载ImageBuilder,下载OpenWrt源码,下载shadowsocks-libev源码,同步openwrt-fanqiang源码,编译ipk,修改翻墙设置,编译翻墙固件,早上一觉醒来,新鲜出炉、美味可口的翻墙固件就已经摆放在桌上了

下面是一个自动修改配置文件的例子,从中可以知道需要修改哪些地方。从2015年12月起,可能用于自动化修改的默认值都应该标准化,方便自动化操作

#!/bin/bash

# Author: https://github.com/softwaredownload/openwrt-fanqiang
# Date:   2015-12-24

REPOSITORY=~/Downloads/openwrt-fanqiang
CONFIG=~/Downloads/config-wndr4300

createdir() {
    rm -rf $CONFIG
    mkdir $CONFIG
}

copy() {
    cp -R $REPOSITORY/openwrt/default/* $CONFIG/
    cp -R $REPOSITORY/openwrt/wndr4300/* $CONFIG/
}

setmod() {
    chmod +x $CONFIG/usr/bin/*
    chmod +x $CONFIG/etc/uci-defaults
    chmod +x $CONFIG/etc/uci-defaults/*
}

modify() {
    # server ip address
    sed -i 's/1.0.9.8/server_ip/' $CONFIG/etc/shadowsocks-libev/config.json

    # server_port
    sed -i 's/1098/server_port/' $CONFIG/etc/shadowsocks-libev/config.json

    # local_port
    sed -i 's/7654/7654/' $CONFIG/etc/shadowsocks-libev/config.json

    # password
    sed -i 's/killgfw/killgfw/' $CONFIG/etc/shadowsocks-libev/config.json

    # method
    sed -i 's/chacha20-ietf-poly1305/chacha20-ietf-poly1305/' $CONFIG/etc/shadowsocks-libev/config.json

    # local_port
    sed -i 's/7654/7654/' $CONFIG/usr/bin/ss-firewall-asia

    # ppoe username
    sed -i 's/wan-username/wan-username/' $CONFIG/etc/uci-defaults/defaults

    # ppoe password
    sed -i 's/wan-password/wan-password/' $CONFIG/etc/uci-defaults/defaults

    # wifi password
    sed -i 's/icanfly9876/icanfly9876/g' $CONFIG/etc/uci-defaults/defaults

    # root password
    sed -i 's/\\nfanqiang/\\nfanqiang/' $CONFIG/etc/uci-defaults/defaults
}

if [ "$1" = "createdir" ]; then
    createdir
elif [ "$1" = "copy" ]; then
    copy
elif [ "$1" = "setmod" ]; then
    setmod
elif [ "$1" = "modify" ]; then
    modify
else
    echo "usage: createdir copy setmod modify"
fi

自动修改翻墙配置文件用法

./config-wndr4300.sh createdir
./config-wndr4300.sh copy
./config-wndr4300.sh setmod
./config-wndr4300.sh modify

确定OpenWrt无线路由器的PROFILE值

cd openwrt-imagebuilder
make info

找到自己固件的型号,比如我的是 NETGEAR WNDR4300v1,它的PROFILE值是WNDR4300V1。如下图:

查看WNDR4300路由器 Profile

找出默认应该包含进OpenWrt固件的包

基础包

对于WNDR4300无线路由器来说,可以这样获取:

echo $(wget -qO - http://downloads.openwrt.org/releases/18.06.1/targets/ar71xx/nand/config.seed | sed -ne 's/^CONFIG_PACKAGE_\([a-z0-9-]*\)=y/\1/ip')

由于 OpenWrt开发非常活跃,不同版本的基础包可能是不同的

2018-09的基础包:

libiwinfo-lua liblua liblucihttp liblucihttp-lua libubus-lua lua luci luci-app-firewall luci-base luci-lib-ip luci-lib-jsonc luci-lib-nixio luci-mod-admin-full luci-proto-ipv6 luci-proto-ppp luci-theme-bootstrap rpcd rpcd-mod-rrdns uhttpd

默认包

运行命令:

make info

在顶部会列出:

Current Target: "ar71xx (Generic devices with NAND flash)" Default Packages:

base-files libc libgcc busybox dropbear mtd uci opkg netifd fstools uclient-fetch logd kmod-gpio-button-hotplug swconfig kmod-ath9k wpad-mini uboot-envtools dnsmasq iptables ip6tables ppp ppp-mod-pppoe firewall odhcpd-ipv6only odhcp6c

所有型号路由器共用包:

Default:
    Default Profile
    Packages:

kmod-usb-core kmod-usb-ohci kmod-usb2 kmod-usb-ledtrig-usbport

特定路由器型号专属包,列出在PROFILE的下面,对于 WNDR4300V1

kmod-usb-core kmod-usb2 kmod-usb-ledtrig-usbport

自定义包(shadowsocks-libev 后面四个包是依赖)

ipset ipset-dns wget bind-dig iptables-mod-tproxy kmod-ipt-tproxy ip-full stubby dnsmasq-full simple-obfs libmbedtls libcares libev libsodium shadowsocks-libev

  • libmbedtls libcares libev libsodium shadowsocks-libev

    shadowsocks-libev 及依赖,需要自己编译

  • simple-obfs 是 shadowsocks-libev 混淆插件,需要自己编译

  • stubby 可用于 DNS over TLS

  • iptables-mod-tproxy kmod-ipt-tproxy ip-full 用于防火墙 UDP 转发

  • dnsmasq-full 需要配合 shadowsocks 客户端 ss-tunnel 使用

    Dnsmasq 提供 DNS 缓存和 DHCP 服务功能。作为域名解析服务器(DNS),dnsmasq可以通过缓存 DNS 请求来提高对访问过的网址的连接速度。作为DHCP 服务器,dnsmasq 可以为局域网电脑提供内网ip地址和路由

    默认的dnsmasq为base版本,该版本不能对特定的域名地址进行标记操作(因为我们需要对一些特定域名如twitter等进行标记),改为更加强大的dnsmasq-full

  • bind-dig 可以调试域名解析

如果你的openWrt版本是 ATTITUDE ADJUSTMENT,可能加上iptables-mod-nat-extra包,如果没安装的话iptables的端口转发会不支持

上述包整合在一起并去重复。简单方法是复制到 Sublime Text, 以空格分隔,再用正则把空格 替换成 \n, 然后 Edit -> Permute Lines -> Unique

注意,在编译前要把自己编译的 shadowsocks-libev 及其他要用到的 .ipk 文件放到ImageBuilder的目录下packages

OpenWrt Image Builder的三个命令行参数

  • PROFILE 指定设备型号,此处是 WNDR4300V1
  • PACKAGES 指定要编译进固件的包
  • FILES 指定要编译进固件的自定义文件,如网络有关配置文件, 自定义包,我们放在 ~/Downloads/config-wndr4300 目录下了 要排除的package 写在最后面,格式是 -package

开始编译OpenWrt自动翻墙固件

cd ~/Downloads/openwrt-imagebuilder-nand
make image PROFILE=WNDR4300V1 PACKAGES="libiwinfo-lua liblua liblucihttp liblucihttp-lua libubus-lua lua luci luci-app-firewall luci-base luci-lib-ip luci-lib-jsonc luci-lib-nixio luci-mod-admin-full luci-proto-ipv6 luci-proto-ppp luci-theme-bootstrap rpcd rpcd-mod-rrdns uhttpd base-files libc libgcc busybox dropbear mtd uci opkg netifd fstools uclient-fetch logd kmod-gpio-button-hotplug swconfig kmod-ath9k wpad-mini uboot-envtools iptables ip6tables ppp ppp-mod-pppoe firewall odhcpd-ipv6only odhcp6c kmod-usb-core kmod-usb-ohci kmod-usb2 kmod-usb-ledtrig-usbport ipset ipset-dns wget bind-dig iptables-mod-tproxy kmod-ipt-tproxy ip-full stubby dnsmasq-full simple-obfs libmbedtls libcares libev libsodium shadowsocks-libev -dnsmasq" FILES=~/Downloads/openwrt-wndr4300

注意,我们已经使用了 dnsmasq-full ,就不需要用 dnsmasq, 用 -dnsmasq 排除,否则可能会有编译错误

编译好的的固件在ImageBuilder的bin/targets/ar71xx/目录下

然后把编译出的固件刷进路由器,重启路由器后后就能免设置智能翻墙

刷翻墙固件后管理员登录OpenWrt

刷好固件并重启路由器后,电脑连上无线网络, 然后就可用密码fanqiang 登录路由器

  • ssh登录openwrt管理路由器: ssh root@192.168.1.1
  • 浏览器打开192.168.1.1登录

以后玩OpenWrt出问题,可以重新刷上这个翻墙固件就又可以在网上畅行无阻了

相关资源: