v3.1.6 — one refused firewall line no longer costs you the whole table, and an Access Point is a real box
- A filter table that the kernel refuses is now loud, and survivable. Field data from the
RT-BE88U report: both copies of/tmp/filter_rulessaved at boot passed
iptables-restore --test, yet everyservice restart_firewallhours later still left
start_default_filter()'s boot skeleton in the filter table — no port forwards, no VPN server
chains, no SECURITY chain, no TCPMSS clamp.iptables-restoreis atomic, so one line the kernel
would not take costs the whole table; and because the firmware's_eval()sends the restore's
output to/dev/null, nothing on the box could say which line. That router ran that way for two
weeks with a working nat table, which is the worst shape of all: forwarded flows were translated
and then dropped.reaper_restore_rules()now replaces all four filter restores (v4 and v6, both
filter_settingvariants). It keeps the restore's own words under/tmp/err_rules/<file>.err,
names the refused line verbatim in the system log, and then applies the table without that
line, up to eight times — a table missing one rule the kernel was never going to enforce beats a
skeleton that enforces none of them. Chain declarations, the table line andCOMMITare never
stripped, and a refusal that names no line (a crash) is logged and left alone.rwatchgained
check3f, which recognises the skeleton by the absence of two chains only the full ruleset
declares and asks for onerestart_firewallper boot; the Diagnostics report's14fprints which
of the two tables is running, theerr_ruleslisting and each file's first line. - Access Point, repeater and media-bridge boxes are no longer second-class. The GT-BE19000
tester's report and diag arrived, and the fact the report did not state is the one that explained
it: that router is in Access Point mode. Three of the four items were not port defects at all but
Reaper surfaces that quietly assumed a routing box, in code every model shares. They are fixed by
the operation mode, not by the model, so a routing box behaves exactly as it did before:- The socket-buffer ceilings load in every mode.
start_firewall()returns early when the box
is not routing, long before the block that raisesnet.core.rmem_max/wmem_maxto 16 MB and
netdev_max_backlogto 4096 — so an AP ran on the stock 212992 ceiling no matter how often the
firewall was restarted, which caps any stream whose tool callssetsockopt(SO_RCVBUF), the
Ookla engine included. Those writes are not firewall state and no longer sit behind that guard. - The dashboard counts the clients that are actually there. The client tiles polled
networkmap'sget_clientlist()and dropped every row whoseisOnlinewas not1; that flag is
derived from the DHCP leases and conntrack, and a bridging box has neither — so the dashboard
showed zero while sixteen stations were associated and the Devices page listed all of them. In a
non-routing mode the tiles now read Reaper's own device store, which builds presence from the
radio association lists, the bridge forwarding table and the ARP table, and carries the band
each tile needs. - The Internet card names the mode instead of crying wolf. Its verdict came from
wan0_state_t, which is structurally zero on a box with no WAN of its own, so a perfectly
healthy router painted its own Internet state red. It now reads Access Point (or whichever
mode applies) in a neutral colour, and the live WAN poll — which would otherwise have run a
four-second request for the life of the page against a state that cannot change — does not start. - The Diagnostics report stops reporting a designed idle state as a fault.
rtrafd,gkdand
rchqdare all started only when the box routes, andrtrafdaccounts off conntrack, which a
bridging box never populates — so "rtrafd is enabled but not running" was a false warning on
that capture, not a finding. Section12cnow says which it is.
The fifth item in the report, duplicate menu entries after opening the UPnP Media Server page, is
not reproduced and still wants a screenshot and the tester's add-on list.
- The socket-buffer ceilings load in every mode.
- Warden's outbound total survives its own statistics window. The first real capture of
rwatch's outbound line found two defects in the instrumentation rather than in the blocking:
"blocked so far" read the live counter thatfold.shbanks and zeroes every fifteen minutes, so a
healthy box reported0most of the time — and0is exactly the figure an operator quotes to
conclude that outbound blocking is dead. The drops are now banked under their own durable key
beside the total, and both readers quote banked plus live. Separately, an nvram read that timed
out came back empty and took the same branch as a real0, advising the operator to switch on
logging that was already on; "could not be read this tick" is now its own state and offers no
advice. - Policy Routing greys a Status cell that is not a live verdict. The column stays
configuration-derived, but the cell is dimmed while the rule or the master switch is off, so
Inactive · WANon a rule that is not installed no longer reads as something the router is doing. - Inherited components, third pass. Each of the five entries in
SECURITY.mdwas taken in code
rather than by version:- netatalk 3.0.5 (Time Machine): the rest of the 2022 set is closed. CVE-2022-23125
(copyapplfile()) and CVE-2022-45188 (afp_getappl()) each read an attacker-controlled 16-bit
length out of the Desktop DB appl file into a fixed buffer with no bounds check — stack and heap
respectively — and CVE-2022-23121 (parse_entries()) both let the entry bounds test integer-
overflow and let a rejected entry be skipped while the caller carried on with a header it
believed had parsed. - Quagga 0.99.24 (zebra): CVE-2016-1245, a stack overflow in the IPv6 router-advertisement
read path —rtadv_recv_packet()was handedBUFSIZas the size of a 4096-byte buffer. - wpa_supplicant 0.6.10 and lighttpd 1.4.39 were retired from the list on what they
actually compile rather than on their version strings: the era's headline wpa_supplicant
advisories need the 4-way handshake, the TLS-based EAP methods or the P2P/WPS code, none of
which this build contains, and three commonly cited lighttpd advisories do not apply to this
configuration. A version match is not a finding, and a version is not a clean bill of health
either — which is the same lesson the v3.1.5 netatalk correction taught from the other side.
- netatalk 3.0.5 (Time Machine): the rest of the 2022 set is closed. CVE-2022-23125
- Two small ones:
shared/defaults.ccarriedlog_leveltwice, so the second entry was dead; and
the Diagnostics page had a hardcoded version literal that had drifted from the script it fronts,
making the page and the report it generates contradict each other on the same screen.
Images & checksums (GT-BE98_PRO)
Two flashable images: + AI Advisor (default) and Standard (noMCP, all AI components compiled out entirely). Flash the *_nand_squashfs.pkgtb via Administration > Firmware Upgrade.
This is a beta release. Its filename carries
_BETAand the router reports the same string on the dashboard and the About page, so you can always tell which channel a flashed image came from. Stable releases carry no marker.
| Variant | File | SHA-256 |
|---|---|---|
| + AI Advisor | GT-BE98_PRO_3006_102.8_Reaper_v3.1.6_BETA_nand_squashfs.pkgtb
| 03d06fb5f1b84fb4f7648e82ba0abfdfc9ddc4cb3edb9cabcb950a70508375b1
|
| Standard | GT-BE98_PRO_3006_102.8_Reaper_v3.1.6_BETA_noMCP_nand_squashfs.pkgtb
| a95b8330f588f0bbfd1b225c7566ff734633b3d67270b57a1b34c96b64a8a4f4
|
Verify a download against the attached SHA256SUMS-GT-BE98_PRO-Reaper_v3.1.6.txt.
Corresponding source & reproducibility
The GT-BE98_PRO image for v3.1.6-beta is built from this repository at tag v3.1.6-beta-GT-BE98_PRO: the pinned Asuswrt-Merlin base (3006.102.8-beta2, a7ebfa133a) plus the complete patch series. The tag freezes the exact source that produced it.
- Patches:
patches/ - Provenance record:
provenance/manifest.json - How to verify:
docs/REPRODUCIBILITY.mdanddocs/SOURCE-AVAILABILITY.md
The auto-attached Source code (zip/tar.gz) asset below is this repository at tag v3.1.6-beta-GT-BE98_PRO (patches + docs).