Commit Graph

17 Commits

Author SHA1 Message Date
5c0984b97d feat: Rename guest SSID from Parahub_Free to parahub.io/free
SSID as call-to-action URL — guests see where to go directly in WiFi list.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 18:07:51 +00:00
29070e95ef fix(vpn): Wait for WiFi interface before adding guest route to table 100
Guest WiFi interface (phy0-ap0) may not be up when init script runs at
boot. Move guest route addition to a background retry loop (up to 60s).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 17:21:38 +00:00
3771521d59 fix(vpn): Replace UCI grev6 with manual GRE6 tunnel init script
OpenWrt 25.x lacks the netifd grev6 protocol handler, so the UCI
vpn_tunnel interface never came up (NO_DEVICE). Now using a dedicated
init script (parahub-vpn-tunnel, START=96) that:

- Creates ip6gre tunnel with encaplimit none (critical: Yggdrasil
  drops IPv6 packets with DSTOPT extension headers from encaplimit)
- Waits for Yggdrasil address before creating tunnel
- Adds guest subnet direct route to table 100 (fixes DNS/reply
  routing — without it, router replies with source in guest subnet
  get routed through GRE instead of back to the client)
- Reloads firewall so vpn_tunnel zone picks up gre6-vpn device

Also updated VPS mesh-gateway.sh with encaplimit none.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 17:02:49 +00:00
e84d578ce4 fix(firmware): Three critical bugs found during MT3000 testing
1. Add yggdrasil init script (procd) — OpenWrt 25.x package doesn't
   include one, causing uci-defaults to fail on `/etc/init.d/yggdrasil
   enable` with set -e, leaving script in /etc/uci-defaults/ to re-run
   every boot and overwrite all config changes.

2. Delete default br-lan/lan before creating br-private — both bridges
   competing for eth0/eth1 port, preventing LAN cable access.

3. Per-device port mapping via /etc/parahub/port_map — filogic devices
   (MT3000, MT6000, WR3000) have eth0=WAN, eth1=LAN (opposite of
   qualcommax/ath79). Build.sh writes PORT_MAP, uci-defaults reads it.

Also: remove `set -e` from uci-defaults (too fragile for first-boot),
add SSH/HTTP firewall rules on yggdrasil zone for remote management.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 15:06:47 +00:00
44e6e616cf refactor: Remove AX6S (Xiaomi Redmi AX6S) target
Incomplete sysupgrade (.itb format), not published on download page.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 09:18:28 +00:00
c5b9229ad0 feat: Add OTA auto-update and guest IPv6 via Yggdrasil
OTA: build.sh writes version/profile to firmware, generates manifest.json
with SHA256 per device. parahub-autoupdate script runs nightly at 3am,
fetches manifest (Yggdrasil first), verifies checksum, runs sysupgrade.
sysupgrade.conf preserves /etc/parahub/, yggdrasil.conf, dropbear keys.

Guest IPv6: Yggdrasil 300::/64 subnet assigned to guest via SLAAC.
Separate yggdrasil firewall zone (5 zones total) with guest→yggdrasil
forwarding. IPv6 exempt from tc shaping — full speed to Parahub services.
IPv6 to WAN blocked. Heartbeat now reads version from file, not hardcoded.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 08:09:27 +00:00
6d6cffa42c feat: Add TP-Link CPE710 support, fix kmod-sched-htb and AX6S target
- Add CPE710 v1 (ath79/generic, Bee role) for 5GHz outdoor PtP links
- Replace kmod-sched-htb with kmod-sched (HTB built into kernel 6.12)
- Fix AX6S target: mediatek/filogic → mediatek/mt7622

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 07:35:27 +00:00
ef1b9c10ea feat: Replace SQM with per-client speed control for paid WiFi upgrade
Add parahub-speed-control script (nftables set + tc HTB) for per-IP
speed shaping. Free tier 512kbps, paid tier unlimited. Heartbeat now
parses paid_clients from API response and syncs nftables set.

Replaced sqm-scripts/kmod-sched-cake/luci-app-sqm packages with
tc-full/kmod-ifb/kmod-sched-htb. Section 8 of uci-defaults creates
init.d service for speed control instead of SQM config.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-05 22:35:16 +00:00
968f90611e feat: Split firmware into Bee (L2 transport) and Bumblebee (L3 gateway) roles
Bee (wr3000, ar300m16): minimal batman-adv mesh relay with gw_mode=client,
no yggdrasil/GRE6/VPN/SQM/DoH, Parahub_Free bridged to private network.
Bumblebee (axt1800, mt3000, mt6000, ax6s, ax53u): full stack with
gw_mode=server, yggdrasil overlay, GRE6 tunnel, guest isolation, SQM, DoH.

Build creates /etc/parahub/role marker; heartbeat reports firmware_role
and mesh_ip; Bee uses public URL, Bumblebee tries yggdrasil with fallback.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-05 20:21:06 +00:00
dde37c7a7b feat: Add heartbeat phone-home script and norn SSH key
- parahub-heartbeat: cURL heartbeat to cloud API every 5min via cron
- authorized_keys: add norn@parahub-ng for WiFi password SSH retrieval
- 99-parahub-mesh: section 12 enables cron + heartbeat on first boot

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 18:30:20 +00:00
db3cf36443 feat: add GL-AR300M16-EXT (ath79/generic, 16MB flash) target
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 18:25:26 +00:00
859033635b feat: local Mullvad WireGuard + policy routing for guest traffic
- parahub-mullvad script: setup/status/remove for owner's Mullvad key
- WireGuard packages: kmod-wireguard, wireguard-tools, luci-proto-wireguard
- Policy routing: ip4table='100' + guest subnet rule (fixes guest→VPN flow)
- setup: auto-detects country, registers key, creates WG interface, switches firewall
- remove: reverts to GRE6→VPS gateway

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 15:42:45 +00:00
3b6eb65dc5 feat: guest traffic via GRE6→VPS→Mullvad, OWE, DNS security, SSH key
- GRE6 tunnel over Yggdrasil to VPS gateway (172.16.0.0/24)
- Kill switch: guest→vpn_tunnel only (no guest→wan)
- OWE transition mode on Parahub_Free (encrypted + open fallback)
- DNS-over-HTTPS via https-dns-proxy (Cloudflare 1.1.1.1)
- Guest DNS hijacked via firewall DNAT redirect
- IPv6 blocked for guest zone (leak prevention)
- SQM 128→512 kbps
- Added kmod-gre6, https-dns-proxy to PACKAGES_CORE
- SSH authorized key for passwordless root access

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 15:26:21 +00:00
da567b6398 feat: add Yggdrasil overlay network to firmware build
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 14:53:10 +00:00
38d78071c7 fix: use shared mesh SAE key for auto-peering between nodes
Random per-node mesh keys prevented nodes from connecting to each other.
Now all Parahub nodes share a pre-configured mesh SAE key for automatic
802.11s mesh peering. Private WiFi keys remain randomly generated per node.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 14:04:09 +00:00
e7a78ca0d1 feat: multi-device build with per-device targets
Rewrite build.sh to support per-device target/subtarget selection.
Adds Asus RT-AX53U (ramips/mt7621), GL-MT6000, upgrades to OpenWrt 25.12.0-rc4,
and auto-detects tar.zst vs tar.xz for Image Builder download.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 13:23:42 +00:00
cd68493047 feat: uci-defaults zero-touch mesh node auto-configuration
First-boot script that configures a Parahub mesh node with zero user
interaction: batman-adv BATMAN_V mesh, dual-band WiFi (private SAE +
public open), firewall zones with guest isolation, SQM 128kbps shaping,
MAC-derived subnets for collision avoidance, and key generation.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:24:38 +00:00