登录后台

页面导航

本文编写于 1594 天前,最后修改于 1594 天前,其中某些信息可能已经过时。

前言

阅读本文能学到 OpenWrt 的基础管理方式,能获得自主解决 OpenWrt 相关问题的能力,下面我们就开始吧。

哦对了,你可能不知道 OpenWrt 是什么,引用项目官网的一段话:

OpenWrt项目是一个针对嵌入式设备的Linux操作系统。OpenWrt不是一个单一且不可更改的固件,而是提供了具有软件包管理功能的完全可写的文件系统。这使您可以不使用供应商提供的应用程序选择和配置,而是通过使用软件包来定制设备以适应任何应用程序。对于开发人员来说,OpenWrt是一个无需围绕它构建完整固件就能开发应用程序的框架; 对于普通用户来说,这意味着拥有了完全定制的能力,能以意想不到的方式使用该设备。

大白话就是,本来是一个封闭的路由器,刷完他之后就变成开放的了,能获取 Root 权限,能自己装软件,可玩性更高。给路由器刷 OpenWrt 类似于给手机刷第三方系统。

准备

工欲善其事,必先利其器,必须有个刷了 OpenWrt 的路由器,我的路由器是 网件 R6100,有官方 release 的 OpenWrt 固件。配置如下:

项目说明
SOCAtheros AR9344
Flash MB128
RAM MB128
WLAN HardWareAtheros AR9344, Qualcomm Atheros QCA9882-2R4E
USB1x 2.0

很自然联想到,路由器的 OpenWrt 固件也分为官方支持和民间自编译。想知道你的路由器怎么刷 OpenWrt ,建议用优秀的搜索引擎差找「品牌+型号+OpenWrt 」,如果找到了「openwrt。org」域名下的网站,比如我的是 https://openwrt.org/toh/netgear/netgear_r6100,这个就是 OpenWrt 官方支持的了。话说回来,建议买网件的路由器刷 OpenWrt,官方支持的多,硬件不缩水,配置冗余高,而且刷写简单,只需要下载固件,然后在官方 web 管理的升级处上传 OpenWrt 的固件镜像即可。

连接终端

终端的效率比较高,而且不受版本限制。

Linux 用户打开终端,Windows 10 用户 按 win + x 快捷键然后选 Windows PowerShell,Windows 8 及以下用户 按 win + R 快捷键打开「运行」输入 cmd 回车。

然后你就会得到一个黑黑的命令行窗口

cmd窗口

输入 ssh root@192.168.1.1 回车,此处 192.168.1.1 是路由器的 ip,因为是第一次连接,会让你确认指纹:

Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。

尝试新的跨平台 PowerShell https://aka.ms/pscore6

PS C:\WINDOWS\system32> ssh root@192.168.1.1
The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.
RSA key fingerprint is SHA256:xgM+5SHaV+RCUi66JbjaC/d6xpSc+3YRD/sxCUI.
Are you sure you want to continue connecting (yes/no)?

输入 yes 确认连接

然后输入密码(就是登录 web 管理界面的密码),此处输入密码的时候保护隐私不会有显示的,只管输入然后回车就行

PS C:\WINDOWS\system32> ssh root@192.168.1.1
The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.
RSA key fingerprint is SHA256:xgM+5SHPZ8gaV+RCUi66JbjaC/d6xpSc+3YRD/sxCUI.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.1' (RSA) to the list of known hosts.
root@192.168.1.1's password:

不出意外会看到欢迎语:

PS C:\WINDOWS\system32> ssh root@192.168.1.1
root@192.168.1.1's password:


BusyBox v1.30.1 () built-in shell (ash)

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 OpenWrt 19.07.3, r11063-85e04e9f46
 -----------------------------------------------------
root@gtf35-host:~#

这样我们就成功的用 root 身份登录了 OpenWrt 的终端

改源

OpenWrt 是一个 Linux 发行版,有自己的包管理软件,叫 opkg。熟悉 Linux 的小伙伴肯定都知道,第一件事就是改源。

这里插播一个 Linux 的小常识,Linux 的发行版(可以简单理解为 Ubuntu,Debian 等每一种 Linux 的分支都叫一种发行版)都有自己的包管理器,通俗理解为就是自己的官方应用商店。比如 Debian 系列的发行版使用 apt 包管理器,想安装网易云音乐只需要输入 sudo apt install netease-cloud-music 然后确认信息安装就可以了。不需要去网上搜索下载安装包,只需要一个命令就可以安装。软件叫软件包,包管理就是方便的管理(安装,卸载,升级)软件包。

描述在哪搜索和下载软件的东西叫「源」,因为在线安装软件的时候,国外的中央站点会很慢,甚至无法访问,所以要使用国内的加速镜像站点,这一操作叫做改源。OpenWrt 的高质量源并不多,我这里使用「北京外国语大学」的源,他的官网是 点击访问

如果之前没有换过源,那么恭喜你哦,输入下面的命令即可自动替换:

sed -i 's_downloads.openwrt.org_mirrors.bfsu.edu.cn/openwrt_' /etc/opkg/distfeeds.conf

手动替换可以编辑 /etc/opkg/distfeeds.conf 文件,将其中的 downloads.openwrt.org 替换为 mirrors.bfsu.edu.cn/openwrt 。至于如何手工编译见下一节。

题外话,vim 操作简易指南

因为后续的文章会在命令行下编辑文本,使用叫 vim 的文本编辑工具。我简单介绍下用法。

用上一节的例子,我们要编辑的是 /etc/opkg/distfeeds.conf 这个文件,那么就输入:

vim /etc/opkg/distfeeds.conf

就会看见里面的文本

src/gz openwrt_core http://downloads.openwrt.org/releases/19.07.3/targets/ar71xx/nand/packages
src/gz openwrt_kmods http://downloads.openwrt.org/releases/19.07.3/targets/ar71xx/nand/kmods/4.14.180-1-3487e40b92src/gz openwrt_base http://mirrors.bfsu.edu.cn/openwrt/releases/19.07.3/packages/mips_24kc/base
src/gz openwrt_luci http://downloads.openwrt.org/releases/19.07.3/packages/mips_24kc/luci
src/gz openwrt_packages http://downloads.openwrt.org/releases/19.07.3/packages/mips_24kc/packages
src/gz openwrt_routing http://downloads.openwrt.org/releases/19.07.3/packages/mips_24kc/routing
src/gz openwrt_telephony http://downloads.openwrt.org/releases/19.07.3/packages/mips_24kc/telephony
~
- /etc/opkg/distfeeds.conf 1/6 16%

最开始我先说一下如何退出,先按几次 esc 复位到初始状态,让后打 :q 回车,如果文档中的文本有修改的话使用 :q! (不保存强制退出) 和 :wq 保存并退出。第一次见这种使用方式可能会觉得很惊讶,但是用多了真的会爱上他。

刚进入的时候是浏览模式,不能编辑,如果打字的话会被识别为各种快捷键的。如果要编辑,先按几次esc 到初始模式,然后按一下键盘上的 i进入编辑模式,这时候就可以用键盘上的方向键换行,换光标,正常打字了,编辑完之后按一下 esc 退出编辑模式,然后 :wq 保存并退出

更新软件列表

输入 opkg update 回车来更新软件列表。

这个就是字面意思了,可以理解为获取下应用商店里都有什么软件,正常的输出如下:

root@gtf35-host:~# opkg update
Downloading http://mirrors.bfsu.edu.cn/openwrt/releases/19.07.3/targets/ar71xx/nand/packages/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_core
Downloading http://mirrors.bfsu.edu.cn/openwrt/releases/19.07.3/targets/ar71xx/nand/packages/Packages.sig
Signature check passed.
Downloading http://mirrors.bfsu.edu.cn/openwrt/releases/19.07.3/targets/ar71xx/nand/kmods/4.14.180-1-3487e40b92bc4840fe01ec6a7fc6943b/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_kmods
Downloading http://mirrors.bfsu.edu.cn/openwrt/releases/19.07.3/targets/ar71xx/nand/kmods/4.14.180-1-3487e40b92bc4840fe01ec6a7fc6943b/Packages.sig
Signature check passed.
Downloading http://mirrors.bfsu.edu.cn/openwrt/releases/19.07.3/packages/mips_24kc/base/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_base
Downloading http://mirrors.bfsu.edu.cn/openwrt/releases/19.07.3/packages/mips_24kc/base/Packages.sig
Signature check passed.
Downloading http://mirrors.bfsu.edu.cn/openwrt/releases/19.07.3/packages/mips_24kc/luci/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_luci
Downloading http://mirrors.bfsu.edu.cn/openwrt/releases/19.07.3/packages/mips_24kc/luci/Packages.sig
Signature check passed.
Downloading http://mirrors.bfsu.edu.cn/openwrt/releases/19.07.3/packages/mips_24kc/packages/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_packages
Downloading http://mirrors.bfsu.edu.cn/openwrt/releases/19.07.3/packages/mips_24kc/packages/Packages.sig
Signature check passed.
Downloading http://mirrors.bfsu.edu.cn/openwrt/releases/19.07.3/packages/mips_24kc/routing/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_routing
Downloading http://mirrors.bfsu.edu.cn/openwrt/releases/19.07.3/packages/mips_24kc/routing/Packages.sig
Signature check passed.
Downloading http://mirrors.bfsu.edu.cn/openwrt/releases/19.07.3/packages/mips_24kc/telephony/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_telephony
Downloading http://mirrors.bfsu.edu.cn/openwrt/releases/19.07.3/packages/mips_24kc/telephony/Packages.sig
Signature check passed.
root@gtf35-host:~#

看到最后的 Signature check passed. 才算是成功更新。如果有错误,比如 skip 跳过等字样,考虑换个源吧。

学习简单的包管理操作

最准确的教程大概就是官方文档了,我这里给出包管理的官方文档:OPKG 软件包管理

OpenWrt 使用 opkg 包管理程序,我这里列一下常用的命令:

安装软件

  • 首先执行 opkg update 更新仓库列表,这个是必须的,因为重启设备会使可用软件包列表丢失,所以在试图安装软件包之前务必更新列表。
  • 然后执行 opkg install <package> ,比如要安装中文的语言包就输入 opkg install luci-i18n-base-zh-cn

一些例子:

opkg install hiawatha
opkg install http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/hiawatha_7.7-2_ar71xx.ipk
opkg install /tmp/hiawatha_7.7-2_ar71xx.ipk

搜索软件

  • 执行 opkg list [pkg|globp] ,比如要搜索 php 开头的软件就要执行:opkg list php*`

卸载软件

  • opkg remove <pkgs|globp> ,比如要卸载 adb,就可以执行 opkg remove adb

升级软件

  • 使用 upgrade <pkgs> ,比如要更新 adb,就可以执行 opkg upgrade adb

安装 PHP

我们这里要安装软件了,我们这次要安装的是 php,我们去 OpenWrt 的官网看下文档,点击访问关于 php 的文档

这个文档没有被本地化,其实英文都很简单,不要怕,硬着头皮看看,应该都能看懂的。首先在文档的一开始的「Installation」章节就介绍了如何安装:

  • 1 :执行 opkg update 更新列表,上节有介绍,这里不再赘述
  • 2:执行 opkg list php* ,搜索下 php 开头的软件包,上节有介绍,这里不再赘述
  • 3:opkg install php7 php7-cgi 安装 php7 的本体和统一接口

并不难,很简单的,是吧,然后我们来配置,下面是我根据我的感受总结的:

1:修改网络框架,让他支持 php 的处理器, 具体操作是执行 vim /etc/config/uhttpd ,然后在文末追加,说明见注释即可

 # web 是自己的这个配置的名字,可以换成自己喜欢的
 config uhttpd web
     # 在服务器中,0.0.0.0 指的是本机上的所有 IPV4 地址,[::] 是 IPV6 的
     # 5332 是监听的端口,写 5332 的话,以后访问的网页就是类似 http://127.0.0.1:5332/hi.php
    list listen_http 0.0.0.0:5332
    list listen_http [::]:5332
    # php cgi 的位置,无需改动
    list interpreter    ".php=/usr/bin/php-cgi" 
    # 网页的 home 目录,使用这个配置需要下一节的禁用 php.ini 的 home 配置为前提
    # 路由器的 flash 空间不充足可以使用 U 盘等的挂载目录
    option home        /www/php_home
    # 默认页面
    option index_page    index.php
    # 不列出文件列表,如果不关闭的话,访问空地址会直接显示目录,会有安全风险
    option no_dirlists    yes

2:关闭 php.ini 让上文的 home 设置生效,否则会报错。

具体操作是执行 vim /etc/php.ini,然后找到一行 doc_root = "/www",在前面加上个 ; 注释掉这行,让他不生效。示意如下:

; UNIX: "/path1:/path2"
;include_path = ".:/php/includes"
;doc_root = "/www"
user_dir =
extension_dir = "/usr/lib/php"
enable_dl = On

3:重启网络框架让配置生效,具体操作是执行命令:/etc/init.d/uhttpd restart

4:上传 php 文件

  • 1 先创建存放 php 的目录,按照上文写的目录是 /www/php_home ,其中 www 已经有了,php_home 是我们自己建立的。至于单独建一个文件夹的原因是不和原有的 luci 的目录混淆,方便管理。先执行 cd /www/ 进入到 www 目录下,然后执行 mkdir php_home 来创建文件夹。
  • 2 准备 php 文件,新建一个文本文件,名为 hi.php 来承载测试代码,编辑内容:

    <?php
        echo phpinfo();
    ?>
  • 3 开始正式上传 php 文件,在放 php 的文件夹上按住 shift 右键,选择在「在此处打开 PowerShell 窗口」,然后输入命令scp .\hi.php root@192.168.1.1:/www/php_home/ 然后输入密码上传文件。
  • 4 测试,也就是最激动人心的环节了,打开浏览器访问:http://192.168.1.1:5332/hi.php(其中192.168.1.1为路由器的 IP,5332 为配置文件中的监听端口号),看到下图即为成功:

    php测试页面
  • (可选)配置外网访问端口转发,依次执行下面的命令:

    # 添加防火墙端口转发
    uci add firewall redirect
    # 设置内部端口
    uci set firewall.@redirect[-1].dest_port='5332'
    # 指定流量来源区域
    # 必须引用定义的区域名称之一
    uci set firewall.@redirect[-1].src='wan'
    # 设置策略的名字
    uci set firewall.@redirect[-1].name='web'
    # 设置外部端口
    uci set firewall.@redirect[-1].src_dport='5332'
    # 生成规则时要使用的NAT目标(DNAT或SNAT)
    uci set firewall.@redirect[-1].target='DNAT'
    # 指定流量目标区域
    # 必须引用定义的区域名称之一
    uci set firewall.@redirect[-1].dest='lan'
    # 提交防火墙修改
    uci commit firewall
    # 重启防火墙
    service firewall restart

    以上命令更详细的信息请查阅官方文档:点击访问