<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>OpenWrt on LGiki&#39;s Blog</title>
    <link>https://lgiki.net/tags/openwrt/</link>
    <description>Recent content in OpenWrt on LGiki&#39;s Blog</description>
    <generator>Hugo -- 0.148.2</generator>
    <language>en</language>
    <lastBuildDate>Fri, 10 Mar 2023 23:13:37 +0800</lastBuildDate>
    <atom:link href="https://lgiki.net/tags/openwrt/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>自己动手编译 OpenWRT</title>
      <link>https://lgiki.net/post/compile-openwrt/</link>
      <pubDate>Fri, 10 Mar 2023 23:13:37 +0800</pubDate>
      <guid>https://lgiki.net/post/compile-openwrt/</guid>
      <description>自己动手编译 OpenWRT</description>
      <content:encoded><![CDATA[<h1 id="intro">Intro</h1>
<p>学校最近升级了校园网设备，终于从年久失修的龟速 100Mbps 升级到了 1Gbps，尽管还是使用锐捷的 ePortal 网页认证，还能通过简单的 Shell 脚本在路由器上自动认证，但新设备却限制了每个用户最多只能同时有两台设备在线，使用路由器会被检测出使用多设备，并被加入黑名单，被断网。</p>
<p>都 2023 年了，随便手机、电脑再加个平板就仨设备了，更不用说可能还有 Kindle、Switch 等其他设备，只能同时两台设备在线怎么可能满足学生正常使用校园网的需求。更何况，计算机专业的学生可能还会使用虚拟机等软件，但虚拟机类的软件也可能被检测为是多设备同时在线，所以你让计算机专业的学生拿啥学习呢，<del>内存条含嘴里脑补画面吗？</del></p>
<p>限制校园网的同时在线设备数量无非就两个出发点：（1）如果不限制，一个宿舍只需要开通一个宽带账号，所有人都可以上网了，运营商的收入就减少了；（2）如果学生出现一些非法的上网行为，可以快速准确地定位到具体学生。但我觉得这都不是学校限制学生只能使用两个设备的理由，哪怕提升到 5 个设备我觉得也合理一些。</p>
<p><strong>对于限制校园网设备数量的学校，我只能说 Shame on you！</strong></p>
<p><strong>对于限制校园网设备数量的学校，我只能说 Shame on you！</strong></p>
<p><strong>对于限制校园网设备数量的学校，我只能说 Shame on you！</strong></p>
<p>那就…只能另辟蹊径，想其他办法了。</p>
<p>还好，限制同时在线设备数量这件事早已有其他学校实施过了，也已经有人提出了一些对策。例如，在 <a href="https://blog.sunbk201.site/posts/crack-campus-network">https://blog.sunbk201.site/posts/crack-campus-network</a> 这篇博客里就详细列举了校园网检测在线设备可能采用的手段以及相应的应对措施，我们只需要照着做就行了。</p>
<p>其实主要就是为 OpenWRT 编译 <a href="https://github.com/CHN-beta/rkp-ipid">rkp-ipid</a> 和 <a href="https://github.com/Zxilly/UA2F">UA2F</a> 这两个包，而这两个包需要在编译内核的时候开启一些选项，所以需要重新编译 OpenWRT 固件，也因此写下这篇文章记录一下编译 OpenWRT 的过程。</p>
<h1 id="安装编译环境">安装编译环境</h1>
<p>要编译 Linux 当然是使用 Linux 啦！</p>
<p>如果是 Debian 系的发行版（例如 Ubuntu），可以使用以下指令来安装编译所需的依赖：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt update -y
</span></span><span class="line"><span class="cl">sudo apt full-upgrade -y
</span></span><span class="line"><span class="cl">sudo apt install -y ack antlr3 aria2 asciidoc autoconf automake autopoint binutils bison build-essential <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pip libpython3-dev qemu-utils <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev
</span></span></code></pre></div><p>对于 Arch 系的发行版，直接安装 AUR 中的 openwrt-devel 即可：<a href="https://aur.archlinux.org/packages/openwrt-devel">https://aur.archlinux.org/packages/openwrt-devel</a></p>
<h1 id="获取-openwrt-源码">获取 OpenWRT 源码</h1>
<p>如果你的设备是 OpenWRT 官方支持的设备，并且你想编译 OpenWRT 官方源码，则直接：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git clone https://github.com/openwrt/openwrt.git
</span></span></code></pre></div><p>即可。</p>
<p>但现在有一些国产的路由器 OpenWRT 官方并不支持，可以看看有没有第三方的 OpenWRT 源码支持了你手上的路由器，下载相应的源代码。</p>
<p>可以通过 <code>cat /etc/openwrt_release</code> 命令来查看设备的 Arch、Target 信息：</p>
<pre tabindex="0"><code>root@QWRT:~# cat /etc/openwrt_release
DISTRIB_ID=&#39;OpenWrt&#39;
DISTRIB_RELEASE=&#39;19.07-SNAPSHOT&#39;
DISTRIB_TARGET=&#39;ipq60xx/generic&#39;
DISTRIB_ARCH=&#39;aarch64_cortex-a53+crypto&#39;
DISTRIB_TAINTS=&#39;no-all busybox override&#39;
DISTRIB_REVISION=&#39;R23.1.20&#39;
DISTRIB_DESCRIPTION=&#39;QWRT &#39;
</code></pre><p>获取了 OpenWRT 源代码之后需要更新 Feeds：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> openwrt
</span></span><span class="line"><span class="cl">./scripts/feeds update -a
</span></span><span class="line"><span class="cl">./scripts/feeds install -a
</span></span></code></pre></div><h1 id="添加想要编译的第三方包-可选">添加想要编译的第三方包 (可选)</h1>
<p>因为我需要编译 rkp-ipid 和 UA2F，因此我还需要将这些包的源码下载下来：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git clone https://github.com/CHN-beta/rkp-ipid package/rkp-ipid
</span></span><span class="line"><span class="cl">git clone https://github.com/Zxilly/UA2F package/UA2F
</span></span></code></pre></div><h1 id="配置编译目标">配置编译目标</h1>
<p>一切准备就绪，接下来就是设定编译目标了，执行以下命令：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">make menuconfig
</span></span></code></pre></div><p>然后会出现一个命令行 UI，首先需要重点设定好：<code>Target System</code>, <code>Subtarget</code>, <code>Target Profile</code>，将这几个项目设定为你的路由器。
然后就可以选择你需要编译的包啦，使用空格可以选择要编译的包，设定为 <code>&lt;*&gt;</code> 的包将会内置到固件里，刷好就能直接用，设定为 <code>&lt;M&gt;</code> 的包将会编译成 ipk 文件，需要上传到路由器，然后使用 <code>opkg install package_name.ipk</code> 进行安装。</p>
<p>设定好了之后，将配置文件保存为 <code>.config</code> 即可，如果有一些包需要对内核做一些自定义，也可以直接使用文本编辑器编辑保存下来的 <code>.config</code> 文件，例如 UA2F 就需要添加 <code>CONFIG_NETFILTER_NETLINK_GLUE_CT=y</code>。</p>
<h1 id="开始编译">开始编译</h1>
<p>一切准备完毕，接下来开始编译！</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">make download -j8
</span></span><span class="line"><span class="cl">make <span class="nv">V</span><span class="o">=</span>s -j8
</span></span></code></pre></div><p>其中，<code>V=s</code> 表示输出 stdout 和 stderr，方便在编译失败的时候根据输出信息确定是哪里的错误，<code>-jn</code> 的 <code>n</code> 表示使用 n 个线程同时编译，对于核心数较多的机器可以将该数值设置得大一些，加快编译过程。</p>
<p>编译完成之后，在 <code>./bin/targets</code> 下就可以找到固件以及相应的 ipk 包了。</p>
<h1 id="ua2f-的注意事项">UA2F 的注意事项</h1>
<p>要使 UA2F 正常工作需要关闭 &ldquo;网络&rdquo;——&ldquo;Turbo ACC 网络加速设置&rdquo; 下的所有选项，否则 UA2F 无法正常工作，具体表现为：重启路由器防火墙之后，第一次 HTTP 请求的 User-Agent 成功修改，但后续 HTTP 请求的 User-Agent 没有被修改。</p>
<h1 id="references">References</h1>
<ul>
<li><a href="https://blog.sunbk201.site/posts/crack-campus-network">https://blog.sunbk201.site/posts/crack-campus-network</a></li>
<li><a href="https://github.com/coolsnowwolf/lede">https://github.com/coolsnowwolf/lede</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>为 OpenWrt 交叉编译 MentoHUST</title>
      <link>https://lgiki.net/post/cross-compile-mentohust-for-openwrt/</link>
      <pubDate>Mon, 14 Sep 2020 21:55:41 +0800</pubDate>
      <guid>https://lgiki.net/post/cross-compile-mentohust-for-openwrt/</guid>
      <description>&lt;p&gt;这是一篇从旧播客备份中恢复的文章，简单记录了为OpenWrt交叉编译MentoHUST的过程。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>这是一篇从旧播客备份中恢复的文章，简单记录了为OpenWrt交叉编译MentoHUST的过程。</p>
<h1 id="需要的工具">需要的工具</h1>
<ul>
<li>Linux环境（大部分主流发行版均可，我使用的是ArchLinux，你也可以选择自己喜欢的发行版）</li>
<li>OpenWrt SDK（下文会介绍）</li>
<li>稳定可靠的网络连接</li>
<li>耐心（编译因电脑配置的不同可能会需要较长的时间，需要耐心等待）</li>
</ul>
<h1 id="搭建编译环境">搭建编译环境</h1>
<h2 id="安装编译工具">安装编译工具</h2>
<p>这一步参考OpenWrt的官方Wiki：<a href="https://openwrt.org/docs/guide-developer/build-system/install-buildsystem#examples_of_package_installations">https://openwrt.org/docs/guide-developer/build-system/install-buildsystem#examples_of_package_installations</a></p>
<p>这个页面里针对各个Linux发行版都列出了所需的所有软件包，如果编译过程中还是有所欠缺，只需要根据报错信息安装对应的工具即可，这里不再详细展开。</p>
<h2 id="下载openwrt-sdk并解压">下载OpenWrt SDK并解压</h2>
<p>下载OpenWrt SDK之前需要先确定你的路由器CPU平台，可以到OpenWrt官网上通过路由器的型号查询，也可以通过搜索引擎去搜索。相信已经为路由器刷过OpenWrt的都知道自己路由器对应的是哪个平台。</p>
<p>这里我以我的Netgear WNDR3800举例，该路由器属于ar71xx平台，所以打开OpenWrt的<a href="https://mirrors4.tuna.tsinghua.edu.cn/openwrt/releases/19.07.4/targets/">Download页面</a>（这里我使用tuna的镜像站以加快下载速度），可以看到有很多个目录，每个目录的名称对应的就是各个平台，这里我选择<a href="https://mirrors4.tuna.tsinghua.edu.cn/openwrt/releases/19.07.4/targets/ar71xx/">ar71xx</a>，之后进入<a href="https://mirrors4.tuna.tsinghua.edu.cn/openwrt/releases/19.07.4/targets/ar71xx/generic/">generic</a>目录，将页面拉到最底下可以看到：<a href="https://mirrors4.tuna.tsinghua.edu.cn/openwrt/releases/19.07.4/targets/ar71xx/generic/openwrt-sdk-19.07.4-ar71xx-generic_gcc-7.5.0_musl.Linux-x86_64.tar.xz">openwrt-sdk-19.07.4-ar71xx-generic_gcc-7.5.0_musl.Linux-x86_64.tar.xz</a>，将其下载下来即可。</p>
<p>下载完成之后，解压：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">tar xvJf openwrt-sdk-19.07.4-ar71xx-generic_gcc-7.5.0_musl.Linux-x86_64.tar.xz
</span></span></code></pre></div><h2 id="同步mentohust源码">同步MentoHUST源码</h2>
<p>这里不用原版的MentoHUST，而是使用已经为OpenWrt打包好的<a href="https://github.com/KyleRicardo/MentoHUST-OpenWrt-ipk">MentoHUST-OpenWrt-ipk</a></p>
<p>首先cd到OpenWrt SDK的目录下：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> openwrt-sdk-19.07.4-ar71xx-generic_gcc-7.5.0_musl.Linux-x86_64
</span></span></code></pre></div><p>然后通过git clone将MentoHUST源码同步到package目录下：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git clone https://github.com/KyleRicardo/MentoHUST-OpenWrt-ipk.git package/mentohust
</span></span></code></pre></div><h1 id="开始编译">开始编译</h1>
<p>编译环境搭建完成之后就可以正式开始交叉编译了。</p>
<h2 id="更新feeds">更新feeds</h2>
<p>首先需要更新feeds：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">./scripts/feeds update
</span></span></code></pre></div><p>然后安装libpcap feed：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">./scripts/feeds install libpcap
</span></span></code></pre></div><p>这里需要注意，OpenWrt SDK编译libpcap时只会编译出libpcap.so而不会编译出libpcap.a，但是mentohust需要libpcap.a，所以需要修改一下libpcap的Makefile，编辑<code>package/feeds/base/libpcap/Makefile</code>文件，将其中的</p>
<pre tabindex="0"><code>define Package/libpcap/install
        $(INSTALL_DIR) $(1)/usr/lib
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcap.so.* $(1)/usr/lib/
endef
</code></pre><p>修改为：</p>
<pre tabindex="0"><code>define Package/libpcap/install
        $(INSTALL_DIR) $(1)/usr/lib
        $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcap.{a,so*} $(1)/usr/lib/
endef
</code></pre><p>即让编译libpcap的时候同时编译出libpcap.a</p>
<h2 id="menuconfig">menuconfig</h2>
<p>接下来如要对编译配置文件进行简单的配置，这里直接使用menuconfig：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">make menuconfig
</span></span></code></pre></div><p>这里需要关闭<code>Advanced configuration options (for developers)</code>中的<code>Automatic removal of build directories</code>：</p>
<p><img loading="lazy" src="/cross-compile-mentohust-for-openwrt/disable_auto_remove.png"></p>
<p>并确保<code>Libraries</code>下的<code>libpcap</code>为<code>M</code>：</p>
<p><img loading="lazy" src="/cross-compile-mentohust-for-openwrt/libpcap.png"></p>
<p><code>Network</code>下的<code>Ruijie</code>下的<code>mentohust</code>为<code>M</code>：</p>
<p><img loading="lazy" src="/cross-compile-mentohust-for-openwrt/mentohust.png"></p>
<p>这样menuconfig就完成了，保存一下退出即可</p>
<h2 id="make">make!</h2>
<p>好了，到这一步所有的准备工作就都完成了，接下来就可以开始编译了：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">make package/mentohust/compile
</span></span></code></pre></div><p>这一步需要在线下载libpcap的源码，所以请确保有一个良好的网络连接</p>
<p>如果没有什么意外情况的话，等编译完成之后就能在<code>bin/packages/mips_24kc/base</code>下找到libpcap和mentohust的ipk软件包了：</p>
<p><img loading="lazy" src="/cross-compile-mentohust-for-openwrt/ipk.png"></p>
<h1 id="安装到openwrt">安装到OpenWrt</h1>
<p>接下来就只需要把编译出来的这两个ipk软件包安装进OpenWrt路由器就行了</p>
<h2 id="上传ipk到openwrt">上传ipk到OpenWrt</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">scp libpcap1_1.9.1-2.1_mips_24kc.ipk root@192.168.1.1:/root/
</span></span><span class="line"><span class="cl">scp mentohust_0.3.1-1_mips_24kc.ipk root@192.168.1.1:/root/
</span></span></code></pre></div><h2 id="安装">安装</h2>
<p>SSH连接到OpenWrt路由器，然后执行：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">opkg install libpcap1_1.9.1-2.1_mips_24kc.ipk
</span></span><span class="line"><span class="cl">opkg install mentohust_0.3.1-1_mips_24kc.ipk
</span></span></code></pre></div><h1 id="mentohust-luci-app">MentoHUST LuCI App</h1>
<p>将上面编译出来地libpcap和mentohust安装到OpenWrt之后就能ssh连接到路由器，在命令行下面使用mentohust命令进行锐捷认证了，但是通过命令行进行锐捷认证总是不方便的。所以我们还需要一个管理页面，通过浏览器就能管理mentohust的配置和运行状态。</p>
<p>而因为管理页面只是执行一些命令的调用，并不需要像MentoHUST那样针对不同的CPU平台编译可执行文件，所以直接到这个仓库<a href="https://github.com/BoringCat/luci-app-mentohust">https://github.com/BoringCat/luci-app-mentohust</a>的<a href="https://github.com/BoringCat/luci-app-mentohust/releases">Release</a>页面下载作者编译好的ipk包然后跟前文一样使用<code>opkg install</code>安装到路由器即可。</p>
<p><img loading="lazy" src="/cross-compile-mentohust-for-openwrt/luci.png"></p>
<p>至此，就可以愉快地让路由器代替电脑完成锐捷认证了，愉快享受网上冲浪的乐趣吧！XD</p>]]></content:encoded>
    </item>
  </channel>
</rss>
