喵喵喵,这里是一个修改 UA 的小模块。细致地讲,就是用在 OpenWrt 上修改发给外网 80 端口 GET 和 POST 请求的 UA 字段 为`XMURP/1.0`再加很多个空格的内核模块,用来防止学校检测到使用代理(接路由器)。具体情况,百度“厦大路由”然后看我的简书文章就好了。在 WNDR4300 OpenWrt 18.06.1(内核 4.9.120)测试似乎没问题。前两天还适配了一下 4.14的内核。 如果有一些包不希望被改 UA,只要在防火墙规则里将 MARK 的最低位设置为 1 就可以了。例如: ``` iptables -t mangle -A PREROUTING -i br-lan_raw -j MARK --set-mark 1 ```   这是我第一次在 GitHub 上搞自己的仓库,可能会有些小问题哈。要是有的话,请各路大佬指正。 --- 第一层函数的思路: * 如果没有在等待下一个分包,则检测这个包是否是HTTP的开头部分。如果是,则传递给下一层检查。 * 如果在等待下一个分包,则检测这个包是否是需要的下一个包。如果是,传递给下一层检查;如果不是,报错。 检查结果包含: * 是否需要下一个分包。 * 是否需要保留当前包。 * 是否已经被修改(一旦被修改,就意味着是修改完成,所以肯定不需要下一个分包,也不需要保留当前包)。 * 如果被修改,是否有上一个分包。 对应的动作为: * 如果需要下一个分包,并且保留当前包,如果这是第二个被保留的包,则出错。 * 如果需要下一个分包,并且保留当前包,如果这是第一个被保留的包,则返回 STOLEN,并等待下一个包。 * 如果需要下一个分包,并且不保留当前包,返回 ACCEPT,并且等待下一个包。 * 如果不需要下一个分包、没有被修改、没有上一个分包,则返回 ACCEPT,不等待下一个包,当前流修改完毕。 * 如果不需要下一个分包、没有被修改、有上一个分包,则返回 ACCEPT,不等待下一个包,上一个包标记后进入协议栈,当前流修改完毕。 * 如果不需要下一个分包、被修改、没有上一个分包,则修改校验和并返回 ACCEPT,当前流修改完毕。 * 如果不需要下一个分包、被修改、有上一个分包,则这个包修改校验和并返回 ACCEPT,上一个包修改校验和、标记后进入协议栈。 第二层函数的思路: 逐个字节发送给下一层。下一层的返回有这些可能: * 如果需要下一个字节。如果匹配到 UA,