OpenWRT 包的编译以及更改 NAT 类型

OpenWRT 的许多定制包都没有针对自己路由器架构的二进制包,因此需要自己编译。

最近发现 OpenWRT 默认的 NAT 类型是 Symmetric NAT,而这种 NAT 不适合进行打洞穿透。遂萌生了更改 NAT 类型为 Full Cone 的念头。查了一下资料发现需要安装一个内核扩展和 iptables 扩展,很不幸作者没有针对我的路由器编译二进制包,因此我们需要手动编译。

注意: 这个扩展在某些情况下会和某些与 NAT 有关的服务冲突,可能导致内核崩溃,请谨慎使用。

准备工作

操作系统环境

首先,我们需要一个 Linux 作为系统环境,这里我们选择 Ubuntu 16.04 LTS。 除了基本的编译器 gcc 和 g++ 外,我们需要这些包:

sudo apt install git binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils subversion libncurses5-dev ncurses-term zlib1g-dev asciidoc libz-dev libssl-dev

如果可以,最好挂上代理再进行编译,该过程不再赘述。 请注意,编译 OpenWRT 会占用较大的硬盘空间,请确保硬盘可用空间不少于 8.5GB。

克隆源码

首先你需要确定你的路由器是运行的什么版本的 OpenWRT,OpenWRT 有很多衍生版。因此,你克隆的源码需要和你路由器上运行的衍生版相一致。这里我使用的是 OpenWRT 官方版本 18.06.1。如果你路由器运行的衍生版不公开源码,那么你的世界黑暗了。但是,如果你是 MediaTek Ralink MIPS 架构路由器,也许可以到下面看看。

git clone https://git.openwrt.org/openwrt/openwrt.git
cd openwrt
git checkout v18.06.1

这样我就切换到了我所使用的 OpenWRT 版本。

编译过程

加入扩展包

首先我们需要更新 feed:

./scripts/feeds update -a
./scripts/feeds install -a

然后,我们就可以加入我们想要扩展的包了。这里为了修改 NAT 类型,我们加入 LGA1150 移植的 openwrt-fullconenat

git clone -b master --single-branch https://github.com/LGA1150/openwrt-fullconenat package/fullconenat

进行配置

键入 make menuconfig 回车。 一番检测后,出现了一个文本 UI 界面。 Text UI in Menu config 你需要首先修改 Target System,选择你路由器的架构。 在 Subtarget 一项中,选择你路由器的主板型号。 下面的 Target Profile 比较有趣。如果你足够幸运,你的路由器得到官方的支持,那么你可以在这一项中找到你路由器型号的选项。这说明编译出来的包一定和你的路由器兼容,而且如果你的路由器有一些奇怪的参数,通过这个 Profile 也可以规避。如果很不幸地你的路由器不在此列,那你就只能选择 Default Profile 了。 接下来的配置根据包的不同而不同,对于 openwrt-fullcone 来说,你需要跳转到 Network -> Firewall 选中 iptables_mod_fullconenat,按下 M 键以作为模块编译。 最后退出保存配置。

开始编译

只需输入 make V=s 即可编译,这样会输出较多调试信息,便于排查问题。 建议挂上代理进行编译,因为编译过程中会下载较多依赖包,而这些包大多数在海外,除非你和我一样用海外速度快的移动宽带。 编译完成后,你就可以在 bin 目录下找到你编译出来的包了。

切换 NAT 类型

对于极路由4增强版和 B70,安装你编译好的 kmod-ipt-fullconenat_4.14.63+2018-12-15-d4daedd0-1_mipsel_24kc.ipkiptables-mod-fullconenat_2018-12-15-d4daedd0-1_mipsel_24kc.ipk。 切换 Full Cone NAT 的包我已经为 OpenWRT 18.06.1、MT7621A 处理器的极路由4增强版/B70 编译好了二进制包,因此如果你不想编译,也可以用我编译好的版本,文件 – qwqCloud。 如果编译之后提示 kernel 不兼容,在主版本号一致的情况下,可以将后面的十六进制版本号修改为你自己的版本号,这可能是一个 bug,当然我的包已经修改完毕了。 如果你的 kernel 版本和我的不一致,其实并不建议你使用,但一开始我在 4.14.63 内核上自行解包安装了 4.14.90 内核的扩展,并没有出现问题。但的确不建议这样做,因为可能存在未知的风险。try it at your own risk! 安装完包之后,我们用以下命令来切换 NAT 类型,如果你按照 LGA1150 的方法 patch 了 Firewall3,那你可以直接跳过下面的部分了,因为 Firewall3 会自动处理好的。

modprobe xt_FULLCONENAT
echo "xt_FULLCONENAT" >> /etc/modules.d/ipt-nat
echo "iptables -t nat -A zone_wan_prerouting -j FULLCONENAT" >> /etc/firewall.user
echo "iptables -t nat -A zone_wan_postrouting -j FULLCONENAT" >> /etc/firewall.user
/etc/init.d/firewall restart
sleep 70 && reboot  # 重启路由器

注意,如果你测试发现还是 Symmetric NAT 且你确定运营商不是 Symmetric NAT,请注意是否在防火墙 WAN Zone 的配置中将 Input 设置成了 accept。这样会导致 Stun 误判,请将其改成 reject,再做测试。

3 Replies to “OpenWRT 包的编译以及更改 NAT 类型”

  1. 话说公网ip也会被判断成Symmetric NAT吗?
    我刚才光猫直连电脑,电脑拨号,测出来还是对称的诶,好奇怪。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注