83 lines
3.9 KiB
Markdown
83 lines
3.9 KiB
Markdown
# ZTE MF935 Router IP Rotation
|
|
|
|
## Device
|
|
|
|
ZTE MF935 4G Mobile Hotspot (Vodafone Ukraine). Admin panel: `http://192.168.0.1`. UI language: Ukrainian.
|
|
|
|
## Key Discovery
|
|
|
|
**Simple disconnect/reconnect does NOT change the IP.** Vodafone assigns a sticky IP based on the SIM card. The same IP is returned after reconnect even with 40+ seconds of disconnection.
|
|
|
|
**Switching network mode forces a new IP allocation.** The carrier's 4G and 3G pools are separate — switching between them always yields a fresh IP.
|
|
|
|
## Procedure
|
|
|
|
### Step 1: Disconnect
|
|
|
|
Navigate to `http://192.168.0.1/index.html#home`. Click the **"Відєднати"** (Disconnect) button. Verify: traffic shows 0MB, timer 00:00:00, button changes to **"Підєднати"** (Connect).
|
|
|
|
### Step 2: Switch to 3G
|
|
|
|
Navigate to `http://192.168.0.1/index.html#net_select`. Settings are unlocked only while disconnected.
|
|
|
|
1. Select **"Тільки 3G"** from the network mode dropdown
|
|
2. Click **"Застосувати"** (Apply)
|
|
3. Go back to home page — header should show **"WCDMA"** instead of "LTE"
|
|
4. Click **"Підєднати"** (Connect)
|
|
5. Wait ~8 seconds for connection
|
|
6. Verify IP: `curl -s ifconfig.me` — should differ from old IP
|
|
|
|
### Step 3: Switch back to 4G (optional, for speed)
|
|
|
|
Repeat the procedure but select **"Тільки 4G"** instead of 3G. This gives ANOTHER fresh IP from the 4G pool.
|
|
|
|
1. Disconnect
|
|
2. Navigate to `#net_select`
|
|
3. Select **"Тільки 4G"**
|
|
4. Apply
|
|
5. Go home — header shows **"LTE"**
|
|
6. Connect
|
|
7. Verify IP
|
|
|
|
### Automation via Chrome DevTools
|
|
|
|
The entire procedure can be scripted through `mcp__chrome_devtools__` tools:
|
|
|
|
```
|
|
1. navigate_page → http://192.168.0.1/index.html#home
|
|
2. take_snapshot → find "Відєднати" button uid
|
|
3. click → disconnect
|
|
4. navigate_page → http://192.168.0.1/index.html#net_select
|
|
5. take_snapshot → find combobox and "Застосувати" button
|
|
6. fill → select "Тільки 3G" (or "Тільки 4G")
|
|
7. click → "Застосувати"
|
|
8. navigate_page → http://192.168.0.1/index.html#home
|
|
9. take_snapshot → find "Підєднати" button
|
|
10. click → connect
|
|
11. evaluate_script → wait 8s
|
|
12. terminal → curl -s ifconfig.me
|
|
```
|
|
|
|
## Pitfalls
|
|
|
|
- **Settings locked while connected**: The "Для зміни налаштувань відєднайтеся від мережі" message means you must disconnect first. All radio buttons and dropdowns are disabled while connected.
|
|
- **Sticky IP on same mode reconnect**: If you disconnect and reconnect on the same network mode (4G→4G or 3G→3G), the IP stays the same. MUST switch modes.
|
|
- **Goform API rejected**: Direct API calls to `/goform/goform_set_cmd_process` with `DISCONNECT_NETWORK`, `CONNECT_NETWORK`, `REBOOT_DEVICE` etc. return `{"result":"failure"}` — the API requires authentication. Use the browser UI instead.
|
|
- **3G is slow**: ~0.9 Mb/s download vs 8.8 Mb/s on 4G. Switch back to 4G after getting the new IP.
|
|
|
|
## Tested IPs
|
|
|
|
| Date | Old IP | New IP | Method |
|
|
|------|--------|--------|--------|
|
|
| 2026-08-10 | [REDACTED-IP] | [REDACTED-IP] | 4G→3G |
|
|
| 2026-08-10 | [REDACTED-IP] | [REDACTED-IP] | 3G→4G |
|
|
|
|
| 2026-08-10 | [REDACTED-IP] | [REDACTED-IP] | 4G disconnect only (unexpected — sticky IP failed this time) |
|
|
| 2026-08-10 | [REDACTED-IP] | [REDACTED-IP] | 4G→3G |
|
|
| 2026-08-10 | [REDACTED-IP] | (not tested) | 3G→4G (pending) |
|
|
|
|
All IPs are from Vodafone Ukraine's mobile pool (178.133.x.x and 178.150.x.x ranges for 3G/4G, 89.209.x.x for older 4G sessions).
|
|
|
|
## Rate-limit bypass
|
|
|
|
**Tokenharbor signup rate-limits by IP subnet.** After ~4-5 signup attempts on a 4G IP, tokenharbor returns `"Too many sign-ups from this network"`. The 178.x.x.x 4G subnet appears to share a rate-limit counter. **Switching to 3G gives a different pool that bypasses the limit.** Confirmed: 4G `[REDACTED-IP]` → rate-limited, 3G `[REDACTED-IP]` → signup succeeded. The 3G pool has a separate (or no) rate-limit counter. |