<?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>Rkp-Ipid on LGiki&#39;s Blog</title>
    <link>https://lgiki.net/tags/rkp-ipid/</link>
    <description>Recent content in Rkp-Ipid 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/rkp-ipid/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>
  </channel>
</rss>
