diff --git a/.gitignore b/.gitignore index b9f5f15..bdce672 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ xcuserdata/ # testing the app's "choose backup folder" feature with this directory selected. /Backups/ *.rsc +__pycache__/ diff --git a/Manual.en.md b/Manual.en.md new file mode 100644 index 0000000..a1f98ae --- /dev/null +++ b/Manual.en.md @@ -0,0 +1,1172 @@ +# RouterOS Assistant — User Manual + +This manual covers only features that have been **live-tested and +confirmed against real MikroTik hardware** (milestones marked ✅ in +`README.md`). Features not yet fully verified (e.g. parts of WLAN setup, +the newer wifiwave2 driver) are marked as such here, or documented in +`HANDOFF.md`. + +**Note on illustrations:** this manual is maintained by an AI assistant +with no access to screen/UI automation for native macOS apps — real +screenshots of the app can't be produced. Mermaid diagrams (pre-rendered +as images under `Manual-assets/`, also readable as Mermaid source from +the same file) are used for visualization instead. Anyone wanting to add +real screenshots: drop images under `Manual-assets/` and embed them with +`![description](Manual-assets/filename.png)`. + +All field names, help texts and warnings in Chapter 5 (Expert) are +**taken verbatim from the app's source code** (`RouterOSSchemaCatalog.swift`, +extracted automatically) — not paraphrased, so they match exactly what +the app actually shows. + +--- + +## Table of Contents + +0. [Overview & Architecture](#0-overview--architecture) +1. [Connect](#1-connect) +2. [Setup (Wizard)](#2-setup-wizard) +3. [Topology](#3-topology) +4. [LAN Scanner](#4-lan-scanner) +5. [Expert](#5-expert) +6. [Backups](#6-backups) +7. [Settings](#7-settings) + +--- + +## 0. Overview & Architecture + +RouterOS Assistant is a native macOS app (SwiftUI) that sets up and +manages MikroTik RouterOS routers through a guided wizard and six tabs: +**Connect**, **Setup**, **Topology**, **LAN Scanner**, **Expert**, +**Backups**. + +The app talks to the router over two transport paths: + +- **REST API** (`/rest/...`, HTTPS) — preferred, since RouterOS 7.1. +- **SSH** — fallback, and mandatory for features only available via the + command line (automatic backup before changes, firmware update, + software update check). + +The app decides which path to use automatically — no configuration +needed. + +![Architecture overview](Manual-assets/architecture.png) + +A DE/EN toggle button (flag icon) in the toolbar switches the app's +language (persists across restarts). All six tabs are fully translated +(static UI text, buttons, tooltips). Values that come directly from the +router (error messages, CLI command lines, live logs) stay untranslated. + +--- + + +## 1. Connect + +### Connecting + +| Field | Help text (verbatim from the app) | +|---|---| +| Host | "Your router's address on the network. MikroTik's factory default is usually 192.168.88.1." | +| Username | "Your router's admin username. The factory default is usually 'admin'." | +| Password | "The password for this user. Often empty on an unmodified factory setup." | +| Remember password | "Stores the password encrypted in the macOS Keychain, so you don't have to type it in every time." | + +An eye icon next to the password field reveals the input for checking. + +### Trust Verification (Trust-on-First-Use) + +The first time you connect to a router, the app shows a dialog — "The +router presented an unknown certificate" (REST) or "...an unknown SSH +key" (SSH) — to confirm once via "Trust and connect" (or "Cancel"). This +protects against a swapped/spoofed device answering at the same IP +address. + +On a REST connection, **both** dialogs can appear in sequence: the app +also checks the SSH host key once in the background, because backup, +update check, and firmware update always need SSH — regardless of which +transport is used for actual configuration. + +![Connect and trust flow](Manual-assets/connect_trust.png) + +### After Connecting + +- Detail page with complete Routerboard info (model, revision, serial + number, firmware type/version). +- **Software update check**: "Checks with MikroTik whether a newer + RouterOS version is available. Needs internet access on the router." + "Check now" / "Install update" buttons. +- **Firmware update**: updates the Routerboard bootloader firmware + separately. "Needed for the newly written firmware to become active — + doesn't happen automatically" → "Reboot now" button. +- Quick-backup button right in the tab: "Backs up the current router + configuration — useful right after connecting, before you change + anything in the Setup tab." +- "Disconnect": "Ends the connection to the router. Credentials are kept + (if remembered)." + +### Known Routers + +After every successful connection, the app remembers host, username, +and (if reported by the router) serial number. Two different routers +sharing the same host+username (e.g. both still on MikroTik's factory +address `192.168.88.1`/`admin`) therefore stay separate entries, +recognizable by the "SN: …" line; the remembered password is stored per +device, separately, in the macOS Keychain. The display name defaults to +the hardware name the first time (e.g. "hEX"), but can be changed anytime +via "Edit" — which also has a free-text location field (e.g. "Basement, +server rack") to tell multiple routers apart. Clicking an entry fills +host/username/password into the form without connecting immediately. The +list scrolls in place past about 4 entries. + +### Live Traffic Indicator + +The dot in front of each interface in the device overview is gray (no +link), green (link, but no traffic), or pulsing green (actively +transferring data right now). + +--- + +## 2. Setup (Wizard) + +A guided step-by-step assistant for basic configuration. A mode switch +at the start chooses between: + +- **Simple**: "Basic setup: internet connection (WAN), one home network + (LAN) with DHCP, Wi-Fi, and a permanently enabled basic firewall. No + VLANs, no multiple separate networks, no network isolation — can be + added later anytime via Expert mode." +- **Expert**: "Full access: multiple LAN interfaces each with its own + DHCP server, VLANs, network isolation between networks, and every + firewall option." + +![Wizard step sequence](Manual-assets/wizard_flow.png) + + +### WAN (Internet Connection) + +| Field | Help text | +|---|---| +| Port | "The network port your router uses to connect to the internet (e.g. the cable to your modem or wall socket)." | +| Connection type | "How the router logs in with your internet provider. 'Automatic (DHCP)' fits most cable/fiber connections." | +| Automatic (DHCP) | "The router gets its internet address automatically from your provider. The right choice for most cable/fiber connections." | +| Static IP address | "The fixed IP address your provider assigned you, including the subnet mask (the number after the /, e.g. /24)." | +| Gateway | "The address of the next device towards the internet — usually found in your provider's documentation." | +| PPPoE username | "Credentials from your internet provider for dial-in (e.g. for DSL connections)." | +| PPPoE password | "The password that belongs to the username, from your internet provider." | + + +### LAN (One or More Networks) + +| Field | Help text | +|---|---| +| Port | "The internal network port your devices connect to (your local network, LAN)." | +| Router address | "The address at which the router itself is reachable on this network." | +| Network range | "The complete address range of this network (e.g. /24 allows up to 254 devices)." | +| DHCP from | "The address from which the router automatically assigns addresses to devices on this network." | +| DHCP to | "The address up to which the router automatically assigns addresses to devices on this network." | +| Lease time | "How long a device keeps its assigned address before it must be renewed." | +| DNS server | "Which server translates internet addresses into names for devices on this network (e.g. www.google.com). Usually the router itself." | +| Network isolation | "Prevents traffic between this and all other configured LAN/VLAN networks. Internet access is preserved. Implemented in the Firewall step." | + +In Expert mode, multiple physical ports/interfaces can be set up as +separate networks (the "Add another LAN network" button), each with its +own address range and optional network isolation. Address fields start +empty — the field itself shows an example format that disappears while +typing. + +**Port conflict check**: if the user picks a port that's already +configured differently, a warning appears with the reason and a "Free up +this port now…" option — "Pick a different, free port above — or free +this one up now. Its existing configuration will be removed." This isn't +actually carried out until "Apply now" at the end of the wizard — until +then it can be undone by picking a different port above. + + +### VLAN (Optional) + +"A VLAN is an additional network with its own address range — e.g. for +guests or smart devices. Whether it's isolated from the main network is +set below, per network, via 'Isolate from other networks'. If you're not +sure whether you need this, just skip this step." + +| Field | Help text | +|---|---| +| Name | "A name for your own reference, e.g. 'Guests' or 'Smart Home'." | +| VLAN ID | "A unique number to technically distinguish this network. Only needs to be unique within your router." | +| Base port | "The physical port this additional network is built on." | +| Router address | "The router's address within this additional network." | +| Network range | "The complete address range of this additional network." | +| DHCP from/to | "The address range from/to which devices on this network automatically get an address." | + + +### Wi-Fi (Only If Detected) + +"No Wi-Fi was detected on this device. This step will be skipped." — +otherwise: "Turns on Wi-Fi on this radio and sets the network name and +password." + +| Field | Help text | +|---|---| +| Network name (SSID) | "The name devices see in their Wi-Fi list and use to connect." | +| Password | "The Wi-Fi password (WPA2). Must be at least 8 characters long." | + + +### Basic Firewall Protection + +"Protects your router and your devices from unsolicited access from the +internet, and lets your devices access the internet (NAT)." Always +active in Simple mode; selectable in Expert mode: "Sets up standard +protection: internet sharing (NAT) for your home network, and blocks +unsolicited access from the internet to your router and your devices. +Existing, self-configured rules are kept — the new rules are placed +first." + +If the router already has its own firewall rules, the app additionally +warns: "Your router already has its own firewall rules. The new rules +will be placed first, existing ones are kept — still check the order +afterwards, e.g. via Winbox or '/ip firewall filter print'." + + +### Review / Apply + +"A backup of the current configuration is created automatically before +applying (Backups tab). There's no guaranteed automatic rollback on a +connection loss — if there's a problem, use the backup in the Backups +tab, or restore the router locally (Ethernet/console)." Every single +command is shown before it runs. + +The wizard can be run again on an already-configured router (e.g. to add +another network) — existing settings aren't duplicated or damaged in the +process. "Cancel" is available anytime via the button top right (in both +Simple and Expert mode): "All values entered in this wizard will be +lost" — a confirmation dialog, resets the wizard to the first step. + +--- + + +## 3. Topology + +A graphical diagram of the router's complete current state — five +columns, with real connection lines (no guessing, derived from actual +RouterOS reference fields): + +| Column | RouterOS area | +|---|---| +| Interfaces | Physical ports, bridges, VLANs, WireGuard, … | +| IP Addresses | Assignments from `/ip address` | +| Pools & DHCP | Address pools, DHCP servers/networks/clients | +| Routes | `/ip route` | +| Firewall & NAT | Filter/NAT rules, address lists | + +Not shown in the diagram (but reachable via the Expert tab): VPN: PPP +users/profiles, Wi-Fi security profiles, Queues/bandwidth control, System +(name/clock/scheduler/scripts/user accounts), Tools (Netwatch/email), +Firewall: Mangle and Raw rules. + +### Connection Types (Line Colors) + +| Type | Meaning (verbatim from the app) | +|---|---| +| VLAN → base interface | "The VLAN interface builds on the base interface — it's its own network, separated by VLAN tag, on the same physical port." | +| Bridge port | "This physical port is a member of this bridge — devices on this port behave as if they were on the same cable as every other bridge port." | +| WireGuard peer | "This WireGuard VPN tunnel runs over this interface." | +| Interface → IP address | "This IP address is assigned to this interface." | +| DHCP / Pool | "This DHCP component (server, pool, or network options) belongs to this interface or address." | +| Route → interface | "This route goes via this interface or gateway." | +| Firewall/NAT → interface | "This firewall or NAT rule refers to this interface (as input or output)." | +| Address list → rule | "This rule checks whether an address is on this address list." | + +### Interaction + +- **Hovering** a node highlights its connections; **clicking** makes the + highlight permanent and simultaneously opens **Focus Mode**. +- **Clicking a connection line** shows an understandable explanation on + the right of what that connection means, plus a jump to both connected + elements. +- Zoom buttons (−/100%/+) for the diagram size; cards can be freely + dragged (connection lines follow live), "Reset" in the toolbar restores + the original column arrangement. +- Connection lines animate in flow direction ("from → to"). +- Refreshes automatically whenever you switch to the tab. + +### Focus Mode + +Clicking a node opens a floating popup with the **complete connected +chain** (every directly and indirectly connected element, the transitive +closure) in the same column layout as above, neatly re-arranged; +everything else in the main diagram dims. Close it via the X button at +the top of the popup, by clicking the empty area next to it, or by +clicking the same node again. Since this is a non-modal overlay (not a +system sheet), the right-hand sidebar stays usable while it's open — a +node from the chain can be edited directly from the popup via "Edit". +The popup's size adapts automatically to its content, with no +scrollbars. + +![Focus mode: states](Manual-assets/focus_mode.png) + +### Direct Editing + +IP addresses, pools, DHCP servers/networks/clients, routes, firewall +filter/NAT rules, WireGuard peers, and interfaces (Ethernet, bridge, +Wi-Fi, VLAN, WireGuard) can be clicked and changed directly via "Edit" — +writes straight back to the router. Address-list nodes aren't directly +editable here yet, only via the Expert tab, since one node there combines +several entries. Dynamic/automatically created routes (e.g. a network's +own connected route) deliberately show no Edit button, since RouterOS +manages those entries itself. + +--- + + +## 4. LAN Scanner + +Shows every device on the network (from DHCP leases and the ARP table), +grouped by physical port. "Rescan" re-queries leases/ARP/bridge host +table. Each port header additionally shows the current live throughput in +MB/s (↓/↑, green icon while traffic is active, gray while idle, polled +every 0.1s) with a small line chart of the last 30 seconds. Columns: +name, IP address, MAC address, status. + +Every action for a device lives in the "Actions" button (•••) behind its +row: + +- On a dynamic address → **"Assign static IP"** (makes the current + address permanent, RouterOS' "Make Static"). To undo: "Actions" → + "Remove static assignment" — the device then needs to briefly + disconnect/reconnect to automatically get a dynamic address again. + Without a DHCP lease, the option is grayed out: "No DHCP lease — static + assignment not possible here". +- On a static address → **"Remove static assignment"**. +- **Network tools** (in the same menu): + - **Ping** / **Traceroute** — "Run from the router (its own SSH + connection) — tests reachability from the router to this device, not + from this Mac." + - **DNS lookup (nslookup)** — only available if a hostname is known. + - **Port scan** — "TCP connection attempt on common ports, run from + this Mac (not from the router) — red = open, green = closed (device + responds, but nothing is listening there), gray = no response + (firewall, device off, or port filtered)." + - **Show raw data** — "Every field RouterOS returned for this entry — + helpful if status/port look wrong here." + +All three result popups (raw data, network test, port scan) share the +same layout: a fixed header with title + X button to close, with +scrollable content below — the same structure as the Topology tab's +focus popup and the Expert edit form (see Chapters 3 and 5). + +--- + + +## 5. Expert + +Direct, curated access to most RouterOS areas. Every field has a help +text with a format example. Categories are collapsible (default: +collapsed) — click the larger, colored heading to expand/collapse. + +**Custom menu path**: every RouterOS menu path is reachable, even without +a curated form — fields then appear generically as key/value pairs. Even +for curated menus, any additional field RouterOS returns that isn't +curated automatically lands in the "Additional Parameters (free-form)" +area — nothing RouterOS supports is unreachable this way, even if it +doesn't (yet) have its own form field. + +Before every change: a confirmation dialog with the exact command that +will run. Automatic backup once per connection session, before the first +change. + +The edit form itself has the same fixed header (title + X button, stays +visible while scrolling) as the Topology tab's focus popup and the LAN +Scanner's result popups — one consistent close behavior across the whole +app. + +The reference below is **extracted automatically from +`RouterOSSchemaCatalog.swift`** — field name, RouterOS parameter name, +field type, required status, default, and help text match exactly what +the app shows. "Reference to an existing entry" means: the app loads the +existing names from the referenced menu live when opened, and shows them +as a picker. "Picker from the router's live interface list" loads the +interfaces currently present on the router when opened. + + + +### System + + +#### Router Name *(settings menu — exactly one entry, no add/remove)* +RouterOS menu: `/system identity` · REST path: `system/identity` + +Der Name, unter dem sich der Router meldet (z.B. in Winbox/Terminal-Prompt). + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Name | `name` | Text | Yes | — | Your choice, e.g. MyRouter. | + + +#### Time/Time Zone *(settings menu — exactly one entry, no add/remove)* +RouterOS menu: `/system clock` · REST path: `system/clock` + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Time Zone | `time-zone-name` | Text | No | — | E.g. Europe/Berlin. | + + +#### Mode Button *(settings menu — exactly one entry, no add/remove)* +RouterOS menu: `/system routerboard mode-button` · REST path: `system/routerboard/mode-button` + +Controls which script runs when the router's physical Mode button is pressed. + +Some RouterBOARD devices (e.g. hEX, cAP, hAP ac², LtAP mini, some CCR/CRS) have a physical Mode button on the side. This controls whether, and for how long, it must be held down to run a script previously created under "Scripts". + +> ⚠️ **Warning:** Starting with RouterOS 7.1rc4, enabling or changing this setting also requires a physical button press (Reset or Mode button) on the device itself within 60 seconds to confirm — a change through this app alone isn't enough. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Enabled | `enabled` | Yes/No | No | `no` | Turn the Mode button on/off. | +| Script to Run | `on-event` | Reference to an existing entry under `/system script` | No | — | Name of a script previously created under "Scripts". | +| Hold Time (Min..Max) | `hold-time` | Text | No | — | How long the button must be held down, as a Min..Max time range, e.g. "3s..5s". Available from RouterOS 6.47beta60 onward. | + + +#### Time Server (NTP) *(settings menu — exactly one entry, no add/remove)* +RouterOS menu: `/system ntp client` · REST path: `system/ntp/client` + +Hält die Router-Uhr über einen Zeitserver synchron. + +Die Server-Liste selbst liegt in einem eigenen Menü ("NTP-Zeitserver-Liste") — hier nur Ein/Aus und Modus. + +> ⚠️ **Warning:** Wrong system time can mess up certificate checks (HTTPS/REST) and log timestamps. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Enabled | `enabled` | Yes/No | No | `yes` | Turn time synchronization on/off. | +| Mode | `mode` | Fixed choice: `unicast`, `broadcast`, `multicast`, `manycast` | No | `unicast` | Fast immer "unicast" (direkte Anfrage an feste Server). | + + +#### NTP-Zeitserver-Liste +RouterOS menu: `/system ntp client servers` · REST path: `system/ntp/client/servers` + +Die Zeitserver, die der Client abfragt. + +"servers" ist bei RouterOS 7.x kein Feld am NTP-Client selbst, sondern eine eigene Liste — jeder Server ist ein eigener Eintrag hier (statt kommagetrennt in einem Textfeld). + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Address | `address` | Text | Yes | — | Hostname oder IP eines Zeitservers, z.B. pool.ntp.org. | +| Disabled | `disabled` | Yes/No | No | `no` | Diesen Server deaktivieren, ohne ihn zu löschen. | +| Comment | `comment` | Text | No | — | For your own reference only. | + + +#### Scheduler +RouterOS menu: `/system scheduler` · REST path: `system/scheduler` + +Runs a stored script at fixed times/intervals. + +> ⚠️ **Warning:** A faulty scheduled script can make repeated unattended changes — test it manually once before scheduling it. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Name | `name` | Text | Yes | — | Your choice, e.g. daily-reboot. | +| Start Time | `start-time` | Text | No | — | E.g. 00:00:00 or "startup". | +| Interval | `interval` | Time duration (days/hrs/min/sec, via stepper) | No | — | How often it repeats. Leave everything at 0 = only once, at the start time. | +| Script to Run | `on-event` | Reference to an existing entry under `/system script` | No | — | Name of a script previously created under "Scripts". | +| Disabled | `disabled` | Yes/No | No | `no` | Turn the schedule off without deleting it. | + + +#### Scripts +RouterOS menu: `/system script` · REST path: `system/script` + +Stored RouterOS command sequences, run manually or via the scheduler. + +> ⚠️ **Warning:** Scripts run with the router's own privileges — no different from commands typed in manually. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Name | `name` | Text | Yes | — | Your choice, e.g. daily-backup. | +| Script Content | `source` | Text | No | — | RouterOS commands, e.g. ":log info \"Test\"". | + + +#### User Accounts +RouterOS menu: `/user` · REST path: `user` + +Access accounts for the router (Winbox/SSH/REST/terminal). + +> ⚠️ **Warning:** Don't accidentally delete or downgrade the account you're currently connected with. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Username | `name` | Text | Yes | — | Your choice, e.g. admin2. | +| Password | `password` | Text | No | — | Choose something sufficiently long and random. | +| Permission Group | `group` | Fixed choice: `full`, `write`, `read` | No | `full` | full = full access, write = without user management, read = read-only. | +| Disabled | `disabled` | Yes/No | No | `no` | Turn the account off without deleting it. | + + +#### Logging +RouterOS menu: `/system logging` · REST path: `system/logging` + +What the router logs and where to (memory, file, remote syslog, email). + +Made up of "rules" (what is logged) and "actions" (where to) — this is generic access; related parts via "Custom Menu Path" (e.g. "/system logging action"). + +*No curated form yet — every field appears as a free-form key/value pair (see "Custom Menu Path").* + + +### Interfaces (bridge, VLAN, VPN tunnel...) + + +#### All Interfaces (generic) +RouterOS menu: `/interface` · REST path: `interface` + +Gemeinsame Felder, die für jedes Interface gelten, unabhängig vom Typ (Ethernet, Bridge, WLAN, WireGuard, VLAN, ...). + +RouterOS lists every interface here together. Type-specific fields (e.g. a VLAN interface's VLAN ID) live in their own menus (e.g. "VLAN Interfaces") — this only covers what works the same for every interface type. + +> ⚠️ **Warning:** RouterOS also reports a "default-name" here (the port's factory name) — it shows up below under "Additional Parameters", but can't be changed ("bad parameter default-name", confirmed live). To rename, only use the "Name" field above. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Name | `name` | Text | Yes | — | This interface's current name, e.g. ether5 or vlan20 — not to be confused with "default-name" (the factory name, further below under "Additional Parameters", not changeable). | +| Comment | `comment` | Text | No | — | For your own reference only, no technical effect. | +| Disabled | `disabled` | Yes/No | No | `no` | Turn the interface off without deleting it. | + + +#### Bridge +RouterOS menu: `/interface bridge` · REST path: `interface/bridge` + +Fasst mehrere physische Ports zu einem gemeinsamen Layer-2-Netzwerk zusammen. + +Devices on bridged ports behave as if they hung off the same network cable. An IP address usually goes on the bridge itself, not on the individual ports. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Name | `name` | Text | Yes | — | Your choice, e.g. bridge-lan. | +| VLAN Filtering (802.1Q) | `vlan-filtering` | Yes/No | No | `no` | Enables real VLAN separation across this bridge — needed when several VLANs share the same bridge ports. | +| Disabled | `disabled` | Yes/No | No | `no` | Turn the bridge off without deleting it. | + + +#### Bridge Ports +RouterOS menu: `/interface bridge port` · REST path: `interface/bridge/port` + +Ordnet einen physischen Port einer Bridge zu. + +Only after this is the port part of the bridge network. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Bridge | `bridge` | Text | Yes | — | The bridge's name, e.g. bridge-lan. | +| Physical Port | `interface` | Picker from the router's live interface list | Yes | — | The port being added to the bridge, e.g. ether2. | +| Port VLAN ID (PVID) | `pvid` | Number | No | — | Only relevant with VLAN filtering enabled: the VLAN that untagged incoming traffic on this port is assigned to, e.g. 20. | + + +#### VLAN Interfaces +RouterOS menu: `/interface vlan` · REST path: `interface/vlan` + +Virtuelle, getaggte Sub-Interfaces auf einem physischen Port oder einer Bridge. + +Its own logical network on the same cable, distinguished by a VLAN tag in the Ethernet frame. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Name | `name` | Text | Yes | — | Your choice, e.g. vlan20-guests. | +| VLAN ID | `vlan-id` | Number | Yes | — | Unique identifier, 2–4094, e.g. 20. | +| Base Interface | `interface` | Picker from the router's live interface list | Yes | — | The physical port or bridge this VLAN sits on top of, e.g. bridge. | +| Disabled | `disabled` | Yes/No | No | `no` | Turn the VLAN interface off without deleting it. | + + +#### WireGuard Interfaces +RouterOS menu: `/interface wireguard` · REST path: `interface/wireguard` + +Moderner, schlanker VPN-Tunnel-Typ. + +A WireGuard interface alone doesn't establish a connection yet — that needs peers (see "WireGuard Peers") with a public key and allowed addresses. + +> ⚠️ **Warning:** Create the interface here first (with a listen port), then add the peers under WireGuard Peers. The private key is generated automatically on creation if not specified. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Name | `name` | Text | Yes | — | Your choice, e.g. wg-home. | +| Listen Port (UDP) | `listen-port` | Number | No | `51820` | The port this tunnel listens for incoming connections on, e.g. 51820. | +| Private Key | `private-key` | Text | No | — | Keep secret. Leave empty to have RouterOS generate one automatically. | +| Disabled | `disabled` | Yes/No | No | `no` | Turn the interface off without deleting it. | + + +#### WireGuard Peers +RouterOS menu: `/interface wireguard peers` · REST path: `interface/wireguard/peers` + +Gegenstellen (Clients/andere Router) eines WireGuard-Tunnels. + +Each peer needs its own public key and a statement of which addresses are routed through it. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| WireGuard Interface | `interface` | Reference to an existing entry under `/interface wireguard` | Yes | — | Name of the previously created WireGuard interface. | +| Peer's Public Key | `public-key` | Text | Yes | — | Copy from the peer's device (e.g. via "wg show public-key"). | +| Allowed Addresses | `allowed-address` | Text | No | — | Which IP addresses/networks are allowed to go through this peer, with prefix, e.g. 10.10.10.2/32. | +| Peer's Fixed Address | `endpoint-address` | Text | No | — | Only needed when this peer itself must be reachable (site-to-site), e.g. a fixed public IP or a DNS name. Leave empty for roadwarrior clients that connect in on their own. | +| Peer's Port | `endpoint-port` | Text | No | — | Usually the same as the peer's listen port, e.g. 51820. | +| Keepalive | `persistent-keepalive` | Time duration (days/hrs/min/sec, via stepper) | No | — | Keeps the connection alive through NAT/firewalls. Important for clients behind NAT. | + + +#### PPPoE Client +RouterOS menu: `/interface pppoe-client` · REST path: `interface/pppoe-client` + +DSL-Einwahl-Client, meist auf dem WAN-Port. + +Replaces a static/DHCP WAN address with a PPPoE dial-in to the provider. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Name | `name` | Text | Yes | — | Your choice, e.g. pppoe-wan. | +| Physical Port | `interface` | Picker from the router's live interface list | Yes | — | The port the dial-in runs over, usually the WAN port, e.g. ether1. | +| Username | `user` | Text | Yes | — | Credentials from the provider. | +| Password | `password` | Text | Yes | — | Credentials from the provider. | +| Disabled | `disabled` | Yes/No | No | `no` | Turn the dial-in off without deleting it. | + + +#### Bonding +RouterOS menu: `/interface bonding` · REST path: `interface/bonding` + +Bündelt mehrere physische Ports zu einer logischen, ausfalltoleranten/schnelleren Verbindung. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Name | `name` | Text | Yes | — | Your choice, e.g. bond1. | +| Bundled Ports | `slaves` | Text | No | — | Comma-separated list of physical ports, e.g. ether2,ether3. | +| Mode | `mode` | Fixed choice: `802.3ad`, `active-backup`, `balance-rr`, `balance-xor`, `broadcast` | No | — | 802.3ad (LACP) needs a compatible, correspondingly configured switch. | + + +### IP Addressing & Services + + +#### IP Addresses +RouterOS menu: `/ip address` · REST path: `ip/address` + +Weist Interfaces IP-Adressen zu. + +Each IP address is attached to exactly one interface (physical port, bridge, or VLAN). + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Address | `address` | Text | Yes | — | IP address with subnet mask as prefix (the router's address on this network), e.g. 192.168.88.1/24 or 10.10.10.1/24. The /24 determines how many devices fit on this network (/24 = up to 254). | +| Interface | `interface` | Picker from the router's live interface list | Yes | — | The interface this address is assigned to, e.g. bridge or ether4. | +| Disabled | `disabled` | Yes/No | No | `no` | Turn the address off without deleting it. | + + +#### Address Pools +RouterOS menu: `/ip pool` · REST path: `ip/pool` + +Adressbereiche, aus denen DHCP-Server oder PPP-Profile Adressen vergeben. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Name | `name` | Text | Yes | — | Your choice, e.g. dhcp_pool_lan. | +| Range(s) | `ranges` | Text | Yes | — | From-to address without a prefix, e.g. 192.168.88.10-192.168.88.254. Multiple ranges comma-separated. | + + +#### DHCP Server +RouterOS menu: `/ip dhcp-server` · REST path: `ip/dhcp-server` + +Vergibt automatisch IP-Adressen an Geräte in einem Netzwerk. + +The Setup wizard (LAN/VLAN step) already covers the usual cases — this is direct access for special cases. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Name | `name` | Text | Yes | — | Your choice, e.g. dhcp_lan. | +| Interface | `interface` | Picker from the router's live interface list | Yes | — | The network this server hands out addresses on, e.g. bridge. | +| Address Pool | `address-pool` | Reference to an existing entry under `/ip pool` | Yes | — | Name of a previously created address pool. | +| Lease Time | `lease-time` | Time duration (days/hrs/min/sec, via stepper) | No | — | How long a device keeps its address before it needs renewing, e.g. 1d or 12h. | +| Disabled | `disabled` | Yes/No | No | `no` | Turn the DHCP server off without deleting it. | + + +#### DHCP Networks +RouterOS menu: `/ip dhcp-server network` · REST path: `ip/dhcp-server/network` + +Gateway/DNS/Optionen, die ein DHCP-Server an seine Klienten verteilt. + +Kept separate from the DHCP server itself because the same network options can apply to several DHCP servers. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Network | `address` | Text | Yes | — | The following options apply to this network — the network address with prefix, e.g. 192.168.88.0/24. | +| Gateway | `gateway` | Text | Yes | — | Usually the router's address on this network, without a prefix, e.g. 192.168.88.1. | +| DNS Server | `dns-server` | Text | No | — | Usually the router itself, e.g. 192.168.88.1. Multiple servers can be comma-separated. | + + +#### DHCP Client (WAN) +RouterOS menu: `/ip dhcp-client` · REST path: `ip/dhcp-client` + +Automatically obtains an IP address from the internet provider. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Interface | `interface` | Picker from the router's live interface list | Yes | — | Usually the WAN port, e.g. ether1. | +| Adopt Default Route | `add-default-route` | Yes/No | No | `yes` | Adopts the default internet route announced by the provider. | +| Adopt DNS Servers | `use-peer-dns` | Yes/No | No | `yes` | Adopts the DNS servers announced by the provider. | +| Disabled | `disabled` | Yes/No | No | `no` | Turn the DHCP client off without deleting it. | + + +#### DNS Settings *(settings menu — exactly one entry, no add/remove)* +RouterOS menu: `/ip dns` · REST path: `ip/dns` + +Name resolution for the router itself (and, optionally, as a DNS server for the LAN). + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| DNS Server | `servers` | Text | No | — | One or more servers, comma-separated, e.g. 1.1.1.1,8.8.8.8. | +| Allow as DNS Server for the LAN | `allow-remote-requests` | Yes/No | No | `no` | Lets devices on the LAN use the router itself as a DNS server. Without this, DNS requests from devices to the router fail even if they have it set as their DNS server. | + + +#### Management Services +RouterOS menu: `/ip service` · REST path: `ip/service` + +Schaltet Zugriffswege auf den Router (Winbox, API, SSH, WWW/REST, Telnet, FTP) an/aus und ändert deren Port. + +Every active service is a potential attack surface from whichever network can reach it — disable services you don't need. + +> ⚠️ **Warning:** Disabling or re-porting the access path you're currently using can cut your own connection immediately — be careful with www-ssl (this app's REST API) and ssh. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Service | `name` | Fixed choice: `www`, `www-ssl`, `ssh`, `api`, `api-ssl`, `winbox`, `ftp`, `telnet` | Yes | — | Which management service is being changed. | +| Port | `port` | Number | No | — | The port the service listens on, e.g. 22 for ssh. | +| Allowed From | `available-from` | Text | No | — | Optional: only reachable from this address/network, with prefix, e.g. 192.168.88.0/24. | +| Disabled | `disabled` | Yes/No | No | `no` | Turn the service off without deleting the entry. | + + +#### Hotspot +RouterOS menu: `/ip hotspot` · REST path: `ip/hotspot` + +Login portal for guest Wi-Fi/LAN with a redirect to a sign-in page. + +Made up of several related parts (server, server profile, user profile, users) — this is generic access to "/ip hotspot" itself; related parts via "Custom Menu Path" (e.g. "/ip hotspot user"). + +*No curated form yet — every field appears as a free-form key/value pair (see "Custom Menu Path").* + + +### Routing + + +#### Static Routes +RouterOS menu: `/ip route` · REST path: `ip/route` + +Feste, manuell eingetragene Wegewahl zu Netzen, die nicht direkt angeschlossen sind. + +For everything except "default internet via a WAN interface" (the DHCP client/PPPoE route already handles that automatically). + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Destination Network | `dst-address` | Text | Yes | — | Network with prefix, e.g. 10.0.0.0/24, or 0.0.0.0/0 for a default route. | +| Gateway | `gateway` | Text | Yes | — | Next hop — an IP address without a prefix (e.g. 192.168.88.254) or an interface name (e.g. ether1). | +| Distance | `distance` | Number | No | — | Priority when several routes match the same destination — a smaller number is preferred, e.g. 1. | +| Comment | `comment` | Text | No | — | For your own reference only. | +| Disabled | `disabled` | Yes/No | No | `no` | Turn the route off without deleting it. | + + +#### OSPF Instances +RouterOS menu: `/routing ospf instance` · REST path: `routing/ospf/instance` + +Dynamisches Innennetz-Routing-Protokoll — tauscht Routen automatisch mit anderen OSPF-Routern aus. + +Only relevant when several routers on the same network should learn routes on their own. + +> ⚠️ **Warning:** Misconfigured OSPF can overwrite routes to existing networks. Only use it with a network plan. + +*No curated form yet — every field appears as a free-form key/value pair (see "Custom Menu Path").* + + +#### BGP Connections +RouterOS menu: `/routing bgp connection` · REST path: `routing/bgp/connection` + +Routing-Protokoll für Verbindungen zwischen unabhängigen Netzen/Providern. + +Usually not needed for a home/small network — relevant with your own provider-independent address space (multihoming). + +*No curated form yet — every field appears as a free-form key/value pair (see "Custom Menu Path").* + + +### VPN Servers/Clients + + +#### PPP Users +RouterOS menu: `/ppp secret` · REST path: `ppp/secret` + +Zugangsdaten für PPPoE-/L2TP-/PPTP-/OpenVPN-Einwahl in den Router. + +Each user can optionally be assigned a profile that dictates IP pool/DNS/encryption. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Username | `name` | Text | Yes | — | Your choice, e.g. guest1. | +| Password | `password` | Text | Yes | — | Choose something sufficiently long and random. | +| Service | `service` | Fixed choice: `any`, `pppoe`, `l2tp`, `pptp`, `ovpn`, `sstp` | No | `any` | Which dial-in type this user applies to. | +| Profile | `profile` | Reference to an existing entry under `/ppp profile` | No | — | Name of a previously created PPP profile. | +| Local Address | `local-address` | Text | No | — | The router's IP address within this connection, without a prefix, e.g. 10.10.10.1. | +| Address for the Client | `remote-address` | Text | No | — | A fixed IP for this user (e.g. 10.10.10.2), or the name of an address pool. | +| Disabled | `disabled` | Yes/No | No | `no` | Turn the user off without deleting it. | + + +#### PPP Profiles +RouterOS menu: `/ppp profile` · REST path: `ppp/profile` + +Vorlagen (IP-Pool, DNS, Verschlüsselung) für PPP-Benutzer. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Name | `name` | Text | Yes | — | Your choice, e.g. vpn-clients. | +| Local Address | `local-address` | Text | No | — | The router's IP address, without a prefix, e.g. 10.10.10.1. | +| Address Pool for Clients | `remote-address` | Text | No | — | Name of a previously created address pool. | +| DNS Servers for Clients | `dns-server` | Text | No | — | One or more servers, comma-separated, e.g. 1.1.1.1,8.8.8.8. | + + +#### L2TP VPN Server +RouterOS menu: `/interface l2tp-server server` · REST path: `interface/l2tp-server/server` + +Accepts incoming L2TP VPN dial-ins. + +A single server-wide on/off switch with shared encryption settings — users themselves come from "PPP Users". + +*No curated form yet — every field appears as a free-form key/value pair (see "Custom Menu Path").* + + +#### OpenVPN Server +RouterOS menu: `/interface ovpn-server server` · REST path: `interface/ovpn-server/server` + +Accepts incoming OpenVPN dial-ins. + +Additionally needs a certificate ("/certificate") — users themselves come from "PPP Users". + +*No curated form yet — every field appears as a free-form key/value pair (see "Custom Menu Path").* + + +### Wi-Fi / CAPsMAN + + +#### Wi-Fi (Legacy Driver) +RouterOS menu: `/interface wireless` · REST path: `interface/wireless` + +WLAN-Interfaces auf älteren/Standard-Wireless-Chips. + +These interfaces already exist from the factory (one Wi-Fi chip = one interface) — they're only configured here, not newly created. A security profile (see "Wi-Fi Security Profiles") must be created first. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Network Name (SSID) | `ssid` | Text | Yes | — | The name Wi-Fi devices see in the network list, e.g. MyWiFi. | +| Security Profile | `security-profile` | Text | No | — | Name of a profile previously created under "Wi-Fi Security Profiles". | +| Mode | `mode` | Fixed choice: `ap-bridge`, `station`, `bridge` | No | `ap-bridge` | ap-bridge = access point (normal case), station = connect as a client to another AP. | +| Disabled | `disabled` | Yes/No | No | `no` | Turn the Wi-Fi interface off without deleting it. | + + +#### Wi-Fi Security Profiles +RouterOS menu: `/interface wireless security-profiles` · REST path: `interface/wireless/security-profiles` + +Encryption/password templates for Wi-Fi interfaces (legacy driver). + +A profile is created and then entered on a Wi-Fi interface as "security-profile". + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Name | `name` | Text | Yes | — | Your choice, e.g. homenet-wpa2. | +| Mode | `mode` | Fixed choice: `none`, `static-keys-required`, `dynamic-keys` | No | `dynamic-keys` | dynamic-keys is the usual WPA/WPA2 mode. | +| Authentication | `authentication-types` | Fixed choice: `wpa-psk`, `wpa2-psk`, `wpa-psk,wpa2-psk`, `wpa-eap`, `wpa2-eap` | No | — | wpa2-psk = WPA2 with a shared password (home network standard). | +| WPA2 Password | `wpa2-pre-shared-key` | Text | No | — | At least 8 characters. | + + +#### Wi-Fi (new wifiwave2/802.11ax driver) +RouterOS menu: `/interface wifi` · REST path: `interface/wifi` + +WLAN-Interfaces auf neueren Wireless-Chips. + +A different, nested configuration schema from the legacy driver (dot notation like "security.passphrase") — don't mix with "/interface wireless". Only present on devices with a correspondingly new Wi-Fi chip. + +> ⚠️ **Warning:** This app has never tested the .set path for the new driver against real hardware (see HANDOFF.md) — be sure to check after applying. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Network Name (SSID) | `ssid` | Text | Yes | — | The name Wi-Fi devices see in the network list, e.g. MyWiFi. | +| Authentication | `security.authentication-types` | Fixed choice: `wpa2-psk`, `wpa3-psk`, `wpa2-psk,wpa3-psk` | No | — | wpa2-psk,wpa3-psk covers both older and newer devices. | +| Password | `security.passphrase` | Text | No | — | At least 8 characters. | +| Target Bridge | `datapath.bridge` | Text | No | — | Name of the bridge this Wi-Fi network is assigned to (usually the same as the wired LAN), e.g. bridge. | +| Disabled | `disabled` | Yes/No | No | `no` | Turn the Wi-Fi interface off without deleting it. | + + +#### CAPsMAN Controller +RouterOS menu: `/caps-man manager` · REST path: `caps-man/manager` + +Central management of several Wi-Fi access points from one router. + +Only relevant with several Wi-Fi access points that should be managed centrally — its own extensive configuration schema (configurations/channels/datapaths). + +*No curated form yet — every field appears as a free-form key/value pair (see "Custom Menu Path").* + + +### Firewall: Filter Rules + + +#### Filter Rules +RouterOS menu: `/ip firewall filter` · REST path: `ip/firewall/filter` + +Decides whether packets are let through (accept), dropped (drop/reject), or checked further. + +input = access to the router itself, forward = traffic passing through the router (e.g. LAN↔internet or between two networks), output = traffic leaving the router. Rules are checked top to bottom; the first match decides. + +> ⚠️ **Warning:** Order matters. New rules land at the end of the list — an existing rule higher up can make a new rule unreachable. Check the position afterwards with "/ip firewall filter print", and use "move" if needed. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Chain | `chain` | Text | Yes | `forward` | input = to the router, forward = through the router, output = from the router. Custom chains (jump targets via "jump") are also possible. Example: forward | +| Action | `action` | Fixed choice: `accept`, `drop`, `reject`, `log`, `jump`, `return`, `add-src-to-address-list`, `add-dst-to-address-list`, `fasttrack-connection`, `passthrough` | Yes | `accept` | What happens to matching packets. reject also sends back an error message, drop discards silently. | +| Source Address | `src-address` | Text | No | — | Single IP or network with prefix, e.g. 192.168.88.5 or 192.168.88.0/24. Empty = any. | +| Destination Address | `dst-address` | Text | No | — | Single IP or network with prefix, e.g. 192.168.88.5 or 192.168.88.0/24. Empty = any. | +| Source in Address List | `src-address-list` | Reference to an existing entry under `/ip firewall address-list` | No | — | Only packets whose sender is in this previously created address list. | +| Destination in Address List | `dst-address-list` | Reference to an existing entry under `/ip firewall address-list` | No | — | Only packets whose destination is in this previously created address list. | +| Incoming Interface | `in-interface` | Picker from the router's live interface list | No | — | Only packets arriving on this interface, e.g. ether1 or bridge. | +| Outgoing Interface | `out-interface` | Picker from the router's live interface list | No | — | Only packets leaving via this interface, e.g. ether1 or bridge. | +| Protocol | `protocol` | Fixed choice: `tcp`, `udp`, `icmp`, `gre`, `ipsec-esp`, `ipsec-ah` | No | — | IP protocol. Empty = all. | +| Destination Port(s) | `dst-port` | Text | No | — | Only meaningful for tcp/udp. A single port (e.g. 80) or a range (e.g. 8000-8100). | +| Connection State | `connection-state` | Fixed choice: `new`, `established`, `related`, `invalid`, `untracked` | No | — | Status according to connection tracking. "established,related" is the usual "already-allowed connection" rule. | +| Layer 7 Protocol | `layer7-protocol` | Text | No | — | Name of a pattern previously created under "/ip firewall layer7-protocol" (e.g. detecting specific apps). Noticeably CPU-intensive, use with care. | +| Comment | `comment` | Text | No | — | For your own reference only, no technical effect. | +| Disabled | `disabled` | Yes/No | No | `no` | Turn the rule off without deleting it. | + + +### Firewall: NAT (port forwarding etc.) + + +#### NAT Rules +RouterOS menu: `/ip firewall nat` · REST path: `ip/firewall/nat` + +Translates addresses — internet sharing (srcnat/masquerade) and port forwarding (dstnat). + +srcnat changes the sender address of outgoing packets (e.g. private LAN IP → public WAN IP). dstnat changes the destination address of incoming packets (e.g. a request to the WAN IP on port 80 → redirected to an internal server at 192.168.88.10:80). + +> ⚠️ **Warning:** A dstnat rule (port forwarding) makes an internal device directly reachable from the internet — only set this up for services that should really be exposed, and don't block the corresponding port in the filter table afterwards. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Chain | `chain` | Fixed choice: `srcnat`, `dstnat` | Yes | `srcnat` | srcnat = change sender address (internet sharing). dstnat = change destination address (port forwarding). | +| Action | `action` | Fixed choice: `masquerade`, `src-nat`, `dst-nat`, `netmap`, `redirect`, `same` | Yes | `masquerade` | masquerade = automatic NAT via the current WAN IP (recommended for a changing IP). src-nat = fixed NAT address. dst-nat = rewrite the destination (port forwarding). redirect = redirect to the router itself. | +| Source Address | `src-address` | Text | No | — | Single IP or network with prefix, e.g. 192.168.88.0/24. Empty = any. | +| Destination Address | `dst-address` | Text | No | — | Single IP or network with prefix, e.g. 192.168.88.0/24. Empty = any. | +| Incoming Interface | `in-interface` | Picker from the router's live interface list | No | — | For dstnat, usually the WAN port (where the request from the internet comes in), e.g. ether1. | +| Outgoing Interface | `out-interface` | Picker from the router's live interface list | No | — | For srcnat/masquerade, usually the WAN port, e.g. ether1. | +| Protocol | `protocol` | Fixed choice: `tcp`, `udp`, `icmp` | No | — | Needed so ports can be checked. | +| Request's Destination Port | `dst-port` | Text | No | — | The port the request from outside arrives on, e.g. 8080. | +| Forward to (Internal IP) | `to-addresses` | Text | No | — | Only for dst-nat: the internal IP address to forward to, e.g. 192.168.88.10. | +| Forward to (Internal Port) | `to-ports` | Text | No | — | Only for dst-nat: internal port, if different from the destination port (e.g. external 8080 → internal 80). | +| Comment | `comment` | Text | No | — | For reference only. | +| Disabled | `disabled` | Yes/No | No | `no` | Turn the rule off without deleting it. | + + +### Firewall: Mangle (marking/QoS prep) + + +#### Mangle Rules +RouterOS menu: `/ip firewall mangle` · REST path: `ip/firewall/mangle` + +Marks connections/packets for later processing (e.g. by queues). + +Mangle itself doesn't change how a packet is treated — it just sticks a mark on it. Only another rule (typically a queue or a routing rule) that checks for exactly this mark actually acts on it. + +> ⚠️ **Warning:** A mark with nothing evaluating it (e.g. no matching queue) has no visible effect at all — this is the most common source of confusion with Mangle. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Chain | `chain` | Fixed choice: `prerouting`, `input`, `forward`, `output`, `postrouting` | Yes | `forward` | Processing point in the router's internal packet flow. | +| Action | `action` | Fixed choice: `mark-connection`, `mark-packet`, `mark-routing`, `change-mss`, `change-ttl`, `set-priority`, `accept`, `passthrough` | Yes | `mark-connection` | mark-connection marks the whole connection (affects all its packets), mark-packet marks only individual packets. | +| Connection Mark Name | `new-connection-mark` | Text | No | — | A name of your choosing that, e.g., a queue later recognizes. | +| Packet Mark Name | `new-packet-mark` | Text | No | — | A name of your choosing for the packet mark. | +| Still Check Further Mangle Rules | `passthrough` | Yes/No | No | `yes` | Yes (default) lets subsequent Mangle rules also check this connection. | +| Source Address | `src-address` | Text | No | — | Single IP or network with prefix, e.g. 192.168.88.0/24. Empty = any. | +| Destination Address | `dst-address` | Text | No | — | Single IP or network with prefix, e.g. 192.168.88.0/24. Empty = any. | +| Incoming Interface | `in-interface` | Picker from the router's live interface list | No | — | Only packets arriving on this interface, e.g. ether1 or bridge. | +| Outgoing Interface | `out-interface` | Picker from the router's live interface list | No | — | Only packets leaving via this interface, e.g. ether1 or bridge. | +| Protocol | `protocol` | Fixed choice: `tcp`, `udp`, `icmp` | No | — | IP protocol. Empty = all. | +| Destination Port(s) | `dst-port` | Text | No | — | Only meaningful for tcp/udp. A single port (e.g. 80) or a range (e.g. 8000-8100). | +| Comment | `comment` | Text | No | — | For reference only. | +| Disabled | `disabled` | Yes/No | No | `no` | Turn the rule off without deleting it. | + + +### Firewall: Raw (before connection tracking) + + +#### Raw Rules +RouterOS menu: `/ip firewall raw` · REST path: `ip/firewall/raw` + +Runs before any connection-tracking processing — mostly for load relief or coarse DDoS filtering. + +Rules here apply before RouterOS even "knows" about a connection (connection tracking). This lets you, e.g., very cheaply drop known-uninteresting traffic, or deliberately exempt it from tracking (notrack). + +> ⚠️ **Warning:** notrack removes the affected traffic from connection tracking — after that, no filter/NAT rules relying on connection-state or NAT apply to it anymore. Use only deliberately. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Chain | `chain` | Fixed choice: `prerouting`, `output` | Yes | `prerouting` | prerouting = incoming packets, before the router processes them. output = packets generated by the router itself. | +| Action | `action` | Fixed choice: `accept`, `drop`, `notrack` | Yes | `accept` | notrack = exempt from connection tracking (see warning above). | +| Source Address | `src-address` | Text | No | — | Single IP or network with prefix, e.g. 192.168.88.0/24. Empty = any. | +| Destination Address | `dst-address` | Text | No | — | Single IP or network with prefix, e.g. 192.168.88.0/24. Empty = any. | +| Incoming Interface | `in-interface` | Picker from the router's live interface list | No | — | Nur Pakete, die über dieses Interface hereinkommen, z.B. ether1. | +| Protocol | `protocol` | Fixed choice: `tcp`, `udp`, `icmp` | No | — | IP protocol. Empty = all. | +| Destination Port(s) | `dst-port` | Text | No | — | Only meaningful for tcp/udp. A single port (e.g. 80) or a range (e.g. 8000-8100). | +| Comment | `comment` | Text | No | — | For your own reference only. | +| Disabled | `disabled` | Yes/No | No | `no` | Turn the rule off without deleting it. | + + +### Firewall: Address Lists + + +#### Address Lists +RouterOS menu: `/ip firewall address-list` · REST path: `ip/firewall/address-list` + +Named groups of IP addresses/networks that filter/NAT/Mangle rules can reference as a condition. + +Instead of listing individual IPs in every rule, create a named list here (e.g. "blocked" or "trusted") and reference it in filter/NAT/Mangle rules via "src-address-list"/"dst-address-list". Entries can be permanent or have an expiry (timeout). + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| List Name | `list` | Text | Yes | — | A name of your choosing, referenced in other rules, e.g. blocked. | +| Address | `address` | Text | Yes | — | Single IP or network with prefix, e.g. 192.168.88.5 or 10.0.0.0/24. | +| Expiry | `timeout` | Time duration (days/hrs/min/sec, via stepper) | No | — | Optional. The entry is removed automatically after this time. Leave everything at 0 = stays permanently until removed manually. | +| Comment | `comment` | Text | No | — | For your own reference only. | + + +### Queues / Bandwidth Control + + +#### Simple Bandwidth Limit +RouterOS menu: `/queue simple` · REST path: `queue/simple` + +Begrenzt Up-/Download einer IP-Adresse oder eines Netzes. + +Sufficient for most home/small-network cases without Mangle marks. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Name | `name` | Text | Yes | — | Your choice, e.g. limit-guest. | +| Target | `target` | Text | Yes | — | IP address or network being limited, with prefix, e.g. 192.168.88.50/32. | +| Max Bandwidth (Upload/Download) | `max-limit` | Text | Yes | — | Two values separated by "/", e.g. 10M/50M (upload/download). | +| Burst Bandwidth | `burst-limit` | Text | No | — | Optional: a higher bandwidth briefly allowed, e.g. 15M/60M. | +| Disabled | `disabled` | Yes/No | No | `no` | Turn the limit off without deleting it. | + + +#### Queue Tree +RouterOS menu: `/queue tree` · REST path: `queue/tree` + +Advanced, hierarchical bandwidth control based on Mangle marks. + +Instead of a fixed address, a queue tree entry acts on traffic carrying a specific Mangle mark. + +> ⚠️ **Warning:** Requires a matching Mangle rule that sets exactly this mark (see Firewall: Mangle) — without it, a queue tree entry has no effect. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Name | `name` | Text | Yes | — | Your choice, e.g. queue-guest. | +| Parent | `parent` | Text | Yes | — | An interface (e.g. the WAN port, such as ether1) or the name of another queue tree entry. | +| Packet/Connection Mark | `packet-mark` | Text | No | — | Name of the Mangle mark this entry acts on. | +| Max Bandwidth | `max-limit` | Text | No | — | A single value, e.g. 20M. | +| Disabled | `disabled` | Yes/No | No | `no` | Turn the limit off without deleting it. | + + +### Tools & Monitoring + + +#### Netwatch +RouterOS menu: `/tool netwatch` · REST path: `tool/netwatch` + +Continuously monitors whether an address is reachable, and can trigger a script on a status change. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Address to Monitor | `host` | Text | Yes | — | IP address or hostname, without a prefix, e.g. 192.168.88.1 or 8.8.8.8. | +| Check Interval | `interval` | Time duration (days/hrs/min/sec, via stepper) | No | `10s` | How often reachability is checked. | +| Script on Reachable | `up-script` | Text | No | — | Name of a script under "Scripts". | +| Script on Unreachable | `down-script` | Text | No | — | Name of a script under "Scripts". | +| Disabled | `disabled` | Yes/No | No | `no` | Turn monitoring off without deleting it. | + + +#### Email Sending *(settings menu — exactly one entry, no add/remove)* +RouterOS menu: `/tool e-mail` · REST path: `tool/e-mail` + +Outgoing mail server used by the scheduler/Netwatch/scripts for notifications. + +A single, device-wide set of settings — not a menu with multiple entries. + +| Field | RouterOS Parameter | Type | Required | Default | Help Text | +|---|---|---|---|---|---| +| Mail Server Address | `address` | Text | Yes | — | Hostname or IP address of the mail server, e.g. smtp.gmail.com. | +| Port | `port` | Number | No | — | Usually 587 (STARTTLS) or 465 (SSL). | +| Sender Address | `from` | Text | No | — | E.g. router@example.com. | +| Username | `user` | Text | No | — | Credentials for the mail server. | +| Password | `password` | Text | No | — | Credentials for the mail server. | + + + +--- + + +## 6. Backups + +![Backup/restore](Manual-assets/backup_restore.png) + +- **Back up now**: "Create a backup before making changes to the + router." Exports the current configuration. +- **Save location**: "Choose your own folder for new backups, e.g. on an + external drive or in iCloud Drive" / "Use default" — "Resets the save + location back to the app's own default folder." +- **Restore**: "Restore this backup onto the connected router — only for + the exact same router model." Uploads the backup via SFTP and restores + it; checks beforehand whether the backup matches the connected router + model (protection against "bricking" it with the wrong model), and + automatically preserves the current login (backups never contain + passwords). +- **Danger zone — restore factory defaults**: "Resets the router + completely to the manufacturer's default configuration — all previous + changes (internet, home network, VLANs, Wi-Fi, firewall) are lost. The + router reboots afterwards." Before the final reset: "This deletes ALL + previous settings … A backup is also created automatically + beforehand." Meant only as a last resort, if something went wrong. + +--- + + +## 7. Settings + +Reachable via the app menu **RouterOS Assistant → Settings…** (or ⌘,) — +not a tab, but a native macOS Settings window with three tabs. Every +change takes effect immediately, no app restart needed. + +**General** + +- **Language**: DE/EN toggle — "Same as the 🇩🇪/🇬🇧 button in the + toolbar — both control the same setting." +- **Automatically check for updates when connecting** (default: off): + "Automatically checks after every successful connection whether a + newer RouterOS version is available — same as the 'Check for updates' + button in the Connect tab." + +**Appearance** + +- **Color theme**: Standard or High Contrast. "Applies to the diagram + colors in the Topology tab and the status colors in the LAN Scanner + (traffic active, static/dynamic, open/closed port)." Also colors the + categories in the Expert tab's sidebar (Firewall, Interfaces, IP + Addressing, Routing, VPN/Wi-Fi/Queues/System/Tools) with the same + palette. +- **Text size**: Small / Standard / Large / Extra Large. Applies to text + everywhere in the app — with two deliberate exceptions: the Topology + diagram's node cards and the LAN Scanner's table columns stay at a + fixed size, since they have fixed card widths and would otherwise + clip text. +- **Controls**: Compact / Standard / Comfortable — "Size of buttons, + fields, and spacing throughout the app." + +**Network** + +- **Refresh rate** (0.1 s / 0.5 s / 1 s / 3 s): how often the LAN + Scanner polls live traffic per port. "Higher refresh rates show the + traffic trend more finely, but cost more CPU when many ports are + active at once." +- **Sparkline time window** (10 s / 30 s / 60 s) and **sparkline width** + (100–300pt): length and width of the small traffic history graph next + to each port header in the LAN Scanner. + +--- diff --git a/Manual.md b/Manual.md index 4149115..87b4170 100644 --- a/Manual.md +++ b/Manual.md @@ -32,7 +32,6 @@ entsprechen, was in der App tatsächlich angezeigt wird. 5. [Experte](#5-experte) 6. [Sicherungen](#6-sicherungen) 7. [Einstellungen](#7-einstellungen) -8. [English summary](#8-english-summary) --- @@ -62,6 +61,7 @@ bleiben unübersetzt. --- + ## 1. Verbinden ### Verbindungsaufbau @@ -145,6 +145,7 @@ Modus-Schalter zu Beginn wählt zwischen: ![Wizard-Schrittfolge](Manual-assets/wizard_flow.png) + ### WAN (Internetanschluss) | Feld | Hilfetext | @@ -157,6 +158,7 @@ Modus-Schalter zu Beginn wählt zwischen: | PPPoE-Benutzername | „Zugangsdaten von deinem Internetanbieter für die Einwahl (z.B. bei DSL-Anschlüssen).“ | | PPPoE-Passwort | „Das zum Benutzernamen gehörende Passwort von deinem Internetanbieter.“ | + ### LAN (ein oder mehrere Netzwerke) | Feld | Hilfetext | @@ -184,6 +186,7 @@ entfernt.“ Tatsächlich ausgeführt wird das erst mit „Jetzt anwenden“ am Ende des Assistenten — bis dahin lässt es sich rückgängig machen, indem oben ein anderer Port gewählt wird. + ### VLAN (optional) „Ein VLAN ist ein zusätzliches Netzwerk mit eigenem Adressbereich — z.B. @@ -201,6 +204,7 @@ einfach.“ | Netzbereich | „Der komplette Adressbereich dieses zusätzlichen Netzwerks.“ | | DHCP von/bis | „Ab/Bis zu welcher Adresse Geräte in diesem Netzwerk automatisch eine Adresse bekommen.“ | + ### WLAN (nur falls erkannt) „An diesem Gerät wurde kein WLAN erkannt. Dieser Schritt wird @@ -212,6 +216,7 @@ vergibt Netzwerkname und Passwort.“ | Netzwerkname (SSID) | „Der Name, den Geräte in ihrer WLAN-Liste sehen und mit dem sie sich verbinden.“ | | Passwort | „Das WLAN-Passwort (WPA2). Muss mindestens 8 Zeichen lang sein.“ | + ### Firewall-Grundschutz „Schützt deinen Router und deine Geräte vor unaufgeforderten Zugriffen @@ -228,6 +233,7 @@ vorangestellt, bestehende bleiben erhalten — prüfe nach dem Anwenden trotzdem die Reihenfolge, z.B. über Winbox oder ‚/ip firewall filter print‘.“ + ### Review / Apply „Vor dem Anwenden wird automatisch eine Sicherung der aktuellen @@ -247,6 +253,7 @@ Assistenten auf den ersten Schritt zurück. --- + ## 3. Übersicht Grafisches Diagramm des kompletten aktuellen Router-Zustands (IST-Zustand) @@ -322,6 +329,7 @@ selbst verwaltet. --- + ## 4. LAN-Scanner Zeigt alle Geräte im Netzwerk (aus DHCP-Leases und ARP-Tabelle), @@ -363,6 +371,7 @@ darunter der scrollbare Inhalt — derselbe Aufbau wie beim Fokus-Popup der --- + ## 5. Experte Direkter, kuratierter Zugriff auf die meisten RouterOS-Bereiche. Für @@ -398,6 +407,7 @@ aktuell am Router vorhandenen Interfaces. ### System + #### Router-Name *(Einstellungsmenü — genau ein Eintrag, kein Anlegen/Löschen)* RouterOS-Menü: `/system identity` · REST-Pfad: `system/identity` @@ -407,6 +417,7 @@ Der Name, unter dem sich der Router meldet (z.B. in Winbox/Terminal-Prompt). |---|---|---|---|---|---| | Name | `name` | Text | Ja | — | Frei wählbar, z.B. MeinRouter. | + #### Uhrzeit/Zeitzone *(Einstellungsmenü — genau ein Eintrag, kein Anlegen/Löschen)* RouterOS-Menü: `/system clock` · REST-Pfad: `system/clock` @@ -414,6 +425,7 @@ RouterOS-Menü: `/system clock` · REST-Pfad: `system/clock` |---|---|---|---|---|---| | Zeitzone | `time-zone-name` | Text | Nein | — | Z.B. Europe/Berlin. | + #### Mode-Taste *(Einstellungsmenü — genau ein Eintrag, kein Anlegen/Löschen)* RouterOS-Menü: `/system routerboard mode-button` · REST-Pfad: `system/routerboard/mode-button` @@ -429,6 +441,7 @@ Manche RouterBOARD-Geräte (z.B. hEX, cAP, hAP ac², LtAP mini, einige CCR/CRS) | Auszuführendes Skript | `on-event` | Verweis auf bestehenden Eintrag unter `/system script` | Nein | — | Name eines zuvor unter "Skripte" angelegten Skripts. | | Haltedauer (Min..Max) | `hold-time` | Text | Nein | — | Wie lange die Taste gedrückt gehalten werden muss, als Zeitspanne Min..Max, z.B. "3s..5s". Verfügbar ab RouterOS 6.47beta60. | + #### Zeitserver (NTP) *(Einstellungsmenü — genau ein Eintrag, kein Anlegen/Löschen)* RouterOS-Menü: `/system ntp client` · REST-Pfad: `system/ntp/client` @@ -443,6 +456,7 @@ Die Server-Liste selbst liegt in einem eigenen Menü ("NTP-Zeitserver-Liste") | Aktiviert | `enabled` | Ja/Nein | Nein | `yes` | Zeitsynchronisation ein-/ausschalten. | | Modus | `mode` | Auswahl (fest): `unicast`, `broadcast`, `multicast`, `manycast` | Nein | `unicast` | Fast immer "unicast" (direkte Anfrage an feste Server). | + #### NTP-Zeitserver-Liste RouterOS-Menü: `/system ntp client servers` · REST-Pfad: `system/ntp/client/servers` @@ -456,6 +470,7 @@ Die Zeitserver, die der Client abfragt. | Deaktiviert | `disabled` | Ja/Nein | Nein | `no` | Diesen Server deaktivieren, ohne ihn zu löschen. | | Kommentar | `comment` | Text | Nein | — | Nur zur eigenen Wiedererkennung. | + #### Zeitplaner RouterOS-Menü: `/system scheduler` · REST-Pfad: `system/scheduler` @@ -471,6 +486,7 @@ Führt ein hinterlegtes Skript zu festen Zeiten/Intervallen aus. | Auszuführendes Skript | `on-event` | Verweis auf bestehenden Eintrag unter `/system script` | Nein | — | Name eines zuvor unter "Skripte" angelegten Skripts. | | Deaktiviert | `disabled` | Ja/Nein | Nein | `no` | Zeitplan inaktiv schalten, ohne ihn zu löschen. | + #### Skripte RouterOS-Menü: `/system script` · REST-Pfad: `system/script` @@ -483,6 +499,7 @@ Gespeicherte RouterOS-Befehlsfolgen, die manuell oder per Scheduler ausgeführt | Name | `name` | Text | Ja | — | Frei wählbar, z.B. backup-taeglich. | | Skript-Inhalt | `source` | Text | Nein | — | RouterOS-Befehle, z.B. ":log info \"Test\"". | + #### Benutzerkonten RouterOS-Menü: `/user` · REST-Pfad: `user` @@ -497,6 +514,7 @@ Zugangskonten für den Router (Winbox/SSH/REST/Terminal). | Rechte-Gruppe | `group` | Auswahl (fest): `full`, `write`, `read` | Nein | `full` | full = Vollzugriff, write = ohne Benutzerverwaltung, read = nur lesen. | | Deaktiviert | `disabled` | Ja/Nein | Nein | `no` | Konto inaktiv schalten, ohne es zu löschen. | + #### Protokollierung RouterOS-Menü: `/system logging` · REST-Pfad: `system/logging` @@ -509,6 +527,7 @@ Besteht aus "rules" (was protokolliert wird) und "actions" (wohin) — hier gene ### Interfaces (Bridge, VLAN, VPN-Tunnel...) + #### Alle Interfaces (generisch) RouterOS-Menü: `/interface` · REST-Pfad: `interface` @@ -524,6 +543,7 @@ RouterOS listet hier alle Interfaces zusammen. Typ-spezifische Felder (z.B. die | Kommentar | `comment` | Text | Nein | — | Nur zur eigenen Wiedererkennung, ohne technische Wirkung. | | Deaktiviert | `disabled` | Ja/Nein | Nein | `no` | Interface inaktiv schalten, ohne es zu löschen. | + #### Bridge RouterOS-Menü: `/interface bridge` · REST-Pfad: `interface/bridge` @@ -537,6 +557,7 @@ Geräte an gebrückten Ports verhalten sich, als hingen sie am selben Netzwerk-K | VLAN-Filterung (802.1Q) | `vlan-filtering` | Ja/Nein | Nein | `no` | Aktiviert echte VLAN-Trennung über diese Bridge — nötig, wenn mehrere VLANs über dieselben Bridge-Ports laufen sollen. | | Deaktiviert | `disabled` | Ja/Nein | Nein | `no` | Bridge inaktiv schalten, ohne sie zu löschen. | + #### Bridge-Ports RouterOS-Menü: `/interface bridge port` · REST-Pfad: `interface/bridge/port` @@ -550,6 +571,7 @@ Erst danach ist der Port Teil des Bridge-Netzwerks. | Physischer Port | `interface` | Auswahl aus Live-Interface-Liste des Routers | Ja | — | Der Port, der der Bridge hinzugefügt wird, z.B. ether2. | | Port-VLAN-ID (PVID) | `pvid` | Zahl | Nein | — | Nur mit aktivierter VLAN-Filterung relevant: VLAN, dem untagged ankommender Verkehr an diesem Port zugeordnet wird, z.B. 20. | + #### VLAN-Interfaces RouterOS-Menü: `/interface vlan` · REST-Pfad: `interface/vlan` @@ -564,6 +586,7 @@ Ein eigenes logisches Netzwerk auf demselben Kabel, unterschieden durch eine VLA | Basis-Interface | `interface` | Auswahl aus Live-Interface-Liste des Routers | Ja | — | Physischer Port oder Bridge, auf dem dieses VLAN aufsetzt, z.B. bridge. | | Deaktiviert | `disabled` | Ja/Nein | Nein | `no` | VLAN-Interface inaktiv schalten, ohne es zu löschen. | + #### WireGuard-Interfaces RouterOS-Menü: `/interface wireguard` · REST-Pfad: `interface/wireguard` @@ -580,6 +603,7 @@ Ein WireGuard-Interface allein stellt noch keine Verbindung her — dazu gehöre | Privater Schlüssel | `private-key` | Text | Nein | — | Geheim halten. Leer lassen, damit RouterOS automatisch einen erzeugt. | | Deaktiviert | `disabled` | Ja/Nein | Nein | `no` | Interface inaktiv schalten, ohne es zu löschen. | + #### WireGuard-Peers RouterOS-Menü: `/interface wireguard peers` · REST-Pfad: `interface/wireguard/peers` @@ -596,6 +620,7 @@ Jede Gegenstelle braucht ihren eigenen öffentlichen Schlüssel und eine Angabe, | Port der Gegenstelle | `endpoint-port` | Text | Nein | — | Meist derselbe Port wie der Listen-Port der Gegenstelle, z.B. 51820. | | Keepalive | `persistent-keepalive` | Zeitdauer (Tage/Std/Min/Sek, per Stepper) | Nein | — | Hält die Verbindung durch NAT/Firewalls am Leben. Wichtig bei Clients hinter NAT. | + #### PPPoE-Client RouterOS-Menü: `/interface pppoe-client` · REST-Pfad: `interface/pppoe-client` @@ -611,6 +636,7 @@ Ersetzt eine feste/DHCP-WAN-Adresse durch eine PPPoE-Einwahl beim Provider. | Passwort | `password` | Text | Ja | — | Zugangsdaten des Providers. | | Deaktiviert | `disabled` | Ja/Nein | Nein | `no` | Einwahl inaktiv schalten, ohne sie zu löschen. | + #### Bonding RouterOS-Menü: `/interface bonding` · REST-Pfad: `interface/bonding` @@ -625,6 +651,7 @@ Bündelt mehrere physische Ports zu einer logischen, ausfalltoleranten/schneller ### IP-Adressierung & Dienste + #### IP-Adressen RouterOS-Menü: `/ip address` · REST-Pfad: `ip/address` @@ -638,6 +665,7 @@ Jede IP-Adresse hängt an genau einem Interface (physischer Port, Bridge oder VL | Interface | `interface` | Auswahl aus Live-Interface-Liste des Routers | Ja | — | Interface, dem diese Adresse zugewiesen wird, z.B. bridge oder ether4. | | Deaktiviert | `disabled` | Ja/Nein | Nein | `no` | Adresse inaktiv schalten, ohne sie zu löschen. | + #### Adress-Pools RouterOS-Menü: `/ip pool` · REST-Pfad: `ip/pool` @@ -648,6 +676,7 @@ Adressbereiche, aus denen DHCP-Server oder PPP-Profile Adressen vergeben. | Name | `name` | Text | Ja | — | Frei wählbar, z.B. dhcp_pool_lan. | | Bereich(e) | `ranges` | Text | Ja | — | Von-bis-Adresse ohne Präfix, z.B. 192.168.88.10-192.168.88.254. Mehrere Bereiche kommagetrennt. | + #### DHCP-Server RouterOS-Menü: `/ip dhcp-server` · REST-Pfad: `ip/dhcp-server` @@ -663,6 +692,7 @@ Für die üblichen Fälle deckt das bereits der Einrichten-Assistent (LAN-/VLAN- | Lease-Zeit | `lease-time` | Zeitdauer (Tage/Std/Min/Sek, per Stepper) | Nein | — | Wie lange ein Gerät seine Adresse behält, bevor sie erneuert werden muss, z.B. 1d oder 12h. | | Deaktiviert | `disabled` | Ja/Nein | Nein | `no` | DHCP-Server inaktiv schalten, ohne ihn zu löschen. | + #### DHCP-Netzwerke RouterOS-Menü: `/ip dhcp-server network` · REST-Pfad: `ip/dhcp-server/network` @@ -676,6 +706,7 @@ Getrennt vom DHCP-Server selbst, weil dieselben Netzwerk-Optionen für mehrere D | Gateway | `gateway` | Text | Ja | — | In der Regel die Router-Adresse in diesem Netz, ohne Präfix, z.B. 192.168.88.1. | | DNS-Server | `dns-server` | Text | Nein | — | Meist der Router selbst, z.B. 192.168.88.1. Mehrere Server kommagetrennt möglich. | + #### DHCP-Client (WAN) RouterOS-Menü: `/ip dhcp-client` · REST-Pfad: `ip/dhcp-client` @@ -688,6 +719,7 @@ Bezieht automatisch eine IP-Adresse vom Internetanbieter. | DNS-Server übernehmen | `use-peer-dns` | Ja/Nein | Nein | `yes` | Übernimmt die vom Provider mitgeteilten DNS-Server. | | Deaktiviert | `disabled` | Ja/Nein | Nein | `no` | DHCP-Client inaktiv schalten, ohne ihn zu löschen. | + #### DNS-Einstellungen *(Einstellungsmenü — genau ein Eintrag, kein Anlegen/Löschen)* RouterOS-Menü: `/ip dns` · REST-Pfad: `ip/dns` @@ -698,6 +730,7 @@ Namensauflösung des Routers selbst (und optional als DNS-Server fürs LAN). | DNS-Server | `servers` | Text | Nein | — | Ein oder mehrere Server, kommagetrennt, z.B. 1.1.1.1,8.8.8.8. | | Als DNS-Server fürs LAN erlauben | `allow-remote-requests` | Ja/Nein | Nein | `no` | Lässt Geräte im LAN den Router selbst als DNS-Server nutzen. Ohne das schlagen DNS-Anfragen von Geräten an den Router fehl, selbst wenn sie ihn als DNS-Server eingetragen haben. | + #### Verwaltungsdienste RouterOS-Menü: `/ip service` · REST-Pfad: `ip/service` @@ -714,6 +747,7 @@ Jeder aktive Dienst ist ein potenzieller Angriffspunkt aus dem jeweils erreichba | Erlaubt von | `available-from` | Text | Nein | — | Optional: nur von dieser Adresse/diesem Netz aus erreichbar, mit Präfix, z.B. 192.168.88.0/24. | | Deaktiviert | `disabled` | Ja/Nein | Nein | `no` | Dienst inaktiv schalten, ohne den Eintrag zu löschen. | + #### Hotspot RouterOS-Menü: `/ip hotspot` · REST-Pfad: `ip/hotspot` @@ -726,6 +760,7 @@ Besteht aus mehreren zusammenhängenden Teilen (Server, Server-Profil, Benutzer- ### Routing + #### Statische Routen RouterOS-Menü: `/ip route` · REST-Pfad: `ip/route` @@ -741,6 +776,7 @@ Für alles außer "Standard-Internet über eine WAN-Schnittstelle" (das übernim | Kommentar | `comment` | Text | Nein | — | Nur zur eigenen Wiedererkennung. | | Deaktiviert | `disabled` | Ja/Nein | Nein | `no` | Route inaktiv schalten, ohne sie zu löschen. | + #### OSPF-Instanzen RouterOS-Menü: `/routing ospf instance` · REST-Pfad: `routing/ospf/instance` @@ -752,6 +788,7 @@ Nur relevant, wenn mehrere Router im selben Netz eigenständig Routen lernen sol *Noch kein kuratiertes Formular — alle Felder erscheinen als freie Schlüssel/Wert-Paare (siehe „Eigener Menüpfad“).* + #### BGP-Verbindungen RouterOS-Menü: `/routing bgp connection` · REST-Pfad: `routing/bgp/connection` @@ -764,6 +801,7 @@ Für Privat-/Kleinnetz i.d.R. nicht nötig — relevant bei eigenem Provider-una ### VPN-Server/Clients + #### PPP-Benutzer RouterOS-Menü: `/ppp secret` · REST-Pfad: `ppp/secret` @@ -781,6 +819,7 @@ Jeder Benutzer kann optional einem Profil zugeordnet werden, das IP-Pool/DNS/Ver | Adresse für den Client | `remote-address` | Text | Nein | — | Feste IP für diesen Benutzer (z.B. 10.10.10.2), oder Name eines Adress-Pools. | | Deaktiviert | `disabled` | Ja/Nein | Nein | `no` | Benutzer inaktiv schalten, ohne ihn zu löschen. | + #### PPP-Profile RouterOS-Menü: `/ppp profile` · REST-Pfad: `ppp/profile` @@ -793,6 +832,7 @@ Vorlagen (IP-Pool, DNS, Verschlüsselung) für PPP-Benutzer. | Adress-Pool für Clients | `remote-address` | Text | Nein | — | Name eines zuvor angelegten Adress-Pools. | | DNS-Server für Clients | `dns-server` | Text | Nein | — | Ein oder mehrere Server, kommagetrennt, z.B. 1.1.1.1,8.8.8.8. | + #### L2TP-VPN-Server RouterOS-Menü: `/interface l2tp-server server` · REST-Pfad: `interface/l2tp-server/server` @@ -802,6 +842,7 @@ Ein einzelnes Server-weites An/Aus mit gemeinsamen Verschlüsselungs-Einstellung *Noch kein kuratiertes Formular — alle Felder erscheinen als freie Schlüssel/Wert-Paare (siehe „Eigener Menüpfad“).* + #### OpenVPN-Server RouterOS-Menü: `/interface ovpn-server server` · REST-Pfad: `interface/ovpn-server/server` @@ -814,6 +855,7 @@ Braucht zusätzlich ein Zertifikat ("/certificate") — Benutzer selbst kommen v ### WLAN / CAPsMAN + #### WLAN (Legacy-Treiber) RouterOS-Menü: `/interface wireless` · REST-Pfad: `interface/wireless` @@ -828,6 +870,7 @@ Diese Interfaces existieren bereits ab Werk (ein WLAN-Chip = ein Interface) — | Modus | `mode` | Auswahl (fest): `ap-bridge`, `station`, `bridge` | Nein | `ap-bridge` | ap-bridge = Access Point (Normalfall), station = als Client mit einem anderen AP verbinden. | | Deaktiviert | `disabled` | Ja/Nein | Nein | `no` | WLAN-Interface inaktiv schalten, ohne es zu löschen. | + #### WLAN-Sicherheitsprofile RouterOS-Menü: `/interface wireless security-profiles` · REST-Pfad: `interface/wireless/security-profiles` @@ -842,6 +885,7 @@ Ein Profil wird angelegt und dann bei einem WLAN-Interface als "security-profile | Authentifizierung | `authentication-types` | Auswahl (fest): `wpa-psk`, `wpa2-psk`, `wpa-psk,wpa2-psk`, `wpa-eap`, `wpa2-eap` | Nein | — | wpa2-psk = WPA2 mit gemeinsamem Passwort (Heimnetz-Standard). | | WPA2-Passwort | `wpa2-pre-shared-key` | Text | Nein | — | Mindestens 8 Zeichen. | + #### WLAN (neuer wifiwave2/802.11ax-Treiber) RouterOS-Menü: `/interface wifi` · REST-Pfad: `interface/wifi` @@ -859,6 +903,7 @@ Anderes, verschachteltes Konfigurationsschema als der Legacy-Treiber (Punkt-Nota | Ziel-Bridge | `datapath.bridge` | Text | Nein | — | Name der Bridge, der dieses WLAN-Netz zugeordnet wird (üblicherweise dieselbe wie das kabelgebundene LAN), z.B. bridge. | | Deaktiviert | `disabled` | Ja/Nein | Nein | `no` | WLAN-Interface inaktiv schalten, ohne es zu löschen. | + #### CAPsMAN-Zentrale RouterOS-Menü: `/caps-man manager` · REST-Pfad: `caps-man/manager` @@ -871,6 +916,7 @@ Nur relevant mit mehreren WLAN-Access-Points, die zentral verwaltet werden solle ### Firewall: Filter-Regeln + #### Filter-Regeln RouterOS-Menü: `/ip firewall filter` · REST-Pfad: `ip/firewall/filter` @@ -900,6 +946,7 @@ input = Zugriffe auf den Router selbst, forward = Verkehr, der durch den Router ### Firewall: NAT (Portweiterleitung etc.) + #### NAT-Regeln RouterOS-Menü: `/ip firewall nat` · REST-Pfad: `ip/firewall/nat` @@ -927,6 +974,7 @@ srcnat ändert die Absenderadresse ausgehender Pakete (z.B. private LAN-IP → ### Firewall: Mangle (Markierung/QoS-Vorbereitung) + #### Mangle-Regeln RouterOS-Menü: `/ip firewall mangle` · REST-Pfad: `ip/firewall/mangle` @@ -955,6 +1003,7 @@ Mangle selbst verändert nicht, wie ein Paket behandelt wird — es klebt nur ei ### Firewall: Raw (vor Connection-Tracking) + #### Raw-Regeln RouterOS-Menü: `/ip firewall raw` · REST-Pfad: `ip/firewall/raw` @@ -979,6 +1028,7 @@ Regeln hier greifen, bevor RouterOS eine Verbindung überhaupt "kennt" (Connecti ### Firewall: Adress-Listen + #### Adress-Listen RouterOS-Menü: `/ip firewall address-list` · REST-Pfad: `ip/firewall/address-list` @@ -996,6 +1046,7 @@ Statt in jeder Regel einzelne IPs aufzuzählen, legst du hier eine benannte List ### Queues / Bandbreiten-Steuerung + #### Einfache Bandbreiten-Begrenzung RouterOS-Menü: `/queue simple` · REST-Pfad: `queue/simple` @@ -1011,6 +1062,7 @@ Reicht für die meisten Heim-/Kleinnetz-Fälle ohne Mangle-Markierungen aus. | Burst-Bandbreite | `burst-limit` | Text | Nein | — | Optional: kurzzeitig erlaubte höhere Bandbreite, z.B. 15M/60M. | | Deaktiviert | `disabled` | Ja/Nein | Nein | `no` | Begrenzung inaktiv schalten, ohne sie zu löschen. | + #### Queue-Baum RouterOS-Menü: `/queue tree` · REST-Pfad: `queue/tree` @@ -1031,6 +1083,7 @@ Statt einer festen Adresse wirkt ein Queue-Baum-Eintrag auf Verkehr mit einer be ### Werkzeuge & Überwachung + #### Netwatch RouterOS-Menü: `/tool netwatch` · REST-Pfad: `tool/netwatch` @@ -1044,6 +1097,7 @@ RouterOS-Menü: `/tool netwatch` · REST-Pfad: `tool/netwatch` | Skript bei Nichterreichbarkeit | `down-script` | Text | Nein | — | Name eines Skripts unter "Skripte". | | Deaktiviert | `disabled` | Ja/Nein | Nein | `no` | Überwachung inaktiv schalten, ohne sie zu löschen. | + #### E-Mail-Versand *(Einstellungsmenü — genau ein Eintrag, kein Anlegen/Löschen)* RouterOS-Menü: `/tool e-mail` · REST-Pfad: `tool/e-mail` @@ -1063,6 +1117,7 @@ Ein einzelner, geräteweiter Satz Einstellungen — kein Menü mit mehreren Eint --- + ## 6. Sicherungen ![Sicherung/Wiederherstellung](Manual-assets/backup_restore.png) @@ -1090,6 +1145,7 @@ Ein einzelner, geräteweiter Satz Einstellungen — kein Menü mit mehreren Eint --- + ## 7. Einstellungen Erreichbar über das App-Menü **RouterOS Assistant → Einstellungen…** @@ -1130,66 +1186,3 @@ mit drei Reitern. Jede Änderung wirkt sofort, ohne Neustart der App. - **Sparkline-Zeitfenster** (10 s / 30 s / 60 s) und **Sparkline-Breite** (100–300pt): Länge bzw. Breite der kleinen Traffic-Verlaufsgrafik neben jeder Port-Überschrift im LAN-Scanner. - ---- - -## 8. English summary - -RouterOS Assistant is a native macOS app that sets up and manages -MikroTik RouterOS routers through a guided wizard and six tabs: Connect, -Setup, Topology, LAN Scanner, Expert, Backups. The app talks to the -router over its REST API (preferred, RouterOS ≥ 7.1) or SSH (fallback, -and mandatory for backup/update-check/firmware-update, which only exist -as CLI commands) — chosen automatically, no configuration needed. A -DE/EN toggle button (flag icon) in the toolbar switches the app's -language and persists across restarts. - -- **Connect**: enter host/username/password; first connection shows a - trust-on-first-use dialog for an unknown TLS certificate (REST) or SSH - host key (SSH) — for a REST connection, both can appear in sequence, - since backup/update-check/firmware always need SSH regardless of the - main connection path. "Known Routers" remembers host+username+serial - number per device (so two routers sharing MikroTik's factory default - don't collide), with a separate keychain entry per device and an - editable display name/location field. -- **Setup Wizard**: Simple mode (WAN + one LAN + WLAN + a fixed basic - firewall, no VLANs/isolation) or Expert mode (multiple LAN networks - each with their own DHCP server, VLANs, network isolation, full - firewall control). Every step's fields carry the exact same help text - as the German version (see chapter 2) — this summary doesn't duplicate - them. Review/Apply shows every command before running it and takes an - automatic backup first. -- **Topology**: a live diagram of the router's complete current state — - five columns (Interfaces → IP addresses → Pools & DHCP → Routes → - Firewall & NAT) connected by real dependency lines. Clicking a node - opens **Focus Mode**: a floating popup showing that node's complete - connected chain (full transitive closure) neatly re-laid-out, with - everything else in the main diagram dimmed — closable via its own X - button, a click on empty space, or re-clicking the same node. The - right-hand sidebar stays interactive while focused (it's a non-modal - overlay, not a system sheet), so a chained node can be edited directly - from the popup. Most node kinds are directly editable in place. -- **LAN Scanner**: every device from DHCP leases + ARP, grouped by - physical port, with live per-port throughput. Per-device actions: - assign/remove a static IP, and network tools (ping/traceroute/DNS - lookup run from the router itself over SSH; a port scan runs from this - Mac directly). All three result popups share the same fixed - header-with-close-button layout as Topology's focus popup and the - Expert tab's edit form. -- **Expert**: curated, tooltip-annotated direct access to most RouterOS - areas (see chapter 5 for the full field-by-field German reference, - extracted verbatim from the app's source), plus a free-form "custom - menu path" for anything not yet curated. Every change shows a - confirmation dialog with the exact command that will run first. -- **Backups**: create/restore backups over SFTP (model-checked before - restoring, to avoid bricking the device with the wrong backup), - configurable save location, and a danger-zone factory-reset switch - (auto-backs-up first). -- **Settings** (⌘,, native macOS settings window, not a tab): language, - auto-check for RouterOS updates on connect, a color theme (Standard/ - High Contrast — Topology diagram, LAN Scanner status colors, Expert - sidebar categories), text size (with two deliberate exceptions: the - Topology diagram's node cards and the LAN Scanner's fixed-width table - columns stay fixed-size, or their layout would break), control-element - size, and the LAN Scanner's refresh rate/sparkline window/sparkline - width. Every change applies live, no restart needed. diff --git a/Manual.pdf b/Manual.pdf index 7949d9c..4b01efb 100644 Binary files a/Manual.pdf and b/Manual.pdf differ diff --git a/Manual_en.pdf b/Manual_en.pdf new file mode 100644 index 0000000..10eb6ba Binary files /dev/null and b/Manual_en.pdf differ diff --git a/README.md b/README.md index 93be4a9..40a0793 100644 --- a/README.md +++ b/README.md @@ -170,6 +170,7 @@ nur die zugehörigen Passwörter liegen weiterhin im macOS-Schlüsselbund. | M28 | Übersicht-Tab: Fokus-Modus (Klick auf Knoten → Kette im schwebenden Popup, Rest abgedunkelt); Close-Button-Layout in allen vier Popups vereinheitlicht | ✅ live verifiziert | | M29 | Einstellungen-Fenster (⌘,): Sprache, Update-Auto-Check, Farbschema, Textgröße, Bedienelement-Größe, LAN-Scanner-Refreshraten | ✅ live verifiziert | | M30 | Experte-Tab: "Mode-Taste"-Menü (`/system routerboard mode-button`), inkl. SSH-Zwangsweg für REST-Deckungslücken | ✅ live verifiziert | +| M31 | Handbuch in der App (⌘? -Buttons, Textanker, Übersicht/Wizard/45 Experte-Menüs), DE+EN vollständig übersetzt | ✅ live verifiziert | Ausführlicher Stand inkl. aller gefundenen Bugs, offener Punkte und Session-Verlauf: [`HANDOFF.md`](HANDOFF.md) / [`CHATLOG.md`](CHATLOG.md). diff --git a/RouterOSAssistant/App/RouterOSAssistantApp.swift b/RouterOSAssistant/App/RouterOSAssistantApp.swift index 52c34a9..a0b1a6c 100644 --- a/RouterOSAssistant/App/RouterOSAssistantApp.swift +++ b/RouterOSAssistant/App/RouterOSAssistantApp.swift @@ -3,6 +3,7 @@ import SwiftUI @main struct RouterOSAssistantApp: App { @StateObject private var connectionService = ConnectionService() + @StateObject private var manualNavigator = ManualNavigator() /// Manual language override — independent of the system locale, per the user's explicit /// request for an in-app toggle button. `.environment(\.locale, ...)` does NOT make /// `Text(LocalizedStringKey)` re-resolve against Localizable.xcstrings at runtime (confirmed @@ -53,11 +54,18 @@ struct RouterOSAssistantApp: App { // (\.font, ...)` only ever supplies a *default*: anywhere `.appFont(...)` already sets // an explicit font, that still wins. .environment(\.font, .system(size: 13 * ((AppTextSize(rawValue: textSizeRaw) ?? .standard).scale))) + .environmentObject(manualNavigator) } .environment(\.locale, Locale(identifier: appLanguage)) Settings { SettingsView() + .environmentObject(manualNavigator) + } + + Window(L10n.t("Handbuch", appLanguage), id: "manual") { + ManualView() + .environmentObject(manualNavigator) } } } diff --git a/RouterOSAssistant/Core/Localization/L10n.swift b/RouterOSAssistant/Core/Localization/L10n.swift index edc0ae1..61f3350 100644 --- a/RouterOSAssistant/Core/Localization/L10n.swift +++ b/RouterOSAssistant/Core/Localization/L10n.swift @@ -16,6 +16,8 @@ enum L10n { private static let translations: [String: String] = [ "Verbinden": "Connect", + "Handbuch": "Manual", + "Hilfe zu diesem Bereich im Handbuch öffnen": "Open help for this area in the manual", "Einrichten": "Setup", "Übersicht": "Topology", "LAN-Scanner": "LAN Scanner", diff --git a/RouterOSAssistant/Features/Backup/BackupListView.swift b/RouterOSAssistant/Features/Backup/BackupListView.swift index 77cbf22..53f1084 100644 --- a/RouterOSAssistant/Features/Backup/BackupListView.swift +++ b/RouterOSAssistant/Features/Backup/BackupListView.swift @@ -212,6 +212,7 @@ struct BackupListView: View { } } .navigationTitle(LocalizedStringKey(L10n.t("Sicherungen", appLanguage))) +.toolbar { ToolbarItem { ManualHelpButton(anchor: ManualAnchor.tabBackup) } } .toolbar { ToolbarItem { Button { diff --git a/RouterOSAssistant/Features/Devices/DevicesView.swift b/RouterOSAssistant/Features/Devices/DevicesView.swift index ab7e0c3..57e48c5 100644 --- a/RouterOSAssistant/Features/Devices/DevicesView.swift +++ b/RouterOSAssistant/Features/Devices/DevicesView.swift @@ -120,6 +120,7 @@ struct DevicesView: View { } } .navigationTitle(LocalizedStringKey(L10n.t("LAN-Scanner", appLanguage))) +.toolbar { ToolbarItem { ManualHelpButton(anchor: ManualAnchor.tabDevices) } } .toolbar { ToolbarItem { Button { diff --git a/RouterOSAssistant/Features/Expert/ExpertMenuDetailView.swift b/RouterOSAssistant/Features/Expert/ExpertMenuDetailView.swift index 39413c7..cc3408f 100644 --- a/RouterOSAssistant/Features/Expert/ExpertMenuDetailView.swift +++ b/RouterOSAssistant/Features/Expert/ExpertMenuDetailView.swift @@ -79,6 +79,7 @@ struct ExpertMenuDetailView: View { // See DevicesView's identical fix: `.formStyle(.grouped)` paints an opaque background // over each Section's rows, hiding `.listRowBackground` (Zebra-Streifen) underneath it. .scrollContentBackground(.hidden) + .toolbar { ToolbarItem { ManualHelpButton(anchor: ManualAnchor.schema(schema.menuPath)) } } .navigationTitle(LocalizedStringKey(L10n.t(schema.displayName, appLanguage))) .task(id: schema.id) { await viewModel.reloadItems() } .sheet(item: $viewModel.editingItem) { item in diff --git a/RouterOSAssistant/Features/Expert/ExpertView.swift b/RouterOSAssistant/Features/Expert/ExpertView.swift index 6721cea..c35f267 100644 --- a/RouterOSAssistant/Features/Expert/ExpertView.swift +++ b/RouterOSAssistant/Features/Expert/ExpertView.swift @@ -84,6 +84,7 @@ struct ExpertView: View { } .listStyle(.sidebar) .navigationTitle(LocalizedStringKey(L10n.t("Experte", appLanguage))) +.toolbar { ToolbarItem { ManualHelpButton(anchor: ManualAnchor.tabExpert) } } } detail: { if let schema = viewModel.selectedSchema { ExpertMenuDetailView( diff --git a/RouterOSAssistant/Features/Manual/ManualView.swift b/RouterOSAssistant/Features/Manual/ManualView.swift new file mode 100644 index 0000000..37471f3 --- /dev/null +++ b/RouterOSAssistant/Features/Manual/ManualView.swift @@ -0,0 +1,118 @@ +import SwiftUI +import WebKit + +/// Static/stable anchor ids matching the `` markers hand-placed in `Manual.md` +/// (tab-/step-anchors) and auto-generated by `build-manual.py`'s `schema_anchor()` (Experte +/// menus) — the two sides are kept in sync by construction: this is the exact same string +/// transform as the Python function, not a generated file, so there's nothing to regenerate +/// when a schema's `menuPath` doesn't change. +enum ManualAnchor { + static let tabConnect = "tab-connect" + static let stepWAN = "step-wan" + static let stepLAN = "step-lan" + static let stepVLAN = "step-vlan" + static let stepWifi = "step-wifi" + static let stepFirewall = "step-firewall" + static let stepReview = "step-review" + static let tabOverview = "tab-overview" + static let tabDevices = "tab-devices" + static let tabExpert = "tab-expert" + static let tabBackup = "tab-backup" + static let tabSettings = "tab-settings" + + /// Mirrors `build-manual.py`'s `schema_anchor(menu_path)` exactly. + static func schema(_ menuPath: String) -> String { + let trimmed = menuPath.trimmingCharacters(in: CharacterSet(charactersIn: "/")) + return "schema-" + trimmed.replacingOccurrences(of: " ", with: "-") + } +} + +/// Shared across the app (one instance, injected as an `@StateObject` in +/// `RouterOSAssistantApp`) so any "?"-help button anywhere can request the Handbuch window +/// jump to a specific section, whether or not that window is already open. +@MainActor +final class ManualNavigator: ObservableObject { + @Published var pendingAnchor: String? + + func go(to anchor: String) { + // Reassigning the same value wouldn't trigger `didSet`/a fresh `onChange` in + // `ManualView` if the user clicks the same help button twice in a row — nil the + // slot first so every request, including a repeat, actually re-scrolls. + pendingAnchor = nil + DispatchQueue.main.async { self.pendingAnchor = anchor } + } +} + +private struct ManualWebView: NSViewRepresentable { + @ObservedObject var navigator: ManualNavigator + let language: String + + /// One HTML file per language (`Manual.html` for "de", `Manual_en.html`, later + /// `Manual_es.html`, ...) — `build-manual.py` names them the same way (`suffix = "" + /// if lang == "de" else f"_{lang}"`), so a new language needs no Swift change here, + /// only a new `Manual..md` + an entry in `LANGUAGES` in that script. + final class Coordinator { + var loadedLanguage: String? + } + + func makeCoordinator() -> Coordinator { Coordinator() } + + func makeNSView(context: Context) -> WKWebView { + let webView = WKWebView() + load(language, into: webView, coordinator: context.coordinator) + return webView + } + + func updateNSView(_ webView: WKWebView, context: Context) { + if context.coordinator.loadedLanguage != language { + load(language, into: webView, coordinator: context.coordinator) + } + guard let anchor = navigator.pendingAnchor else { return } + // The page is already loaded — scrolling via JS instead of re-navigating to + // "Manual.html#anchor" avoids a full page reload/flash on every help-button click. + webView.evaluateJavaScript( + "document.getElementById(\(String(reflecting: anchor)))?.scrollIntoView({behavior: 'smooth', block: 'start'});" + ) + } + + private func load(_ language: String, into webView: WKWebView, coordinator: Coordinator) { + let resourceName = language == "de" ? "Manual" : "Manual_\(language)" + // Falls back to the German file if this language has no translated manual yet + // (e.g. a language the app UI supports but the manual hasn't been translated + // into) rather than showing a blank window. + guard let url = Bundle.main.url(forResource: resourceName, withExtension: "html") + ?? Bundle.main.url(forResource: "Manual", withExtension: "html") else { return } + webView.loadFileURL(url, allowingReadAccessTo: url) + coordinator.loadedLanguage = language + } +} + +struct ManualView: View { + @EnvironmentObject private var navigator: ManualNavigator + @AppStorage("appLanguage") private var appLanguage: String = "de" + + var body: some View { + ManualWebView(navigator: navigator, language: appLanguage) + .frame(minWidth: 640, minHeight: 480) + } +} + +/// Drop-in "?" toolbar button for any screen — opens (or focuses, if already open) the +/// Handbuch window scrolled straight to `anchor`. One shared implementation so every tab/ +/// wizard-step/Experte-schema screen wires help the same way. +struct ManualHelpButton: View { + let anchor: String + @AppStorage("appLanguage") private var appLanguage: String = "de" + @EnvironmentObject private var navigator: ManualNavigator + @Environment(\.openWindow) private var openWindow + + var body: some View { + Button { + navigator.go(to: anchor) + openWindow(id: "manual") + } label: { + Image(systemName: "questionmark.circle") + } + .help(L10n.t("Hilfe zu diesem Bereich im Handbuch öffnen", appLanguage)) + } +} diff --git a/RouterOSAssistant/Features/Overview/OverviewView.swift b/RouterOSAssistant/Features/Overview/OverviewView.swift index b0ce232..a1ce468 100644 --- a/RouterOSAssistant/Features/Overview/OverviewView.swift +++ b/RouterOSAssistant/Features/Overview/OverviewView.swift @@ -166,6 +166,7 @@ struct OverviewView: View { } } .navigationTitle(LocalizedStringKey(L10n.t("Übersicht", appLanguage))) +.toolbar { ToolbarItem { ManualHelpButton(anchor: ManualAnchor.tabOverview) } } .toolbar { ToolbarItemGroup { if viewModel.isLoading { diff --git a/RouterOSAssistant/Features/Wizard/Steps/Connect/ConnectView.swift b/RouterOSAssistant/Features/Wizard/Steps/Connect/ConnectView.swift index 9cd4b9a..b4f5c38 100644 --- a/RouterOSAssistant/Features/Wizard/Steps/Connect/ConnectView.swift +++ b/RouterOSAssistant/Features/Wizard/Steps/Connect/ConnectView.swift @@ -107,6 +107,7 @@ struct ConnectView: View { statusSection } .formStyle(.grouped) + .toolbar { ToolbarItem { ManualHelpButton(anchor: ManualAnchor.tabConnect) } } .frame(minWidth: 320) } detail: { deviceDetail @@ -368,6 +369,7 @@ struct ConnectView: View { } } .formStyle(.grouped) + .toolbar { ToolbarItem { ManualHelpButton(anchor: ManualAnchor.tabConnect) } } .scrollContentBackground(.hidden) } else { ContentUnavailableView( diff --git a/RouterOSAssistant/Features/Wizard/Steps/Setup/FirewallStepView.swift b/RouterOSAssistant/Features/Wizard/Steps/Setup/FirewallStepView.swift index 5d4ee67..8e5e9ab 100644 --- a/RouterOSAssistant/Features/Wizard/Steps/Setup/FirewallStepView.swift +++ b/RouterOSAssistant/Features/Wizard/Steps/Setup/FirewallStepView.swift @@ -61,6 +61,7 @@ struct FirewallStepView: View { } .formStyle(.grouped) .navigationTitle(LocalizedStringKey(L10n.t("Firewall (optional)", appLanguage))) +.toolbar { ToolbarItem { ManualHelpButton(anchor: ManualAnchor.stepFirewall) } } .onAppear { if viewModel.firewallSectionEnabled { viewModel.loadExistingFirewallRuleCounts() diff --git a/RouterOSAssistant/Features/Wizard/Steps/Setup/LanStepView.swift b/RouterOSAssistant/Features/Wizard/Steps/Setup/LanStepView.swift index d22271a..2a0f7b6 100644 --- a/RouterOSAssistant/Features/Wizard/Steps/Setup/LanStepView.swift +++ b/RouterOSAssistant/Features/Wizard/Steps/Setup/LanStepView.swift @@ -85,6 +85,7 @@ struct LanStepView: View { } .formStyle(.grouped) .navigationTitle(LocalizedStringKey(L10n.t("Heimnetzwerk einrichten", appLanguage))) +.toolbar { ToolbarItem { ManualHelpButton(anchor: ManualAnchor.stepLAN) } } } private var isStepValid: Bool { diff --git a/RouterOSAssistant/Features/Wizard/Steps/Setup/ReviewApplyView.swift b/RouterOSAssistant/Features/Wizard/Steps/Setup/ReviewApplyView.swift index b95c98c..9952edd 100644 --- a/RouterOSAssistant/Features/Wizard/Steps/Setup/ReviewApplyView.swift +++ b/RouterOSAssistant/Features/Wizard/Steps/Setup/ReviewApplyView.swift @@ -74,6 +74,7 @@ struct ReviewApplyView: View { .formStyle(.grouped) .scrollContentBackground(.hidden) .navigationTitle(LocalizedStringKey(L10n.t("Übersicht & Anwenden", appLanguage))) +.toolbar { ToolbarItem { ManualHelpButton(anchor: ManualAnchor.stepReview) } } .alert( L10n.t("Anwenden fehlgeschlagen", appLanguage), isPresented: Binding( diff --git a/RouterOSAssistant/Features/Wizard/Steps/Setup/VlanStepView.swift b/RouterOSAssistant/Features/Wizard/Steps/Setup/VlanStepView.swift index 5f367ba..2aab027 100644 --- a/RouterOSAssistant/Features/Wizard/Steps/Setup/VlanStepView.swift +++ b/RouterOSAssistant/Features/Wizard/Steps/Setup/VlanStepView.swift @@ -68,6 +68,7 @@ struct VlanStepView: View { } .formStyle(.grouped) .navigationTitle(LocalizedStringKey(L10n.t("Zusätzliche Netzwerke (VLAN)", appLanguage))) +.toolbar { ToolbarItem { ManualHelpButton(anchor: ManualAnchor.stepVLAN) } } } /// Only gates on filled-in fields while the VLAN section is actually enabled — with it off, diff --git a/RouterOSAssistant/Features/Wizard/Steps/Setup/WanStepView.swift b/RouterOSAssistant/Features/Wizard/Steps/Setup/WanStepView.swift index 4ba937e..2aff39e 100644 --- a/RouterOSAssistant/Features/Wizard/Steps/Setup/WanStepView.swift +++ b/RouterOSAssistant/Features/Wizard/Steps/Setup/WanStepView.swift @@ -60,6 +60,7 @@ struct WanStepView: View { } .formStyle(.grouped) .navigationTitle(LocalizedStringKey(L10n.t("Internet einrichten", appLanguage))) +.toolbar { ToolbarItem { ManualHelpButton(anchor: ManualAnchor.stepWAN) } } } private var isStepValid: Bool { diff --git a/RouterOSAssistant/Features/Wizard/Steps/Setup/WifiStepView.swift b/RouterOSAssistant/Features/Wizard/Steps/Setup/WifiStepView.swift index 866f1e9..cc423fd 100644 --- a/RouterOSAssistant/Features/Wizard/Steps/Setup/WifiStepView.swift +++ b/RouterOSAssistant/Features/Wizard/Steps/Setup/WifiStepView.swift @@ -49,6 +49,7 @@ struct WifiStepView: View { } .formStyle(.grouped) .navigationTitle(LocalizedStringKey(L10n.t("WLAN (falls vorhanden)", appLanguage))) +.toolbar { ToolbarItem { ManualHelpButton(anchor: ManualAnchor.stepWifi) } } } private var isStepValid: Bool { diff --git a/RouterOSAssistant/Resources/Manual.html b/RouterOSAssistant/Resources/Manual.html new file mode 100644 index 0000000..2206e10 --- /dev/null +++ b/RouterOSAssistant/Resources/Manual.html @@ -0,0 +1,2823 @@ + +RouterOS Assistant — Manual +

RouterOS Assistant — Bedienungsanleitung

+

Diese Anleitung beschreibt ausschließlich Funktionen, die live gegen +echte MikroTik-Hardware getestet und bestätigt sind (Meilensteine mit +✅ in README.md). Funktionen, die noch nicht vollständig verifiziert +sind (z.B. Teile der WLAN-Einrichtung, der neue wifiwave2-Treiber), +sind hier als solche markiert oder stehen in HANDOFF.md.

+

Hinweis zu den Abbildungen: Diese Anleitung wird von einem KI-Assistenten +gepflegt, der keinen Zugriff auf Bildschirm-/UI-Automatisierung für native +macOS-Apps hat — echte Screenshots der App können deshalb nicht erzeugt +werden. Zur Visualisierung dienen stattdessen Mermaid-Diagramme (als +vorgerenderte Bilder in Manual-assets/ eingebettet, aus derselben +Quelldatei auch direkt als Mermaid-Code lesbar). Wer echte Screenshots +ergänzen möchte: Bilder unter Manual-assets/ ablegen und per +![Beschreibung](Manual-assets/dateiname.png) einbinden.

+

Alle Feldnamen, Hilfetexte und Warnhinweise in Kapitel 5 (Experte) sind +wörtlich aus dem App-Quellcode übernommen (RouterOSSchemaCatalog.swift, +automatisiert extrahiert) — nicht paraphrasiert, damit sie exakt dem +entsprechen, was in der App tatsächlich angezeigt wird.

+
+

Inhaltsverzeichnis

+
    +
  1. Überblick & Architektur
  2. +
  3. Verbinden
  4. +
  5. Einrichten (Wizard)
  6. +
  7. Übersicht
  8. +
  9. LAN-Scanner
  10. +
  11. Experte
  12. +
  13. Sicherungen
  14. +
  15. Einstellungen
  16. +
+
+

0. Überblick & Architektur

+

RouterOS Assistant ist eine native macOS-App (SwiftUI), die MikroTik-RouterOS-Router +per geführtem Wizard einrichtet und über sechs Tabs verwaltet: Verbinden, +Einrichten, Übersicht, LAN-Scanner, Experte, Sicherungen.

+

Die App spricht mit dem Router über zwei Transportwege:

+ +

Welcher Weg genutzt wird, entscheidet die App automatisch — ohne +Konfiguration.

+

Architektur-Überblick

+

Ein DE/EN-Umschalt-Button (Landesflagge) in der Toolbar wechselt die +Sprache der App (persistiert über Neustarts). Alle sechs Tabs sind +vollständig übersetzt (statische UI-Texte, Buttons, Tooltips). Werte, die +direkt vom Router kommen (Fehlermeldungen, CLI-Befehlszeilen, Live-Log), +bleiben unübersetzt.

+
+

+

1. Verbinden

+

Verbindungsaufbau

+ + + + + + + + + + + + + + + + + + + + + + + + + +
FeldHilfetext (wörtlich aus der App)
Host„Die Adresse deines Routers im Netzwerk. Werkseinstellung bei Mikrotik ist meist 192.168.88.1.“
Benutzername„Der Admin-Benutzername deines Routers. Werkseinstellung ist meist ‚admin‘.“
Passwort„Das Passwort für diesen Benutzer. Bei unverändertem Werkszustand oft leer.“
Passwort merken„Speichert das Passwort verschlüsselt in der macOS-Schlüsselbundverwaltung, damit du es nicht jedes Mal neu eingeben musst.“
+

Ein Augen-Symbol neben dem Passwortfeld deckt die Eingabe zur Kontrolle auf.

+

Vertrauensprüfung (Trust-on-First-Use)

+

Beim ersten Verbinden zu einem Router zeigt die App einen Dialog +„Der Router hat sich mit einem unbekannten Zertifikat gemeldet“ (REST) bzw. +„...mit einem unbekannten SSH-Schlüssel gemeldet“ (SSH) — einmalig zu +bestätigen über „Vertrauen und verbinden“ (oder „Abbrechen“). Das schützt +vor einem ausgetauschten/gefälschten Gerät unter derselben IP-Adresse.

+

Bei einer REST-Verbindung können beide Dialoge nacheinander erscheinen: +den SSH-Host-Schlüssel prüft die App auch dann einmalig im Hintergrund, +weil Backup, Update-Check und Firmware-Update immer SSH brauchen — +unabhängig vom für die eigentliche Konfiguration genutzten Verbindungsweg.

+

Verbindungs- und Vertrauens-Ablauf

+

Nach dem Verbinden

+ +

Bekannte Router

+

Nach jeder erfolgreichen Verbindung merkt sich die App Host, Benutzername +und (falls vom Router gemeldet) Seriennummer. Zwei unterschiedliche Router +mit identischem Host+Benutzername (z.B. beide auf MikroTiks +Werks-Adresse 192.168.88.1/admin) bleiben dadurch getrennte Einträge, +erkennbar an der „SN: …“-Zeile; das gemerkte Passwort wird pro Gerät +getrennt im macOS-Schlüsselbund gespeichert. Der Anzeigename wird beim +ersten Mal automatisch auf die Hardware-Bezeichnung gesetzt (z.B. „hEX“), +lässt sich aber jederzeit über „Bearbeiten“ ändern — dort auch ein freies +Standort-Feld (z.B. „Keller, Serverschrank“) zur besseren Unterscheidung +mehrerer Router. Klick auf einen Eintrag füllt Host/Benutzername/Passwort +ins Formular, ohne sofort zu verbinden. Ab ca. 4 Einträgen scrollt die +Liste in sich selbst.

+

Live-Traffic-Anzeige

+

Der Punkt vor jedem Interface in der Geräte-Übersicht ist grau (kein +Link), grün (Link, aber kein Datenverkehr) oder pulsierend grün (überträgt +gerade tatsächlich Daten).

+
+

2. Einrichten (Wizard)

+

Geführter Schritt-für-Schritt-Assistent für die Grundkonfiguration. Ein +Modus-Schalter zu Beginn wählt zwischen:

+ +

Wizard-Schrittfolge

+

+

WAN (Internetanschluss)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldHilfetext
Port„Der Netzwerkport, über den dein Router mit dem Internet verbunden ist (z.B. das Kabel zu deinem Modem oder deiner Anschlussdose).“
Verbindungsart„Wie sich der Router beim Internetanbieter anmeldet. ‚Automatisch (DHCP)‘ passt für die meisten Kabel-/Glasfaseranschlüsse.“
Automatisch (DHCP)„Der Router bezieht seine Internetadresse automatisch von deinem Anbieter. Für die meisten Kabel-/Glasfaser-Anschlüsse die richtige Wahl.“
Feste IP-Adresse„Die feste IP-Adresse, die dir dein Anbieter zugewiesen hat, inklusive Netzmaske (die Zahl nach dem /, z.B. /24).“
Gateway„Die Adresse des nächsten Geräts Richtung Internet — steht meist in den Unterlagen deines Anbieters.“
PPPoE-Benutzername„Zugangsdaten von deinem Internetanbieter für die Einwahl (z.B. bei DSL-Anschlüssen).“
PPPoE-Passwort„Das zum Benutzernamen gehörende Passwort von deinem Internetanbieter.“
+

+

LAN (ein oder mehrere Netzwerke)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldHilfetext
Port„Der interne Netzwerk-Anschluss, an dem deine Geräte hängen (dein lokales Netzwerk, LAN).“
Router-Adresse„Die Adresse, unter der der Router selbst in diesem Netzwerk erreichbar ist.“
Netzbereich„Der komplette Adressbereich dieses Netzwerks (z.B. /24 erlaubt bis zu 254 Geräte).“
DHCP von„Ab welcher Adresse der Router automatisch Adressen an Geräte in diesem Netzwerk vergibt.“
DHCP bis„Bis zu welcher Adresse der Router automatisch Adressen an Geräte in diesem Netzwerk vergibt.“
Lease-Zeit„Wie lange ein Gerät seine zugewiesene Adresse behält, bevor sie erneuert werden muss.“
DNS-Server„Welcher Server Geräten in diesem Netzwerk Internetadressen in Namen übersetzt (z.B. www.google.de). Meist der Router selbst.“
Netzwerk-Isolation„Verhindert Datenverkehr zwischen diesem und allen anderen konfigurierten LAN-/VLAN-Netzwerken. Der Internetzugriff bleibt erhalten. Wird im Firewall-Schritt umgesetzt.“
+

Im Experte-Modus lassen sich mehrere physische Ports/Interfaces als +getrennte Netzwerke einrichten (Button „Weiteres LAN-Netzwerk +hinzufügen“), jeweils mit eigenem Adressbereich und optionaler +Netzwerk-Isolation. Adressfelder starten leer — das Feld selbst zeigt ein +Beispielformat, das beim Tippen verschwindet.

+

Port-Konflikt-Prüfung: wählt der Nutzer einen Port, der bereits anders +konfiguriert ist, erscheint eine Warnung mit dem Grund und der Option +„Port jetzt freimachen…“ — „Wähle oben einen anderen, freien Port — oder +mache diesen jetzt frei. Die bestehende Konfiguration wird dabei +entfernt.“ Tatsächlich ausgeführt wird das erst mit „Jetzt anwenden“ am +Ende des Assistenten — bis dahin lässt es sich rückgängig machen, indem +oben ein anderer Port gewählt wird.

+

+

VLAN (optional)

+

„Ein VLAN ist ein zusätzliches Netzwerk mit eigenem Adressbereich — z.B. +für Gäste oder smarte Geräte. Ob es vom Hauptnetzwerk abgeschottet ist, +legst du unten pro Netzwerk über ‚Von anderen Netzwerken isolieren‘ fest. +Wenn du unsicher bist, ob du das brauchst, überspring diesen Schritt +einfach.“

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldHilfetext
Name„Ein Name zur Wiedererkennung, z.B. ‚Gäste‘ oder ‚Smart Home‘.“
VLAN-ID„Eine eindeutige Nummer zur technischen Unterscheidung dieses Netzwerks. Muss nur innerhalb deines Routers einmalig sein.“
Basis-Port„Der physische Anschluss, auf dem dieses zusätzliche Netzwerk aufbaut.“
Router-Adresse„Die Adresse des Routers innerhalb dieses zusätzlichen Netzwerks.“
Netzbereich„Der komplette Adressbereich dieses zusätzlichen Netzwerks.“
DHCP von/bis„Ab/Bis zu welcher Adresse Geräte in diesem Netzwerk automatisch eine Adresse bekommen.“
+

+

WLAN (nur falls erkannt)

+

„An diesem Gerät wurde kein WLAN erkannt. Dieser Schritt wird +übersprungen.“ — sonst: „Schaltet WLAN auf diesem Funkmodul ein und +vergibt Netzwerkname und Passwort.“

+ + + + + + + + + + + + + + + + + +
FeldHilfetext
Netzwerkname (SSID)„Der Name, den Geräte in ihrer WLAN-Liste sehen und mit dem sie sich verbinden.“
Passwort„Das WLAN-Passwort (WPA2). Muss mindestens 8 Zeichen lang sein.“
+

+

Firewall-Grundschutz

+

„Schützt deinen Router und deine Geräte vor unaufgeforderten Zugriffen +aus dem Internet und ermöglicht deinen Geräten den Internetzugriff +(NAT).“ Im einfachen Modus immer aktiv; im Experte-Modus wählbar: +„Richtet einen Standard-Schutz ein: Internetfreigabe (NAT) für dein +Heimnetz, und blockiert unaufgeforderte Zugriffe aus dem Internet auf +deinen Router und deine Geräte. Bestehende, selbst eingerichtete Regeln +bleiben erhalten — die neuen Regeln werden vorangestellt.“

+

Hat der Router bereits eigene Firewall-Regeln, warnt die App zusätzlich: +„Dein Router hat bereits eigene Firewall-Regeln. Die neuen Regeln werden +vorangestellt, bestehende bleiben erhalten — prüfe nach dem Anwenden +trotzdem die Reihenfolge, z.B. über Winbox oder ‚/ip firewall filter +print‘.“

+

+

Review / Apply

+

„Vor dem Anwenden wird automatisch eine Sicherung der aktuellen +Konfiguration erstellt (Tab ‚Sicherungen‘). Ein garantiertes automatisches +Zurückrollen bei Verbindungsabbruch gibt es nicht — bei Problemen die +Sicherung im Tab ‚Sicherungen‘ verwenden oder den Router lokal +(Ethernet/Konsole) wiederherstellen.“ Jeder einzelne Befehl wird vor der +Ausführung angezeigt.

+

Der Wizard lässt sich auf einem bereits eingerichteten Router erneut +ausführen (z.B. um ein weiteres Netzwerk hinzuzufügen) — bereits +bestehende Einstellungen werden dabei nicht doppelt angelegt oder +beschädigt. „Abbrechen“ ist jederzeit über den Button oben rechts +verfügbar (Einfach- wie Experte-Modus): „Alle in diesem Assistenten +eingegebenen Werte gehen verloren“ — Bestätigungsdialog, setzt den +Assistenten auf den ersten Schritt zurück.

+
+

+

3. Übersicht

+

Grafisches Diagramm des kompletten aktuellen Router-Zustands (IST-Zustand) +— fünf Spalten, mit echten Verbindungslinien (keine Vermutungen, +abgeleitet aus den tatsächlichen RouterOS-Referenzfeldern):

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SpalteRouterOS-Bereich
InterfacesPhysische Ports, Bridges, VLANs, WireGuard, …
IP-AdressenZuweisungen aus /ip address
Pools & DHCPAdress-Pools, DHCP-Server/-Netzwerke/-Clients
Routen/ip route
Firewall & NATFilter-/NAT-Regeln, Adress-Listen
+

Nicht im Diagramm (aber über den Experte-Tab erreichbar): VPN: +PPP-Benutzer/-Profile, WLAN-Sicherheitsprofile, Queues/Bandbreiten-Steuerung, +System (Name/Uhrzeit/Scheduler/Skripte/Benutzerkonten), Werkzeuge +(Netwatch/E-Mail), Firewall: Mangle- und Raw-Regeln.

+

Verbindungsarten (Linienfarben)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ArtBedeutung (wörtlich aus der App)
VLAN → Basis-Interface„Das VLAN-Interface baut auf dem Basis-Interface auf — es ist ein eigenes, per VLAN-Kennung getrenntes Netzwerk auf demselben physischen Anschluss.“
Bridge-Port„Dieser physische Port ist Mitglied dieser Bridge — Geräte an diesem Port verhalten sich, als hingen sie am selben Kabel wie alle anderen Bridge-Ports.“
WireGuard-Peer„Dieser WireGuard-VPN-Tunnel läuft über dieses Interface.“
Interface → IP-Adresse„Diesem Interface ist diese IP-Adresse zugewiesen.“
DHCP / Pool„Diese DHCP-Komponente (Server, Pool oder Netzwerk-Optionen) gehört zu diesem Interface bzw. dieser Adresse.“
Route → Interface„Diese Route führt über dieses Interface bzw. dieses Gateway.“
Firewall/NAT → Interface„Diese Firewall- oder NAT-Regel bezieht sich auf dieses Interface (als Eingang oder Ausgang).“
Adress-Liste → Regel„Diese Regel prüft, ob eine Adresse in dieser Adress-Liste steht.“
+

Interaktion

+ +

Fokus-Modus

+

Klick auf einen Knoten öffnet ein schwebendes Popup mit der kompletten +verbundenen Kette (alle direkt und indirekt verbundenen Elemente, +transitive Hülle) im selben Spalten-Layout wie oben, sauber neu +angeordnet; alles andere im Hauptdiagramm wird abgedunkelt. Schließen +über den X-Button oben im Popup, Klick auf die leere Fläche daneben, oder +erneuten Klick auf denselben Knoten. Da es sich um ein nicht-modales +Overlay handelt (kein System-Sheet), bleibt die rechte Seitenleiste +währenddessen bedienbar — ein Knoten aus der Kette lässt sich also direkt +aus dem Popup heraus über „Bearbeiten“ ändern. Die Popup-Größe passt sich +automatisch dem Inhalt an, ohne Scrollbalken.

+

Fokus-Modus: Zustände

+

Direktes Bearbeiten

+

IP-Adressen, Pools, DHCP-Server/-Netzwerke/-Clients, Routen, +Firewall-Filter-/NAT-Regeln, WireGuard-Peers und Interfaces (Ethernet, +Bridge, WLAN, VLAN, WireGuard) lassen sich anklicken und über +„Bearbeiten“ direkt ändern — schreibt sofort an den Router zurück. +Adress-Listen-Knoten sind hier noch nicht direkt editierbar, nur über den +Experte-Tab, da ein Knoten dort mehrere Einträge zusammenfasst. Dynamische/ +automatisch angelegte Routen (z.B. die Verbindungsroute eines Netzwerks) +zeigen bewusst keinen Bearbeiten-Button, da RouterOS solche Einträge +selbst verwaltet.

+
+

+

4. LAN-Scanner

+

Zeigt alle Geräte im Netzwerk (aus DHCP-Leases und ARP-Tabelle), +gruppiert nach physischem Port. „Neu scannen“ fragt Leases/ARP/ +Bridge-Host-Tabelle erneut ab. Jede Port-Überschrift zeigt zusätzlich den +aktuellen Live-Durchsatz in MB/s (↓/↑, grünes Symbol bei aktivem +Datenverkehr, graues im Leerlauf, Abfrage alle 0,1s) mit kleinem +Liniendiagramm der letzten 30 Sekunden. Spalten: Name, IP-Adresse, +MAC-Adresse, Status.

+

Alle Aktionen zu einem Gerät liegen im „Aktionen“-Button (•••) hinter der +jeweiligen Zeile:

+ +

Alle drei Ergebnis-Popups (Rohdaten, Netzwerk-Test, Port-Scan) teilen +dasselbe Layout: fester Kopfbereich mit Titel + X-Button zum Schließen, +darunter der scrollbare Inhalt — derselbe Aufbau wie beim Fokus-Popup der +Übersicht und beim Experte-Bearbeiten-Formular (siehe Kapitel 3 und 5).

+
+

+

5. Experte

+

Direkter, kuratierter Zugriff auf die meisten RouterOS-Bereiche. Für +jedes Feld gibt es einen Hilfetext mit Format-Beispiel. Kategorien sind +einklappbar (Standard: zugeklappt) — Klick auf die größere, farblich +hinterlegte Überschrift klappt sie auf/zu.

+

Eigener Menüpfad: jeder RouterOS-Menüpfad ist erreichbar, auch ohne +kuratiertes Formular — Felder erscheinen dann generisch als +Schlüssel/Wert-Paare. Auch bei kuratierten Menüs landet jedes von +RouterOS zusätzlich gelieferte, nicht kuratierte Feld automatisch im +Bereich „Weitere Parameter (frei)“ — nichts, was RouterOS unterstützt, ist +dadurch unerreichbar, auch wenn es (noch) kein eigenes Formularfeld hat.

+

Vor jeder Änderung: Bestätigungsdialog mit dem exakten Befehl, der +ausgeführt wird. Automatisches Backup einmal pro Verbindungssitzung vor +der ersten Änderung.

+

Das Bearbeiten-Formular selbst hat denselben festen Kopfbereich +(Titel + X-Button, bleibt beim Scrollen sichtbar) wie das Fokus-Popup der +Übersicht und die Ergebnis-Popups des LAN-Scanners — ein einheitliches +Schließen-Verhalten in der ganzen App.

+

Die folgende Referenz ist automatisiert aus RouterOSSchemaCatalog.swift +extrahiert — Feldname, RouterOS-Parametername, Feldtyp, Pflicht-Status, +Vorbelegung und Hilfetext entsprechen exakt dem, was in der App angezeigt +wird. „Verweis auf bestehenden Eintrag“ bedeutet: die App lädt beim Öffnen +live die existierenden Namen aus dem referenzierten Menü und zeigt sie als +Auswahlliste. „Auswahl aus Live-Interface-Liste“ lädt beim Öffnen die +aktuell am Router vorhandenen Interfaces.

+ +

System

+

+

Router-Name (Einstellungsmenü — genau ein Eintrag, kein Anlegen/Löschen)

+

RouterOS-Menü: /system identity · REST-Pfad: system/identity

+

Der Name, unter dem sich der Router meldet (z.B. in Winbox/Terminal-Prompt).

+ + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
NamenameTextJaFrei wählbar, z.B. MeinRouter.
+

+

Uhrzeit/Zeitzone (Einstellungsmenü — genau ein Eintrag, kein Anlegen/Löschen)

+

RouterOS-Menü: /system clock · REST-Pfad: system/clock

+ + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
Zeitzonetime-zone-nameTextNeinZ.B. Europe/Berlin.
+

+

Mode-Taste (Einstellungsmenü — genau ein Eintrag, kein Anlegen/Löschen)

+

RouterOS-Menü: /system routerboard mode-button · REST-Pfad: system/routerboard/mode-button

+

Steuert, welches Skript beim Drücken der physischen Mode-Taste am Router ausgeführt wird.

+

Manche RouterBOARD-Geräte (z.B. hEX, cAP, hAP ac², LtAP mini, einige CCR/CRS) haben eine physische Mode-Taste an der Seite. Hier lässt sich festlegen, ob und wie lange sie gedrückt werden muss, damit ein zuvor unter "Skripte" angelegtes Skript ausgeführt wird.

+
+

⚠️ Achtung: Ab RouterOS 7.1rc4 muss jede Aktivierung oder Änderung dieser Einstellung zusätzlich durch einen physischen Tastendruck (Reset- oder Mode-Taste) innerhalb von 60 Sekunden am Gerät selbst bestätigt werden — eine Änderung über diese App allein reicht nicht.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
AktiviertenabledJa/NeinNeinnoMode-Taste ein-/ausschalten.
Auszuführendes Skripton-eventVerweis auf bestehenden Eintrag unter /system scriptNeinName eines zuvor unter "Skripte" angelegten Skripts.
Haltedauer (Min..Max)hold-timeTextNeinWie lange die Taste gedrückt gehalten werden muss, als Zeitspanne Min..Max, z.B. "3s..5s". Verfügbar ab RouterOS 6.47beta60.
+

+

Zeitserver (NTP) (Einstellungsmenü — genau ein Eintrag, kein Anlegen/Löschen)

+

RouterOS-Menü: /system ntp client · REST-Pfad: system/ntp/client

+

Hält die Router-Uhr über einen Zeitserver synchron.

+

Die Server-Liste selbst liegt in einem eigenen Menü ("NTP-Zeitserver-Liste") — hier nur Ein/Aus und Modus.

+
+

⚠️ Achtung: Falsche Systemzeit kann Zertifikatsprüfungen (HTTPS/REST) und Log-Zeitstempel durcheinanderbringen.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
AktiviertenabledJa/NeinNeinyesZeitsynchronisation ein-/ausschalten.
ModusmodeAuswahl (fest): unicast, broadcast, multicast, manycastNeinunicastFast immer "unicast" (direkte Anfrage an feste Server).
+

+

NTP-Zeitserver-Liste

+

RouterOS-Menü: /system ntp client servers · REST-Pfad: system/ntp/client/servers

+

Die Zeitserver, die der Client abfragt.

+

"servers" ist bei RouterOS 7.x kein Feld am NTP-Client selbst, sondern eine eigene Liste — jeder Server ist ein eigener Eintrag hier (statt kommagetrennt in einem Textfeld).

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
AdresseaddressTextJaHostname oder IP eines Zeitservers, z.B. pool.ntp.org.
DeaktiviertdisabledJa/NeinNeinnoDiesen Server deaktivieren, ohne ihn zu löschen.
KommentarcommentTextNeinNur zur eigenen Wiedererkennung.
+

+

Zeitplaner

+

RouterOS-Menü: /system scheduler · REST-Pfad: system/scheduler

+

Führt ein hinterlegtes Skript zu festen Zeiten/Intervallen aus.

+
+

⚠️ Achtung: Ein fehlerhaftes geplantes Skript kann unbeaufsichtigt wiederholt Änderungen vornehmen — vor dem Einplanen einmal manuell testen.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
NamenameTextJaFrei wählbar, z.B. taeglicher-neustart.
Startzeitstart-timeTextNeinZ.B. 00:00:00 oder "startup".
IntervallintervalZeitdauer (Tage/Std/Min/Sek, per Stepper)NeinWie oft wiederholt wird. Alles auf 0 lassen = nur einmal zur Startzeit.
Auszuführendes Skripton-eventVerweis auf bestehenden Eintrag unter /system scriptNeinName eines zuvor unter "Skripte" angelegten Skripts.
DeaktiviertdisabledJa/NeinNeinnoZeitplan inaktiv schalten, ohne ihn zu löschen.
+

+

Skripte

+

RouterOS-Menü: /system script · REST-Pfad: system/script

+

Gespeicherte RouterOS-Befehlsfolgen, die manuell oder per Scheduler ausgeführt werden.

+
+

⚠️ Achtung: Skripte laufen mit den Rechten des Routers selbst — kein Unterschied zu manuell eingegebenen Befehlen.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
NamenameTextJaFrei wählbar, z.B. backup-taeglich.
Skript-InhaltsourceTextNeinRouterOS-Befehle, z.B. ":log info "Test"".
+

+

Benutzerkonten

+

RouterOS-Menü: /user · REST-Pfad: user

+

Zugangskonten für den Router (Winbox/SSH/REST/Terminal).

+
+

⚠️ Achtung: Das zum Verbinden genutzte eigene Konto hier nicht versehentlich löschen oder herabstufen.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
BenutzernamenameTextJaFrei wählbar, z.B. admin2.
PasswortpasswordTextNeinAusreichend lang und zufällig wählen.
Rechte-GruppegroupAuswahl (fest): full, write, readNeinfullfull = Vollzugriff, write = ohne Benutzerverwaltung, read = nur lesen.
DeaktiviertdisabledJa/NeinNeinnoKonto inaktiv schalten, ohne es zu löschen.
+

+

Protokollierung

+

RouterOS-Menü: /system logging · REST-Pfad: system/logging

+

Was der Router mitschreibt und wohin (Speicher, Datei, Remote-Syslog, E-Mail).

+

Besteht aus "rules" (was protokolliert wird) und "actions" (wohin) — hier generischer Zugriff, verwandte Teile über "Eigener Menüpfad" (z.B. "/system logging action").

+

Noch kein kuratiertes Formular — alle Felder erscheinen als freie Schlüssel/Wert-Paare (siehe „Eigener Menüpfad“).

+

Interfaces (Bridge, VLAN, VPN-Tunnel...)

+

+

Alle Interfaces (generisch)

+

RouterOS-Menü: /interface · REST-Pfad: interface

+

Gemeinsame Felder, die für jedes Interface gelten, unabhängig vom Typ (Ethernet, Bridge, WLAN, WireGuard, VLAN, ...).

+

RouterOS listet hier alle Interfaces zusammen. Typ-spezifische Felder (z.B. die VLAN-ID eines VLAN-Interfaces) liegen in den jeweils eigenen Menüs (z.B. "VLAN-Interfaces") — hier nur das, was für jeden Interface-Typ gleich funktioniert.

+
+

⚠️ Achtung: RouterOS liefert hier zusätzlich einen "default-name" (Werksname des Ports) mit — der erscheint unten bei "Weitere Parameter", ist aber nicht änderbar ("bad parameter default-name", live bestätigt). Zum Umbenennen nur das Feld "Name" oben verwenden.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
NamenameTextJaDer aktuelle Name dieses Interfaces, z.B. ether5 oder vlan20 — nicht zu verwechseln mit "default-name" (Werksname, weiter unten bei "Weitere Parameter", nicht änderbar).
KommentarcommentTextNeinNur zur eigenen Wiedererkennung, ohne technische Wirkung.
DeaktiviertdisabledJa/NeinNeinnoInterface inaktiv schalten, ohne es zu löschen.
+

+

Bridge

+

RouterOS-Menü: /interface bridge · REST-Pfad: interface/bridge

+

Fasst mehrere physische Ports zu einem gemeinsamen Layer-2-Netzwerk zusammen.

+

Geräte an gebrückten Ports verhalten sich, als hingen sie am selben Netzwerk-Kabel. Eine IP-Adresse wird meist auf die Bridge selbst gelegt, nicht auf die einzelnen Ports.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
NamenameTextJaFrei wählbar, z.B. bridge-lan.
VLAN-Filterung (802.1Q)vlan-filteringJa/NeinNeinnoAktiviert echte VLAN-Trennung über diese Bridge — nötig, wenn mehrere VLANs über dieselben Bridge-Ports laufen sollen.
DeaktiviertdisabledJa/NeinNeinnoBridge inaktiv schalten, ohne sie zu löschen.
+

+

Bridge-Ports

+

RouterOS-Menü: /interface bridge port · REST-Pfad: interface/bridge/port

+

Ordnet einen physischen Port einer Bridge zu.

+

Erst danach ist der Port Teil des Bridge-Netzwerks.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
BridgebridgeTextJaName der Bridge, z.B. bridge-lan.
Physischer PortinterfaceAuswahl aus Live-Interface-Liste des RoutersJaDer Port, der der Bridge hinzugefügt wird, z.B. ether2.
Port-VLAN-ID (PVID)pvidZahlNeinNur mit aktivierter VLAN-Filterung relevant: VLAN, dem untagged ankommender Verkehr an diesem Port zugeordnet wird, z.B. 20.
+

+

VLAN-Interfaces

+

RouterOS-Menü: /interface vlan · REST-Pfad: interface/vlan

+

Virtuelle, getaggte Sub-Interfaces auf einem physischen Port oder einer Bridge.

+

Ein eigenes logisches Netzwerk auf demselben Kabel, unterschieden durch eine VLAN-Kennung im Ethernet-Rahmen.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
NamenameTextJaFrei wählbar, z.B. vlan20-gaeste.
VLAN-IDvlan-idZahlJaEindeutige Kennung, 2–4094, z.B. 20.
Basis-InterfaceinterfaceAuswahl aus Live-Interface-Liste des RoutersJaPhysischer Port oder Bridge, auf dem dieses VLAN aufsetzt, z.B. bridge.
DeaktiviertdisabledJa/NeinNeinnoVLAN-Interface inaktiv schalten, ohne es zu löschen.
+

+

WireGuard-Interfaces

+

RouterOS-Menü: /interface wireguard · REST-Pfad: interface/wireguard

+

Moderner, schlanker VPN-Tunnel-Typ.

+

Ein WireGuard-Interface allein stellt noch keine Verbindung her — dazu gehören Gegenstellen (siehe "WireGuard-Peers") mit öffentlichem Schlüssel und erlaubten Adressen.

+
+

⚠️ Achtung: Erst hier das Interface anlegen (mit Listen-Port), danach unter WireGuard-Peers die Gegenstellen eintragen. Der private Schlüssel wird beim Anlegen automatisch erzeugt, falls nicht angegeben.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
NamenameTextJaFrei wählbar, z.B. wg-heim.
Listen-Port (UDP)listen-portZahlNein51820Port, auf dem dieser Tunnel auf eingehende Verbindungen lauscht, z.B. 51820.
Privater Schlüsselprivate-keyTextNeinGeheim halten. Leer lassen, damit RouterOS automatisch einen erzeugt.
DeaktiviertdisabledJa/NeinNeinnoInterface inaktiv schalten, ohne es zu löschen.
+

+

WireGuard-Peers

+

RouterOS-Menü: /interface wireguard peers · REST-Pfad: interface/wireguard/peers

+

Gegenstellen (Clients/andere Router) eines WireGuard-Tunnels.

+

Jede Gegenstelle braucht ihren eigenen öffentlichen Schlüssel und eine Angabe, welche Adressen über sie geroutet werden.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
WireGuard-InterfaceinterfaceVerweis auf bestehenden Eintrag unter /interface wireguardJaName des zuvor angelegten WireGuard-Interfaces.
Öffentlicher Schlüssel der Gegenstellepublic-keyTextJaVom Gerät der Gegenstelle kopieren (z.B. per "wg show public-key").
Erlaubte Adressenallowed-addressTextNeinWelche IP-Adressen/Netze über diesen Peer laufen dürfen, mit Präfix, z.B. 10.10.10.2/32.
Feste Adresse der Gegenstelleendpoint-addressTextNeinNur nötig, wenn diese Gegenstelle selbst erreichbar sein muss (Site-to-Site), z.B. eine feste öffentliche IP oder ein DNS-Name. Bei Roadwarrior-Clients, die sich selbst melden, leer lassen.
Port der Gegenstelleendpoint-portTextNeinMeist derselbe Port wie der Listen-Port der Gegenstelle, z.B. 51820.
Keepalivepersistent-keepaliveZeitdauer (Tage/Std/Min/Sek, per Stepper)NeinHält die Verbindung durch NAT/Firewalls am Leben. Wichtig bei Clients hinter NAT.
+

+

PPPoE-Client

+

RouterOS-Menü: /interface pppoe-client · REST-Pfad: interface/pppoe-client

+

DSL-Einwahl-Client, meist auf dem WAN-Port.

+

Ersetzt eine feste/DHCP-WAN-Adresse durch eine PPPoE-Einwahl beim Provider.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
NamenameTextJaFrei wählbar, z.B. pppoe-wan.
Physischer PortinterfaceAuswahl aus Live-Interface-Liste des RoutersJaDer Port, über den die Einwahl läuft, meist der WAN-Port, z.B. ether1.
BenutzernameuserTextJaZugangsdaten des Providers.
PasswortpasswordTextJaZugangsdaten des Providers.
DeaktiviertdisabledJa/NeinNeinnoEinwahl inaktiv schalten, ohne sie zu löschen.
+

+

Bonding

+

RouterOS-Menü: /interface bonding · REST-Pfad: interface/bonding

+

Bündelt mehrere physische Ports zu einer logischen, ausfalltoleranten/schnelleren Verbindung.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
NamenameTextJaFrei wählbar, z.B. bond1.
Gebündelte PortsslavesTextNeinKommagetrennte Liste physischer Ports, z.B. ether2,ether3.
ModusmodeAuswahl (fest): 802.3ad, active-backup, balance-rr, balance-xor, broadcastNein802.3ad (LACP) braucht einen kompatiblen, entsprechend konfigurierten Switch.
+

IP-Adressierung & Dienste

+

+

IP-Adressen

+

RouterOS-Menü: /ip address · REST-Pfad: ip/address

+

Weist Interfaces IP-Adressen zu.

+

Jede IP-Adresse hängt an genau einem Interface (physischer Port, Bridge oder VLAN).

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
AdresseaddressTextJaIP-Adresse mit Netzmaske als Präfix (Router-Adresse in diesem Netz), z.B. 192.168.88.1/24 oder 10.10.10.1/24. Das /24 legt fest, wie viele Geräte in dieses Netz passen (/24 = bis zu 254).
InterfaceinterfaceAuswahl aus Live-Interface-Liste des RoutersJaInterface, dem diese Adresse zugewiesen wird, z.B. bridge oder ether4.
DeaktiviertdisabledJa/NeinNeinnoAdresse inaktiv schalten, ohne sie zu löschen.
+

+

Adress-Pools

+

RouterOS-Menü: /ip pool · REST-Pfad: ip/pool

+

Adressbereiche, aus denen DHCP-Server oder PPP-Profile Adressen vergeben.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
NamenameTextJaFrei wählbar, z.B. dhcp_pool_lan.
Bereich(e)rangesTextJaVon-bis-Adresse ohne Präfix, z.B. 192.168.88.10-192.168.88.254. Mehrere Bereiche kommagetrennt.
+

+

DHCP-Server

+

RouterOS-Menü: /ip dhcp-server · REST-Pfad: ip/dhcp-server

+

Vergibt automatisch IP-Adressen an Geräte in einem Netzwerk.

+

Für die üblichen Fälle deckt das bereits der Einrichten-Assistent (LAN-/VLAN-Schritt) ab — hier direkter Zugriff für Sonderfälle.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
NamenameTextJaFrei wählbar, z.B. dhcp_lan.
InterfaceinterfaceAuswahl aus Live-Interface-Liste des RoutersJaNetzwerk, in dem dieser Server Adressen vergibt, z.B. bridge.
Adress-Pooladdress-poolVerweis auf bestehenden Eintrag unter /ip poolJaName eines zuvor angelegten Adress-Pools.
Lease-Zeitlease-timeZeitdauer (Tage/Std/Min/Sek, per Stepper)NeinWie lange ein Gerät seine Adresse behält, bevor sie erneuert werden muss, z.B. 1d oder 12h.
DeaktiviertdisabledJa/NeinNeinnoDHCP-Server inaktiv schalten, ohne ihn zu löschen.
+

+

DHCP-Netzwerke

+

RouterOS-Menü: /ip dhcp-server network · REST-Pfad: ip/dhcp-server/network

+

Gateway/DNS/Optionen, die ein DHCP-Server an seine Klienten verteilt.

+

Getrennt vom DHCP-Server selbst, weil dieselben Netzwerk-Optionen für mehrere DHCP-Server gelten können.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
NetzaddressTextJaFür dieses Netz gelten die folgenden Optionen — die Netzadresse mit Präfix, z.B. 192.168.88.0/24.
GatewaygatewayTextJaIn der Regel die Router-Adresse in diesem Netz, ohne Präfix, z.B. 192.168.88.1.
DNS-Serverdns-serverTextNeinMeist der Router selbst, z.B. 192.168.88.1. Mehrere Server kommagetrennt möglich.
+

+

DHCP-Client (WAN)

+

RouterOS-Menü: /ip dhcp-client · REST-Pfad: ip/dhcp-client

+

Bezieht automatisch eine IP-Adresse vom Internetanbieter.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
InterfaceinterfaceAuswahl aus Live-Interface-Liste des RoutersJaMeist der WAN-Port, z.B. ether1.
Standardroute übernehmenadd-default-routeJa/NeinNeinyesÜbernimmt die vom Provider mitgeteilte Standardroute ins Internet.
DNS-Server übernehmenuse-peer-dnsJa/NeinNeinyesÜbernimmt die vom Provider mitgeteilten DNS-Server.
DeaktiviertdisabledJa/NeinNeinnoDHCP-Client inaktiv schalten, ohne ihn zu löschen.
+

+

DNS-Einstellungen (Einstellungsmenü — genau ein Eintrag, kein Anlegen/Löschen)

+

RouterOS-Menü: /ip dns · REST-Pfad: ip/dns

+

Namensauflösung des Routers selbst (und optional als DNS-Server fürs LAN).

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
DNS-ServerserversTextNeinEin oder mehrere Server, kommagetrennt, z.B. 1.1.1.1,8.8.8.8.
Als DNS-Server fürs LAN erlaubenallow-remote-requestsJa/NeinNeinnoLässt Geräte im LAN den Router selbst als DNS-Server nutzen. Ohne das schlagen DNS-Anfragen von Geräten an den Router fehl, selbst wenn sie ihn als DNS-Server eingetragen haben.
+

+

Verwaltungsdienste

+

RouterOS-Menü: /ip service · REST-Pfad: ip/service

+

Schaltet Zugriffswege auf den Router (Winbox, API, SSH, WWW/REST, Telnet, FTP) an/aus und ändert deren Port.

+

Jeder aktive Dienst ist ein potenzieller Angriffspunkt aus dem jeweils erreichbaren Netz — nicht benötigte Dienste deaktivieren.

+
+

⚠️ Achtung: Den gerade genutzten Zugriffsweg hier abzuschalten oder umzuportieren kann die eigene Verbindung sofort kappen — Vorsicht bei www-ssl (REST-API dieser App) und ssh.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
DienstnameAuswahl (fest): www, www-ssl, ssh, api, api-ssl, winbox, ftp, telnetJaWelcher Verwaltungsdienst geändert wird.
PortportZahlNeinAuf welchem Port der Dienst lauscht, z.B. 22 für ssh.
Erlaubt vonavailable-fromTextNeinOptional: nur von dieser Adresse/diesem Netz aus erreichbar, mit Präfix, z.B. 192.168.88.0/24.
DeaktiviertdisabledJa/NeinNeinnoDienst inaktiv schalten, ohne den Eintrag zu löschen.
+

+

Hotspot

+

RouterOS-Menü: /ip hotspot · REST-Pfad: ip/hotspot

+

Login-Portal für Gäste-WLAN/-LAN mit Umleitung auf eine Anmeldeseite.

+

Besteht aus mehreren zusammenhängenden Teilen (Server, Server-Profil, Benutzer-Profil, Benutzer) — hier generischer Zugriff auf "/ip hotspot" selbst, verwandte Teile über "Eigener Menüpfad" (z.B. "/ip hotspot user").

+

Noch kein kuratiertes Formular — alle Felder erscheinen als freie Schlüssel/Wert-Paare (siehe „Eigener Menüpfad“).

+

Routing

+

+

Statische Routen

+

RouterOS-Menü: /ip route · REST-Pfad: ip/route

+

Feste, manuell eingetragene Wegewahl zu Netzen, die nicht direkt angeschlossen sind.

+

Für alles außer "Standard-Internet über eine WAN-Schnittstelle" (das übernimmt bereits die DHCP-Client-/PPPoE-Route automatisch).

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
Zielnetzdst-addressTextJaNetz mit Präfix, z.B. 10.0.0.0/24, oder 0.0.0.0/0 für eine Standardroute.
GatewaygatewayTextJaNächster Hop — IP-Adresse ohne Präfix (z.B. 192.168.88.254) oder Name eines Interfaces (z.B. ether1).
DistanzdistanceZahlNeinPriorität bei mehreren passenden Routen zum selben Ziel — kleinere Zahl wird bevorzugt, z.B. 1.
KommentarcommentTextNeinNur zur eigenen Wiedererkennung.
DeaktiviertdisabledJa/NeinNeinnoRoute inaktiv schalten, ohne sie zu löschen.
+

+

OSPF-Instanzen

+

RouterOS-Menü: /routing ospf instance · REST-Pfad: routing/ospf/instance

+

Dynamisches Innennetz-Routing-Protokoll — tauscht Routen automatisch mit anderen OSPF-Routern aus.

+

Nur relevant, wenn mehrere Router im selben Netz eigenständig Routen lernen sollen.

+
+

⚠️ Achtung: Fehlkonfiguriertes OSPF kann Routen zu bestehenden Netzen überschreiben. Nur mit Netzwerkplan einsetzen.

+
+

Noch kein kuratiertes Formular — alle Felder erscheinen als freie Schlüssel/Wert-Paare (siehe „Eigener Menüpfad“).

+

+

BGP-Verbindungen

+

RouterOS-Menü: /routing bgp connection · REST-Pfad: routing/bgp/connection

+

Routing-Protokoll für Verbindungen zwischen unabhängigen Netzen/Providern.

+

Für Privat-/Kleinnetz i.d.R. nicht nötig — relevant bei eigenem Provider-unabhängigem Adressraum (Multihoming).

+

Noch kein kuratiertes Formular — alle Felder erscheinen als freie Schlüssel/Wert-Paare (siehe „Eigener Menüpfad“).

+

VPN-Server/Clients

+

+

PPP-Benutzer

+

RouterOS-Menü: /ppp secret · REST-Pfad: ppp/secret

+

Zugangsdaten für PPPoE-/L2TP-/PPTP-/OpenVPN-Einwahl in den Router.

+

Jeder Benutzer kann optional einem Profil zugeordnet werden, das IP-Pool/DNS/Verschlüsselung vorgibt.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
BenutzernamenameTextJaFrei wählbar, z.B. gast1.
PasswortpasswordTextJaAusreichend lang und zufällig wählen.
DienstserviceAuswahl (fest): any, pppoe, l2tp, pptp, ovpn, sstpNeinanyFür welche Einwahl-Art dieser Benutzer gilt.
ProfilprofileVerweis auf bestehenden Eintrag unter /ppp profileNeinName eines zuvor angelegten PPP-Profils.
Lokale Adresselocal-addressTextNeinIP-Adresse des Routers innerhalb dieser Verbindung, ohne Präfix, z.B. 10.10.10.1.
Adresse für den Clientremote-addressTextNeinFeste IP für diesen Benutzer (z.B. 10.10.10.2), oder Name eines Adress-Pools.
DeaktiviertdisabledJa/NeinNeinnoBenutzer inaktiv schalten, ohne ihn zu löschen.
+

+

PPP-Profile

+

RouterOS-Menü: /ppp profile · REST-Pfad: ppp/profile

+

Vorlagen (IP-Pool, DNS, Verschlüsselung) für PPP-Benutzer.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
NamenameTextJaFrei wählbar, z.B. vpn-clients.
Lokale Adresselocal-addressTextNeinIP-Adresse des Routers, ohne Präfix, z.B. 10.10.10.1.
Adress-Pool für Clientsremote-addressTextNeinName eines zuvor angelegten Adress-Pools.
DNS-Server für Clientsdns-serverTextNeinEin oder mehrere Server, kommagetrennt, z.B. 1.1.1.1,8.8.8.8.
+

+

L2TP-VPN-Server

+

RouterOS-Menü: /interface l2tp-server server · REST-Pfad: interface/l2tp-server/server

+

Nimmt eingehende L2TP-VPN-Einwahlen entgegen.

+

Ein einzelnes Server-weites An/Aus mit gemeinsamen Verschlüsselungs-Einstellungen — Benutzer selbst kommen von "PPP-Benutzer".

+

Noch kein kuratiertes Formular — alle Felder erscheinen als freie Schlüssel/Wert-Paare (siehe „Eigener Menüpfad“).

+

+

OpenVPN-Server

+

RouterOS-Menü: /interface ovpn-server server · REST-Pfad: interface/ovpn-server/server

+

Nimmt eingehende OpenVPN-Einwahlen entgegen.

+

Braucht zusätzlich ein Zertifikat ("/certificate") — Benutzer selbst kommen von "PPP-Benutzer".

+

Noch kein kuratiertes Formular — alle Felder erscheinen als freie Schlüssel/Wert-Paare (siehe „Eigener Menüpfad“).

+

WLAN / CAPsMAN

+

+

WLAN (Legacy-Treiber)

+

RouterOS-Menü: /interface wireless · REST-Pfad: interface/wireless

+

WLAN-Interfaces auf älteren/Standard-Wireless-Chips.

+

Diese Interfaces existieren bereits ab Werk (ein WLAN-Chip = ein Interface) — hier werden sie nur konfiguriert, nicht neu angelegt. Ein Sicherheitsprofil (siehe "WLAN-Sicherheitsprofile") muss vorher angelegt sein.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
Netzwerkname (SSID)ssidTextJaDer Name, den WLAN-Geräte in der Netzwerkliste sehen, z.B. MeinWLAN.
Sicherheitsprofilsecurity-profileTextNeinName eines zuvor unter "WLAN-Sicherheitsprofile" angelegten Profils.
ModusmodeAuswahl (fest): ap-bridge, station, bridgeNeinap-bridgeap-bridge = Access Point (Normalfall), station = als Client mit einem anderen AP verbinden.
DeaktiviertdisabledJa/NeinNeinnoWLAN-Interface inaktiv schalten, ohne es zu löschen.
+

+

WLAN-Sicherheitsprofile

+

RouterOS-Menü: /interface wireless security-profiles · REST-Pfad: interface/wireless/security-profiles

+

Verschlüsselung/Passwort-Vorlagen für WLAN-Interfaces (Legacy-Treiber).

+

Ein Profil wird angelegt und dann bei einem WLAN-Interface als "security-profile" eingetragen.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
NamenameTextJaFrei wählbar, z.B. heimnetz-wpa2.
ModusmodeAuswahl (fest): none, static-keys-required, dynamic-keysNeindynamic-keysdynamic-keys ist der übliche WPA/WPA2-Modus.
Authentifizierungauthentication-typesAuswahl (fest): wpa-psk, wpa2-psk, wpa-psk,wpa2-psk, wpa-eap, wpa2-eapNeinwpa2-psk = WPA2 mit gemeinsamem Passwort (Heimnetz-Standard).
WPA2-Passwortwpa2-pre-shared-keyTextNeinMindestens 8 Zeichen.
+

+

WLAN (neuer wifiwave2/802.11ax-Treiber)

+

RouterOS-Menü: /interface wifi · REST-Pfad: interface/wifi

+

WLAN-Interfaces auf neueren Wireless-Chips.

+

Anderes, verschachteltes Konfigurationsschema als der Legacy-Treiber (Punkt-Notation wie "security.passphrase") — nicht mit "/interface wireless" mischen. Nur auf Geräten mit entsprechend neuem WLAN-Chip vorhanden.

+
+

⚠️ Achtung: Diese App hat den .set-Pfad für den neuen Treiber noch nie gegen echte Hardware getestet (siehe HANDOFF.md) — nach dem Anwenden unbedingt prüfen.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
Netzwerkname (SSID)ssidTextJaDer Name, den WLAN-Geräte in der Netzwerkliste sehen, z.B. MeinWLAN.
Authentifizierungsecurity.authentication-typesAuswahl (fest): wpa2-psk, wpa3-psk, wpa2-psk,wpa3-pskNeinwpa2-psk,wpa3-psk deckt sowohl ältere als auch neuere Geräte ab.
Passwortsecurity.passphraseTextNeinMindestens 8 Zeichen.
Ziel-Bridgedatapath.bridgeTextNeinName der Bridge, der dieses WLAN-Netz zugeordnet wird (üblicherweise dieselbe wie das kabelgebundene LAN), z.B. bridge.
DeaktiviertdisabledJa/NeinNeinnoWLAN-Interface inaktiv schalten, ohne es zu löschen.
+

+

CAPsMAN-Zentrale

+

RouterOS-Menü: /caps-man manager · REST-Pfad: caps-man/manager

+

Zentrale Verwaltung mehrerer WLAN-Access-Points von einem Router aus.

+

Nur relevant mit mehreren WLAN-Access-Points, die zentral verwaltet werden sollen — eigenes, umfangreiches Konfigurationsschema (Konfigurationen/Kanäle/Datapaths).

+

Noch kein kuratiertes Formular — alle Felder erscheinen als freie Schlüssel/Wert-Paare (siehe „Eigener Menüpfad“).

+

Firewall: Filter-Regeln

+

+

Filter-Regeln

+

RouterOS-Menü: /ip firewall filter · REST-Pfad: ip/firewall/filter

+

Entscheidet, ob Pakete durchgelassen (accept), verworfen (drop/reject) oder weiter geprüft werden.

+

input = Zugriffe auf den Router selbst, forward = Verkehr, der durch den Router hindurchgeht (z.B. LAN↔Internet oder zwischen zwei Netzen), output = vom Router ausgehender Verkehr. Regeln werden von oben nach unten geprüft; die erste passende Regel entscheidet.

+
+

⚠️ Achtung: Reihenfolge zählt. Neue Regeln landen am Ende der Liste — eine bereits vorhandene, weiter oben stehende Regel kann eine neue Regel unerreichbar machen. Position danach mit "/ip firewall filter print" kontrollieren, notfalls mit "move" verschieben.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
ChainchainTextJaforwardinput = an den Router, forward = durch den Router, output = vom Router aus. Eigene Chains (Sprungziele über "jump") sind ebenfalls möglich. Beispiel: forward
AktionactionAuswahl (fest): accept, drop, reject, log, jump, return, add-src-to-address-list, add-dst-to-address-list, fasttrack-connection, passthroughJaacceptWas mit passenden Paketen geschieht. reject schickt zusätzlich eine Fehlermeldung zurück, drop verwirft stillschweigend.
Quell-Adressesrc-addressTextNeinEinzel-IP oder Netz mit Präfix, z.B. 192.168.88.5 oder 192.168.88.0/24. Leer = beliebig.
Ziel-Adressedst-addressTextNeinEinzel-IP oder Netz mit Präfix, z.B. 192.168.88.5 oder 192.168.88.0/24. Leer = beliebig.
Quelle in Adress-Listesrc-address-listVerweis auf bestehenden Eintrag unter /ip firewall address-listNeinNur Pakete, deren Absender in dieser zuvor angelegten Adress-Liste steht.
Ziel in Adress-Listedst-address-listVerweis auf bestehenden Eintrag unter /ip firewall address-listNeinNur Pakete, deren Ziel in dieser zuvor angelegten Adress-Liste steht.
Eingangs-Interfacein-interfaceAuswahl aus Live-Interface-Liste des RoutersNeinNur Pakete, die über dieses Interface hereinkommen, z.B. ether1 oder bridge.
Ausgangs-Interfaceout-interfaceAuswahl aus Live-Interface-Liste des RoutersNeinNur Pakete, die über dieses Interface hinausgehen, z.B. ether1 oder bridge.
ProtokollprotocolAuswahl (fest): tcp, udp, icmp, gre, ipsec-esp, ipsec-ahNeinIP-Protokoll. Leer = alle.
Ziel-Port(s)dst-portTextNeinNur bei tcp/udp sinnvoll. Einzelner Port (z.B. 80) oder Bereich (z.B. 8000-8100).
Verbindungsstatusconnection-stateAuswahl (fest): new, established, related, invalid, untrackedNeinStatus laut Connection-Tracking. "established,related" ist die übliche "schon erlaubte Verbindung"-Regel.
Layer7-Protokolllayer7-protocolTextNeinName eines vorher unter "/ip firewall layer7-protocol" angelegten Musters (z.B. Erkennung bestimmter Apps). Kostet spürbar CPU, mit Bedacht einsetzen.
KommentarcommentTextNeinNur zur eigenen Wiedererkennung, ohne technische Wirkung.
DeaktiviertdisabledJa/NeinNeinnoRegel inaktiv schalten, ohne sie zu löschen.
+

Firewall: NAT (Portweiterleitung etc.)

+

+

NAT-Regeln

+

RouterOS-Menü: /ip firewall nat · REST-Pfad: ip/firewall/nat

+

Übersetzt Adressen — Internetfreigabe (srcnat/masquerade) und Portweiterleitung (dstnat).

+

srcnat ändert die Absenderadresse ausgehender Pakete (z.B. private LAN-IP → öffentliche WAN-IP). dstnat ändert die Zieladresse eingehender Pakete (z.B. Anfrage an die WAN-IP auf Port 80 → internen Server auf 192.168.88.10:80 umleiten).

+
+

⚠️ Achtung: Eine dstnat-Regel (Portweiterleitung) macht ein internes Gerät direkt aus dem Internet erreichbar — nur für Dienste einrichten, die das wirklich sein sollen, und danach den entsprechenden Port in der Filter-Tabelle nicht blockieren.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
ChainchainAuswahl (fest): srcnat, dstnatJasrcnatsrcnat = Absenderadresse ändern (Internetfreigabe). dstnat = Zieladresse ändern (Portweiterleitung).
AktionactionAuswahl (fest): masquerade, src-nat, dst-nat, netmap, redirect, sameJamasquerademasquerade = automatisches NAT über die aktuelle WAN-IP (empfohlen bei wechselnder IP). src-nat = feste NAT-Adresse. dst-nat = Ziel umschreiben (Portweiterleitung). redirect = auf den Router selbst umlenken.
Quell-Adressesrc-addressTextNeinEinzel-IP oder Netz mit Präfix, z.B. 192.168.88.0/24. Leer = beliebig.
Ziel-Adressedst-addressTextNeinEinzel-IP oder Netz mit Präfix, z.B. 192.168.88.0/24. Leer = beliebig.
Eingangs-Interfacein-interfaceAuswahl aus Live-Interface-Liste des RoutersNeinBei dstnat meist der WAN-Port (woher die Anfrage aus dem Internet kommt), z.B. ether1.
Ausgangs-Interfaceout-interfaceAuswahl aus Live-Interface-Liste des RoutersNeinBei srcnat/masquerade meist der WAN-Port, z.B. ether1.
ProtokollprotocolAuswahl (fest): tcp, udp, icmpNeinNötig, damit Ports geprüft werden können.
Ziel-Port der Anfragedst-portTextNeinDer Port, auf den die Anfrage von außen ankommt, z.B. 8080.
Weiterleiten an (interne IP)to-addressesTextNeinNur bei dst-nat: die interne IP-Adresse, an die weitergeleitet wird, z.B. 192.168.88.10.
Weiterleiten an (interner Port)to-portsTextNeinNur bei dst-nat: interner Port, falls abweichend vom Ziel-Port (z.B. extern 8080 → intern 80).
KommentarcommentTextNeinNur zur Wiedererkennung.
DeaktiviertdisabledJa/NeinNeinnoRegel inaktiv schalten, ohne sie zu löschen.
+

Firewall: Mangle (Markierung/QoS-Vorbereitung)

+

+

Mangle-Regeln

+

RouterOS-Menü: /ip firewall mangle · REST-Pfad: ip/firewall/mangle

+

Markiert Verbindungen/Pakete zur späteren Weiterverarbeitung (z.B. durch Queues).

+

Mangle selbst verändert nicht, wie ein Paket behandelt wird — es klebt nur eine Markierung darauf. Erst eine andere Regel (typischerweise eine Queue oder eine Routing-Regel), die genau diese Markierung als Bedingung abfragt, wird dadurch wirksam.

+
+

⚠️ Achtung: Eine Markierung ohne etwas, das sie auswertet (z.B. keine passende Queue), hat keinerlei sichtbaren Effekt — das ist der häufigste Verwirrungspunkt bei Mangle.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
ChainchainAuswahl (fest): prerouting, input, forward, output, postroutingJaforwardVerarbeitungspunkt im Router-internen Paketfluss.
AktionactionAuswahl (fest): mark-connection, mark-packet, mark-routing, change-mss, change-ttl, set-priority, accept, passthroughJamark-connectionmark-connection markiert die ganze Verbindung (wirkt auf alle ihre Pakete), mark-packet nur einzelne Pakete.
Name der Verbindungsmarkierungnew-connection-markTextNeinFrei wählbarer Name, den z.B. eine Queue später wiedererkennt.
Name der Paketmarkierungnew-packet-markTextNeinFrei wählbarer Name für die Paketmarkierung.
Weitere Mangle-Regeln noch prüfenpassthroughJa/NeinNeinyesJa (Standard) lässt nachfolgende Mangle-Regeln diese Verbindung noch zusätzlich prüfen.
Quell-Adressesrc-addressTextNeinEinzel-IP oder Netz mit Präfix, z.B. 192.168.88.0/24. Leer = beliebig.
Ziel-Adressedst-addressTextNeinEinzel-IP oder Netz mit Präfix, z.B. 192.168.88.0/24. Leer = beliebig.
Eingangs-Interfacein-interfaceAuswahl aus Live-Interface-Liste des RoutersNeinNur Pakete, die über dieses Interface hereinkommen, z.B. ether1 oder bridge.
Ausgangs-Interfaceout-interfaceAuswahl aus Live-Interface-Liste des RoutersNeinNur Pakete, die über dieses Interface hinausgehen, z.B. ether1 oder bridge.
ProtokollprotocolAuswahl (fest): tcp, udp, icmpNeinIP-Protokoll. Leer = alle.
Ziel-Port(s)dst-portTextNeinNur bei tcp/udp sinnvoll. Einzelner Port (z.B. 80) oder Bereich (z.B. 8000-8100).
KommentarcommentTextNeinNur zur Wiedererkennung.
DeaktiviertdisabledJa/NeinNeinnoRegel inaktiv schalten, ohne sie zu löschen.
+

Firewall: Raw (vor Connection-Tracking)

+

+

Raw-Regeln

+

RouterOS-Menü: /ip firewall raw · REST-Pfad: ip/firewall/raw

+

Läuft vor jeder Connection-Tracking-Verarbeitung — meist zur Entlastung oder für DDoS-Grobfilter.

+

Regeln hier greifen, bevor RouterOS eine Verbindung überhaupt "kennt" (Connection-Tracking). Damit lässt sich z.B. bekannt uninteressanter Verkehr sehr günstig verwerfen, oder gezielt vom Tracking ausnehmen (notrack).

+
+

⚠️ Achtung: notrack nimmt den betroffenen Verkehr aus dem Connection-Tracking heraus — danach greifen dafür keine Filter-/NAT-Regeln mehr, die sich auf connection-state oder NAT verlassen. Nur gezielt einsetzen.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
ChainchainAuswahl (fest): prerouting, outputJapreroutingprerouting = eingehende Pakete, bevor der Router sie verarbeitet. output = vom Router selbst erzeugte Pakete.
AktionactionAuswahl (fest): accept, drop, notrackJaacceptnotrack = von der Connection-Tracking-Verfolgung ausnehmen (siehe Warnhinweis oben).
Quell-Adressesrc-addressTextNeinEinzel-IP oder Netz mit Präfix, z.B. 192.168.88.0/24. Leer = beliebig.
Ziel-Adressedst-addressTextNeinEinzel-IP oder Netz mit Präfix, z.B. 192.168.88.0/24. Leer = beliebig.
Eingangs-Interfacein-interfaceAuswahl aus Live-Interface-Liste des RoutersNeinNur Pakete, die über dieses Interface hereinkommen, z.B. ether1.
ProtokollprotocolAuswahl (fest): tcp, udp, icmpNeinIP-Protokoll. Leer = alle.
Ziel-Port(s)dst-portTextNeinNur bei tcp/udp sinnvoll. Einzelner Port (z.B. 80) oder Bereich (z.B. 8000-8100).
KommentarcommentTextNeinNur zur eigenen Wiedererkennung.
DeaktiviertdisabledJa/NeinNeinnoRegel inaktiv schalten, ohne sie zu löschen.
+

Firewall: Adress-Listen

+

+

Adress-Listen

+

RouterOS-Menü: /ip firewall address-list · REST-Pfad: ip/firewall/address-list

+

Benannte Gruppen von IP-Adressen/Netzen, die Filter/NAT/Mangle-Regeln als Bedingung referenzieren können.

+

Statt in jeder Regel einzelne IPs aufzuzählen, legst du hier eine benannte Liste an (z.B. "gesperrt" oder "vertraut") und verweist in Filter-/NAT-/Mangle-Regeln per "src-address-list"/"dst-address-list" darauf. Einträge können dauerhaft oder mit Ablaufzeit (timeout) sein.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
Listen-NamelistTextJaFrei wählbarer Name, wird in anderen Regeln referenziert, z.B. gesperrt.
AdresseaddressTextJaEinzel-IP oder Netz mit Präfix, z.B. 192.168.88.5 oder 10.0.0.0/24.
AblaufzeittimeoutZeitdauer (Tage/Std/Min/Sek, per Stepper)NeinOptional. Nach dieser Zeit wird der Eintrag automatisch entfernt. Alles auf 0 lassen = bleibt dauerhaft, bis manuell entfernt.
KommentarcommentTextNeinNur zur eigenen Wiedererkennung.
+

Queues / Bandbreiten-Steuerung

+

+

Einfache Bandbreiten-Begrenzung

+

RouterOS-Menü: /queue simple · REST-Pfad: queue/simple

+

Begrenzt Up-/Download einer IP-Adresse oder eines Netzes.

+

Reicht für die meisten Heim-/Kleinnetz-Fälle ohne Mangle-Markierungen aus.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
NamenameTextJaFrei wählbar, z.B. limit-gast.
ZieltargetTextJaIP-Adresse oder Netz, das begrenzt wird, mit Präfix, z.B. 192.168.88.50/32.
Max. Bandbreite (Upload/Download)max-limitTextJaZwei Werte getrennt durch "/", z.B. 10M/50M (Upload/Download).
Burst-Bandbreiteburst-limitTextNeinOptional: kurzzeitig erlaubte höhere Bandbreite, z.B. 15M/60M.
DeaktiviertdisabledJa/NeinNeinnoBegrenzung inaktiv schalten, ohne sie zu löschen.
+

+

Queue-Baum

+

RouterOS-Menü: /queue tree · REST-Pfad: queue/tree

+

Erweiterte, hierarchische Bandbreiten-Steuerung basierend auf Mangle-Markierungen.

+

Statt einer festen Adresse wirkt ein Queue-Baum-Eintrag auf Verkehr mit einer bestimmten Mangle-Markierung.

+
+

⚠️ Achtung: Setzt eine passende Mangle-Regel voraus, die genau diese Markierung setzt (siehe Firewall: Mangle) — ohne die greift ein Queue-Baum-Eintrag ins Leere.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
NamenameTextJaFrei wählbar, z.B. queue-gast.
ÜbergeordnetparentTextJaEin Interface (z.B. der WAN-Port, etwa ether1) oder der Name eines anderen Queue-Baum-Eintrags.
Paket-/Verbindungsmarkierungpacket-markTextNeinName der Mangle-Markierung, auf die dieser Eintrag wirkt.
Max. Bandbreitemax-limitTextNeinEinzelwert, z.B. 20M.
DeaktiviertdisabledJa/NeinNeinnoBegrenzung inaktiv schalten, ohne sie zu löschen.
+

Werkzeuge & Überwachung

+

+

Netwatch

+

RouterOS-Menü: /tool netwatch · REST-Pfad: tool/netwatch

+

Überwacht laufend, ob eine Adresse erreichbar ist, und kann bei Statuswechsel ein Skript auslösen.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
Zu überwachende AdressehostTextJaIP-Adresse oder Hostname, ohne Präfix, z.B. 192.168.88.1 oder 8.8.8.8.
Prüf-IntervallintervalZeitdauer (Tage/Std/Min/Sek, per Stepper)Nein10sWie oft die Erreichbarkeit geprüft wird.
Skript bei Erreichbarkeitup-scriptTextNeinName eines Skripts unter "Skripte".
Skript bei Nichterreichbarkeitdown-scriptTextNeinName eines Skripts unter "Skripte".
DeaktiviertdisabledJa/NeinNeinnoÜberwachung inaktiv schalten, ohne sie zu löschen.
+

+

E-Mail-Versand (Einstellungsmenü — genau ein Eintrag, kein Anlegen/Löschen)

+

RouterOS-Menü: /tool e-mail · REST-Pfad: tool/e-mail

+

Postausgangs-Server, den Scheduler/Netwatch/Skripte für Benachrichtigungen nutzen.

+

Ein einzelner, geräteweiter Satz Einstellungen — kein Menü mit mehreren Einträgen.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldRouterOS-ParameterTypPflichtStandardHilfetext
Mailserver-AdresseaddressTextJaHostname oder IP-Adresse des Mailservers, z.B. smtp.gmail.com.
PortportZahlNeinMeist 587 (STARTTLS) oder 465 (SSL).
AbsenderadressefromTextNeinZ.B. router@example.com.
BenutzernameuserTextNeinZugangsdaten des Mailservers.
PasswortpasswordTextNeinZugangsdaten des Mailservers.
+ +
+

+

6. Sicherungen

+

Sicherung/Wiederherstellung

+ +
+

+

7. Einstellungen

+

Erreichbar über das App-Menü RouterOS Assistant → Einstellungen… +(oder ⌘,) — kein eigener Tab, sondern ein natives macOS-Settings-Fenster +mit drei Reitern. Jede Änderung wirkt sofort, ohne Neustart der App.

+

Allgemein

+ +

Darstellung

+ +

Netzwerk

+ + \ No newline at end of file diff --git a/RouterOSAssistant/Resources/Manual_en.html b/RouterOSAssistant/Resources/Manual_en.html new file mode 100644 index 0000000..04e8801 --- /dev/null +++ b/RouterOSAssistant/Resources/Manual_en.html @@ -0,0 +1,2806 @@ + +RouterOS Assistant — Manual +

RouterOS Assistant — User Manual

+

This manual covers only features that have been live-tested and +confirmed against real MikroTik hardware (milestones marked ✅ in +README.md). Features not yet fully verified (e.g. parts of WLAN setup, +the newer wifiwave2 driver) are marked as such here, or documented in +HANDOFF.md.

+

Note on illustrations: this manual is maintained by an AI assistant +with no access to screen/UI automation for native macOS apps — real +screenshots of the app can't be produced. Mermaid diagrams (pre-rendered +as images under Manual-assets/, also readable as Mermaid source from +the same file) are used for visualization instead. Anyone wanting to add +real screenshots: drop images under Manual-assets/ and embed them with +![description](Manual-assets/filename.png).

+

All field names, help texts and warnings in Chapter 5 (Expert) are +taken verbatim from the app's source code (RouterOSSchemaCatalog.swift, +extracted automatically) — not paraphrased, so they match exactly what +the app actually shows.

+
+

Table of Contents

+
    +
  1. Overview & Architecture
  2. +
  3. Connect
  4. +
  5. Setup (Wizard)
  6. +
  7. Topology
  8. +
  9. LAN Scanner
  10. +
  11. Expert
  12. +
  13. Backups
  14. +
  15. Settings
  16. +
+
+

0. Overview & Architecture

+

RouterOS Assistant is a native macOS app (SwiftUI) that sets up and +manages MikroTik RouterOS routers through a guided wizard and six tabs: +Connect, Setup, Topology, LAN Scanner, Expert, +Backups.

+

The app talks to the router over two transport paths:

+ +

The app decides which path to use automatically — no configuration +needed.

+

Architecture overview

+

A DE/EN toggle button (flag icon) in the toolbar switches the app's +language (persists across restarts). All six tabs are fully translated +(static UI text, buttons, tooltips). Values that come directly from the +router (error messages, CLI command lines, live logs) stay untranslated.

+
+

+

1. Connect

+

Connecting

+ + + + + + + + + + + + + + + + + + + + + + + + + +
FieldHelp text (verbatim from the app)
Host"Your router's address on the network. MikroTik's factory default is usually 192.168.88.1."
Username"Your router's admin username. The factory default is usually 'admin'."
Password"The password for this user. Often empty on an unmodified factory setup."
Remember password"Stores the password encrypted in the macOS Keychain, so you don't have to type it in every time."
+

An eye icon next to the password field reveals the input for checking.

+

Trust Verification (Trust-on-First-Use)

+

The first time you connect to a router, the app shows a dialog — "The +router presented an unknown certificate" (REST) or "...an unknown SSH +key" (SSH) — to confirm once via "Trust and connect" (or "Cancel"). This +protects against a swapped/spoofed device answering at the same IP +address.

+

On a REST connection, both dialogs can appear in sequence: the app +also checks the SSH host key once in the background, because backup, +update check, and firmware update always need SSH — regardless of which +transport is used for actual configuration.

+

Connect and trust flow

+

After Connecting

+ +

Known Routers

+

After every successful connection, the app remembers host, username, +and (if reported by the router) serial number. Two different routers +sharing the same host+username (e.g. both still on MikroTik's factory +address 192.168.88.1/admin) therefore stay separate entries, +recognizable by the "SN: …" line; the remembered password is stored per +device, separately, in the macOS Keychain. The display name defaults to +the hardware name the first time (e.g. "hEX"), but can be changed anytime +via "Edit" — which also has a free-text location field (e.g. "Basement, +server rack") to tell multiple routers apart. Clicking an entry fills +host/username/password into the form without connecting immediately. The +list scrolls in place past about 4 entries.

+

Live Traffic Indicator

+

The dot in front of each interface in the device overview is gray (no +link), green (link, but no traffic), or pulsing green (actively +transferring data right now).

+
+

2. Setup (Wizard)

+

A guided step-by-step assistant for basic configuration. A mode switch +at the start chooses between:

+ +

Wizard step sequence

+

+

WAN (Internet Connection)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldHelp text
Port"The network port your router uses to connect to the internet (e.g. the cable to your modem or wall socket)."
Connection type"How the router logs in with your internet provider. 'Automatic (DHCP)' fits most cable/fiber connections."
Automatic (DHCP)"The router gets its internet address automatically from your provider. The right choice for most cable/fiber connections."
Static IP address"The fixed IP address your provider assigned you, including the subnet mask (the number after the /, e.g. /24)."
Gateway"The address of the next device towards the internet — usually found in your provider's documentation."
PPPoE username"Credentials from your internet provider for dial-in (e.g. for DSL connections)."
PPPoE password"The password that belongs to the username, from your internet provider."
+

+

LAN (One or More Networks)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldHelp text
Port"The internal network port your devices connect to (your local network, LAN)."
Router address"The address at which the router itself is reachable on this network."
Network range"The complete address range of this network (e.g. /24 allows up to 254 devices)."
DHCP from"The address from which the router automatically assigns addresses to devices on this network."
DHCP to"The address up to which the router automatically assigns addresses to devices on this network."
Lease time"How long a device keeps its assigned address before it must be renewed."
DNS server"Which server translates internet addresses into names for devices on this network (e.g. www.google.com). Usually the router itself."
Network isolation"Prevents traffic between this and all other configured LAN/VLAN networks. Internet access is preserved. Implemented in the Firewall step."
+

In Expert mode, multiple physical ports/interfaces can be set up as +separate networks (the "Add another LAN network" button), each with its +own address range and optional network isolation. Address fields start +empty — the field itself shows an example format that disappears while +typing.

+

Port conflict check: if the user picks a port that's already +configured differently, a warning appears with the reason and a "Free up +this port now…" option — "Pick a different, free port above — or free +this one up now. Its existing configuration will be removed." This isn't +actually carried out until "Apply now" at the end of the wizard — until +then it can be undone by picking a different port above.

+

+

VLAN (Optional)

+

"A VLAN is an additional network with its own address range — e.g. for +guests or smart devices. Whether it's isolated from the main network is +set below, per network, via 'Isolate from other networks'. If you're not +sure whether you need this, just skip this step."

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldHelp text
Name"A name for your own reference, e.g. 'Guests' or 'Smart Home'."
VLAN ID"A unique number to technically distinguish this network. Only needs to be unique within your router."
Base port"The physical port this additional network is built on."
Router address"The router's address within this additional network."
Network range"The complete address range of this additional network."
DHCP from/to"The address range from/to which devices on this network automatically get an address."
+

+

Wi-Fi (Only If Detected)

+

"No Wi-Fi was detected on this device. This step will be skipped." — +otherwise: "Turns on Wi-Fi on this radio and sets the network name and +password."

+ + + + + + + + + + + + + + + + + +
FieldHelp text
Network name (SSID)"The name devices see in their Wi-Fi list and use to connect."
Password"The Wi-Fi password (WPA2). Must be at least 8 characters long."
+

+

Basic Firewall Protection

+

"Protects your router and your devices from unsolicited access from the +internet, and lets your devices access the internet (NAT)." Always +active in Simple mode; selectable in Expert mode: "Sets up standard +protection: internet sharing (NAT) for your home network, and blocks +unsolicited access from the internet to your router and your devices. +Existing, self-configured rules are kept — the new rules are placed +first."

+

If the router already has its own firewall rules, the app additionally +warns: "Your router already has its own firewall rules. The new rules +will be placed first, existing ones are kept — still check the order +afterwards, e.g. via Winbox or '/ip firewall filter print'."

+

+

Review / Apply

+

"A backup of the current configuration is created automatically before +applying (Backups tab). There's no guaranteed automatic rollback on a +connection loss — if there's a problem, use the backup in the Backups +tab, or restore the router locally (Ethernet/console)." Every single +command is shown before it runs.

+

The wizard can be run again on an already-configured router (e.g. to add +another network) — existing settings aren't duplicated or damaged in the +process. "Cancel" is available anytime via the button top right (in both +Simple and Expert mode): "All values entered in this wizard will be +lost" — a confirmation dialog, resets the wizard to the first step.

+
+

+

3. Topology

+

A graphical diagram of the router's complete current state — five +columns, with real connection lines (no guessing, derived from actual +RouterOS reference fields):

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ColumnRouterOS area
InterfacesPhysical ports, bridges, VLANs, WireGuard, …
IP AddressesAssignments from /ip address
Pools & DHCPAddress pools, DHCP servers/networks/clients
Routes/ip route
Firewall & NATFilter/NAT rules, address lists
+

Not shown in the diagram (but reachable via the Expert tab): VPN: PPP +users/profiles, Wi-Fi security profiles, Queues/bandwidth control, System +(name/clock/scheduler/scripts/user accounts), Tools (Netwatch/email), +Firewall: Mangle and Raw rules.

+

Connection Types (Line Colors)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeMeaning (verbatim from the app)
VLAN → base interface"The VLAN interface builds on the base interface — it's its own network, separated by VLAN tag, on the same physical port."
Bridge port"This physical port is a member of this bridge — devices on this port behave as if they were on the same cable as every other bridge port."
WireGuard peer"This WireGuard VPN tunnel runs over this interface."
Interface → IP address"This IP address is assigned to this interface."
DHCP / Pool"This DHCP component (server, pool, or network options) belongs to this interface or address."
Route → interface"This route goes via this interface or gateway."
Firewall/NAT → interface"This firewall or NAT rule refers to this interface (as input or output)."
Address list → rule"This rule checks whether an address is on this address list."
+

Interaction

+ +

Focus Mode

+

Clicking a node opens a floating popup with the complete connected +chain (every directly and indirectly connected element, the transitive +closure) in the same column layout as above, neatly re-arranged; +everything else in the main diagram dims. Close it via the X button at +the top of the popup, by clicking the empty area next to it, or by +clicking the same node again. Since this is a non-modal overlay (not a +system sheet), the right-hand sidebar stays usable while it's open — a +node from the chain can be edited directly from the popup via "Edit". +The popup's size adapts automatically to its content, with no +scrollbars.

+

Focus mode: states

+

Direct Editing

+

IP addresses, pools, DHCP servers/networks/clients, routes, firewall +filter/NAT rules, WireGuard peers, and interfaces (Ethernet, bridge, +Wi-Fi, VLAN, WireGuard) can be clicked and changed directly via "Edit" — +writes straight back to the router. Address-list nodes aren't directly +editable here yet, only via the Expert tab, since one node there combines +several entries. Dynamic/automatically created routes (e.g. a network's +own connected route) deliberately show no Edit button, since RouterOS +manages those entries itself.

+
+

+

4. LAN Scanner

+

Shows every device on the network (from DHCP leases and the ARP table), +grouped by physical port. "Rescan" re-queries leases/ARP/bridge host +table. Each port header additionally shows the current live throughput in +MB/s (↓/↑, green icon while traffic is active, gray while idle, polled +every 0.1s) with a small line chart of the last 30 seconds. Columns: +name, IP address, MAC address, status.

+

Every action for a device lives in the "Actions" button (•••) behind its +row:

+ +

All three result popups (raw data, network test, port scan) share the +same layout: a fixed header with title + X button to close, with +scrollable content below — the same structure as the Topology tab's +focus popup and the Expert edit form (see Chapters 3 and 5).

+
+

+

5. Expert

+

Direct, curated access to most RouterOS areas. Every field has a help +text with a format example. Categories are collapsible (default: +collapsed) — click the larger, colored heading to expand/collapse.

+

Custom menu path: every RouterOS menu path is reachable, even without +a curated form — fields then appear generically as key/value pairs. Even +for curated menus, any additional field RouterOS returns that isn't +curated automatically lands in the "Additional Parameters (free-form)" +area — nothing RouterOS supports is unreachable this way, even if it +doesn't (yet) have its own form field.

+

Before every change: a confirmation dialog with the exact command that +will run. Automatic backup once per connection session, before the first +change.

+

The edit form itself has the same fixed header (title + X button, stays +visible while scrolling) as the Topology tab's focus popup and the LAN +Scanner's result popups — one consistent close behavior across the whole +app.

+

The reference below is extracted automatically from +RouterOSSchemaCatalog.swift — field name, RouterOS parameter name, +field type, required status, default, and help text match exactly what +the app shows. "Reference to an existing entry" means: the app loads the +existing names from the referenced menu live when opened, and shows them +as a picker. "Picker from the router's live interface list" loads the +interfaces currently present on the router when opened.

+ +

System

+

+

Router Name (settings menu — exactly one entry, no add/remove)

+

RouterOS menu: /system identity · REST path: system/identity

+

Der Name, unter dem sich der Router meldet (z.B. in Winbox/Terminal-Prompt).

+ + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
NamenameTextYesYour choice, e.g. MyRouter.
+

+

Time/Time Zone (settings menu — exactly one entry, no add/remove)

+

RouterOS menu: /system clock · REST path: system/clock

+ + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
Time Zonetime-zone-nameTextNoE.g. Europe/Berlin.
+

+

Mode Button (settings menu — exactly one entry, no add/remove)

+

RouterOS menu: /system routerboard mode-button · REST path: system/routerboard/mode-button

+

Controls which script runs when the router's physical Mode button is pressed.

+

Some RouterBOARD devices (e.g. hEX, cAP, hAP ac², LtAP mini, some CCR/CRS) have a physical Mode button on the side. This controls whether, and for how long, it must be held down to run a script previously created under "Scripts".

+
+

⚠️ Warning: Starting with RouterOS 7.1rc4, enabling or changing this setting also requires a physical button press (Reset or Mode button) on the device itself within 60 seconds to confirm — a change through this app alone isn't enough.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
EnabledenabledYes/NoNonoTurn the Mode button on/off.
Script to Runon-eventReference to an existing entry under /system scriptNoName of a script previously created under "Scripts".
Hold Time (Min..Max)hold-timeTextNoHow long the button must be held down, as a Min..Max time range, e.g. "3s..5s". Available from RouterOS 6.47beta60 onward.
+

+

Time Server (NTP) (settings menu — exactly one entry, no add/remove)

+

RouterOS menu: /system ntp client · REST path: system/ntp/client

+

Hält die Router-Uhr über einen Zeitserver synchron.

+

Die Server-Liste selbst liegt in einem eigenen Menü ("NTP-Zeitserver-Liste") — hier nur Ein/Aus und Modus.

+
+

⚠️ Warning: Wrong system time can mess up certificate checks (HTTPS/REST) and log timestamps.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
EnabledenabledYes/NoNoyesTurn time synchronization on/off.
ModemodeFixed choice: unicast, broadcast, multicast, manycastNounicastFast immer "unicast" (direkte Anfrage an feste Server).
+

+

NTP-Zeitserver-Liste

+

RouterOS menu: /system ntp client servers · REST path: system/ntp/client/servers

+

Die Zeitserver, die der Client abfragt.

+

"servers" ist bei RouterOS 7.x kein Feld am NTP-Client selbst, sondern eine eigene Liste — jeder Server ist ein eigener Eintrag hier (statt kommagetrennt in einem Textfeld).

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
AddressaddressTextYesHostname oder IP eines Zeitservers, z.B. pool.ntp.org.
DisableddisabledYes/NoNonoDiesen Server deaktivieren, ohne ihn zu löschen.
CommentcommentTextNoFor your own reference only.
+

+

Scheduler

+

RouterOS menu: /system scheduler · REST path: system/scheduler

+

Runs a stored script at fixed times/intervals.

+
+

⚠️ Warning: A faulty scheduled script can make repeated unattended changes — test it manually once before scheduling it.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
NamenameTextYesYour choice, e.g. daily-reboot.
Start Timestart-timeTextNoE.g. 00:00:00 or "startup".
IntervalintervalTime duration (days/hrs/min/sec, via stepper)NoHow often it repeats. Leave everything at 0 = only once, at the start time.
Script to Runon-eventReference to an existing entry under /system scriptNoName of a script previously created under "Scripts".
DisableddisabledYes/NoNonoTurn the schedule off without deleting it.
+

+

Scripts

+

RouterOS menu: /system script · REST path: system/script

+

Stored RouterOS command sequences, run manually or via the scheduler.

+
+

⚠️ Warning: Scripts run with the router's own privileges — no different from commands typed in manually.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
NamenameTextYesYour choice, e.g. daily-backup.
Script ContentsourceTextNoRouterOS commands, e.g. ":log info "Test"".
+

+

User Accounts

+

RouterOS menu: /user · REST path: user

+

Access accounts for the router (Winbox/SSH/REST/terminal).

+
+

⚠️ Warning: Don't accidentally delete or downgrade the account you're currently connected with.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
UsernamenameTextYesYour choice, e.g. admin2.
PasswordpasswordTextNoChoose something sufficiently long and random.
Permission GroupgroupFixed choice: full, write, readNofullfull = full access, write = without user management, read = read-only.
DisableddisabledYes/NoNonoTurn the account off without deleting it.
+

+

Logging

+

RouterOS menu: /system logging · REST path: system/logging

+

What the router logs and where to (memory, file, remote syslog, email).

+

Made up of "rules" (what is logged) and "actions" (where to) — this is generic access; related parts via "Custom Menu Path" (e.g. "/system logging action").

+

No curated form yet — every field appears as a free-form key/value pair (see "Custom Menu Path").

+

Interfaces (bridge, VLAN, VPN tunnel...)

+

+

All Interfaces (generic)

+

RouterOS menu: /interface · REST path: interface

+

Gemeinsame Felder, die für jedes Interface gelten, unabhängig vom Typ (Ethernet, Bridge, WLAN, WireGuard, VLAN, ...).

+

RouterOS lists every interface here together. Type-specific fields (e.g. a VLAN interface's VLAN ID) live in their own menus (e.g. "VLAN Interfaces") — this only covers what works the same for every interface type.

+
+

⚠️ Warning: RouterOS also reports a "default-name" here (the port's factory name) — it shows up below under "Additional Parameters", but can't be changed ("bad parameter default-name", confirmed live). To rename, only use the "Name" field above.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
NamenameTextYesThis interface's current name, e.g. ether5 or vlan20 — not to be confused with "default-name" (the factory name, further below under "Additional Parameters", not changeable).
CommentcommentTextNoFor your own reference only, no technical effect.
DisableddisabledYes/NoNonoTurn the interface off without deleting it.
+

+

Bridge

+

RouterOS menu: /interface bridge · REST path: interface/bridge

+

Fasst mehrere physische Ports zu einem gemeinsamen Layer-2-Netzwerk zusammen.

+

Devices on bridged ports behave as if they hung off the same network cable. An IP address usually goes on the bridge itself, not on the individual ports.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
NamenameTextYesYour choice, e.g. bridge-lan.
VLAN Filtering (802.1Q)vlan-filteringYes/NoNonoEnables real VLAN separation across this bridge — needed when several VLANs share the same bridge ports.
DisableddisabledYes/NoNonoTurn the bridge off without deleting it.
+

+

Bridge Ports

+

RouterOS menu: /interface bridge port · REST path: interface/bridge/port

+

Ordnet einen physischen Port einer Bridge zu.

+

Only after this is the port part of the bridge network.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
BridgebridgeTextYesThe bridge's name, e.g. bridge-lan.
Physical PortinterfacePicker from the router's live interface listYesThe port being added to the bridge, e.g. ether2.
Port VLAN ID (PVID)pvidNumberNoOnly relevant with VLAN filtering enabled: the VLAN that untagged incoming traffic on this port is assigned to, e.g. 20.
+

+

VLAN Interfaces

+

RouterOS menu: /interface vlan · REST path: interface/vlan

+

Virtuelle, getaggte Sub-Interfaces auf einem physischen Port oder einer Bridge.

+

Its own logical network on the same cable, distinguished by a VLAN tag in the Ethernet frame.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
NamenameTextYesYour choice, e.g. vlan20-guests.
VLAN IDvlan-idNumberYesUnique identifier, 2–4094, e.g. 20.
Base InterfaceinterfacePicker from the router's live interface listYesThe physical port or bridge this VLAN sits on top of, e.g. bridge.
DisableddisabledYes/NoNonoTurn the VLAN interface off without deleting it.
+

+

WireGuard Interfaces

+

RouterOS menu: /interface wireguard · REST path: interface/wireguard

+

Moderner, schlanker VPN-Tunnel-Typ.

+

A WireGuard interface alone doesn't establish a connection yet — that needs peers (see "WireGuard Peers") with a public key and allowed addresses.

+
+

⚠️ Warning: Create the interface here first (with a listen port), then add the peers under WireGuard Peers. The private key is generated automatically on creation if not specified.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
NamenameTextYesYour choice, e.g. wg-home.
Listen Port (UDP)listen-portNumberNo51820The port this tunnel listens for incoming connections on, e.g. 51820.
Private Keyprivate-keyTextNoKeep secret. Leave empty to have RouterOS generate one automatically.
DisableddisabledYes/NoNonoTurn the interface off without deleting it.
+

+

WireGuard Peers

+

RouterOS menu: /interface wireguard peers · REST path: interface/wireguard/peers

+

Gegenstellen (Clients/andere Router) eines WireGuard-Tunnels.

+

Each peer needs its own public key and a statement of which addresses are routed through it.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
WireGuard InterfaceinterfaceReference to an existing entry under /interface wireguardYesName of the previously created WireGuard interface.
Peer's Public Keypublic-keyTextYesCopy from the peer's device (e.g. via "wg show public-key").
Allowed Addressesallowed-addressTextNoWhich IP addresses/networks are allowed to go through this peer, with prefix, e.g. 10.10.10.2/32.
Peer's Fixed Addressendpoint-addressTextNoOnly needed when this peer itself must be reachable (site-to-site), e.g. a fixed public IP or a DNS name. Leave empty for roadwarrior clients that connect in on their own.
Peer's Portendpoint-portTextNoUsually the same as the peer's listen port, e.g. 51820.
Keepalivepersistent-keepaliveTime duration (days/hrs/min/sec, via stepper)NoKeeps the connection alive through NAT/firewalls. Important for clients behind NAT.
+

+

PPPoE Client

+

RouterOS menu: /interface pppoe-client · REST path: interface/pppoe-client

+

DSL-Einwahl-Client, meist auf dem WAN-Port.

+

Replaces a static/DHCP WAN address with a PPPoE dial-in to the provider.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
NamenameTextYesYour choice, e.g. pppoe-wan.
Physical PortinterfacePicker from the router's live interface listYesThe port the dial-in runs over, usually the WAN port, e.g. ether1.
UsernameuserTextYesCredentials from the provider.
PasswordpasswordTextYesCredentials from the provider.
DisableddisabledYes/NoNonoTurn the dial-in off without deleting it.
+

+

Bonding

+

RouterOS menu: /interface bonding · REST path: interface/bonding

+

Bündelt mehrere physische Ports zu einer logischen, ausfalltoleranten/schnelleren Verbindung.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
NamenameTextYesYour choice, e.g. bond1.
Bundled PortsslavesTextNoComma-separated list of physical ports, e.g. ether2,ether3.
ModemodeFixed choice: 802.3ad, active-backup, balance-rr, balance-xor, broadcastNo802.3ad (LACP) needs a compatible, correspondingly configured switch.
+

IP Addressing & Services

+

+

IP Addresses

+

RouterOS menu: /ip address · REST path: ip/address

+

Weist Interfaces IP-Adressen zu.

+

Each IP address is attached to exactly one interface (physical port, bridge, or VLAN).

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
AddressaddressTextYesIP address with subnet mask as prefix (the router's address on this network), e.g. 192.168.88.1/24 or 10.10.10.1/24. The /24 determines how many devices fit on this network (/24 = up to 254).
InterfaceinterfacePicker from the router's live interface listYesThe interface this address is assigned to, e.g. bridge or ether4.
DisableddisabledYes/NoNonoTurn the address off without deleting it.
+

+

Address Pools

+

RouterOS menu: /ip pool · REST path: ip/pool

+

Adressbereiche, aus denen DHCP-Server oder PPP-Profile Adressen vergeben.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
NamenameTextYesYour choice, e.g. dhcp_pool_lan.
Range(s)rangesTextYesFrom-to address without a prefix, e.g. 192.168.88.10-192.168.88.254. Multiple ranges comma-separated.
+

+

DHCP Server

+

RouterOS menu: /ip dhcp-server · REST path: ip/dhcp-server

+

Vergibt automatisch IP-Adressen an Geräte in einem Netzwerk.

+

The Setup wizard (LAN/VLAN step) already covers the usual cases — this is direct access for special cases.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
NamenameTextYesYour choice, e.g. dhcp_lan.
InterfaceinterfacePicker from the router's live interface listYesThe network this server hands out addresses on, e.g. bridge.
Address Pooladdress-poolReference to an existing entry under /ip poolYesName of a previously created address pool.
Lease Timelease-timeTime duration (days/hrs/min/sec, via stepper)NoHow long a device keeps its address before it needs renewing, e.g. 1d or 12h.
DisableddisabledYes/NoNonoTurn the DHCP server off without deleting it.
+

+

DHCP Networks

+

RouterOS menu: /ip dhcp-server network · REST path: ip/dhcp-server/network

+

Gateway/DNS/Optionen, die ein DHCP-Server an seine Klienten verteilt.

+

Kept separate from the DHCP server itself because the same network options can apply to several DHCP servers.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
NetworkaddressTextYesThe following options apply to this network — the network address with prefix, e.g. 192.168.88.0/24.
GatewaygatewayTextYesUsually the router's address on this network, without a prefix, e.g. 192.168.88.1.
DNS Serverdns-serverTextNoUsually the router itself, e.g. 192.168.88.1. Multiple servers can be comma-separated.
+

+

DHCP Client (WAN)

+

RouterOS menu: /ip dhcp-client · REST path: ip/dhcp-client

+

Automatically obtains an IP address from the internet provider.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
InterfaceinterfacePicker from the router's live interface listYesUsually the WAN port, e.g. ether1.
Adopt Default Routeadd-default-routeYes/NoNoyesAdopts the default internet route announced by the provider.
Adopt DNS Serversuse-peer-dnsYes/NoNoyesAdopts the DNS servers announced by the provider.
DisableddisabledYes/NoNonoTurn the DHCP client off without deleting it.
+

+

DNS Settings (settings menu — exactly one entry, no add/remove)

+

RouterOS menu: /ip dns · REST path: ip/dns

+

Name resolution for the router itself (and, optionally, as a DNS server for the LAN).

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
DNS ServerserversTextNoOne or more servers, comma-separated, e.g. 1.1.1.1,8.8.8.8.
Allow as DNS Server for the LANallow-remote-requestsYes/NoNonoLets devices on the LAN use the router itself as a DNS server. Without this, DNS requests from devices to the router fail even if they have it set as their DNS server.
+

+

Management Services

+

RouterOS menu: /ip service · REST path: ip/service

+

Schaltet Zugriffswege auf den Router (Winbox, API, SSH, WWW/REST, Telnet, FTP) an/aus und ändert deren Port.

+

Every active service is a potential attack surface from whichever network can reach it — disable services you don't need.

+
+

⚠️ Warning: Disabling or re-porting the access path you're currently using can cut your own connection immediately — be careful with www-ssl (this app's REST API) and ssh.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
ServicenameFixed choice: www, www-ssl, ssh, api, api-ssl, winbox, ftp, telnetYesWhich management service is being changed.
PortportNumberNoThe port the service listens on, e.g. 22 for ssh.
Allowed Fromavailable-fromTextNoOptional: only reachable from this address/network, with prefix, e.g. 192.168.88.0/24.
DisableddisabledYes/NoNonoTurn the service off without deleting the entry.
+

+

Hotspot

+

RouterOS menu: /ip hotspot · REST path: ip/hotspot

+

Login portal for guest Wi-Fi/LAN with a redirect to a sign-in page.

+

Made up of several related parts (server, server profile, user profile, users) — this is generic access to "/ip hotspot" itself; related parts via "Custom Menu Path" (e.g. "/ip hotspot user").

+

No curated form yet — every field appears as a free-form key/value pair (see "Custom Menu Path").

+

Routing

+

+

Static Routes

+

RouterOS menu: /ip route · REST path: ip/route

+

Feste, manuell eingetragene Wegewahl zu Netzen, die nicht direkt angeschlossen sind.

+

For everything except "default internet via a WAN interface" (the DHCP client/PPPoE route already handles that automatically).

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
Destination Networkdst-addressTextYesNetwork with prefix, e.g. 10.0.0.0/24, or 0.0.0.0/0 for a default route.
GatewaygatewayTextYesNext hop — an IP address without a prefix (e.g. 192.168.88.254) or an interface name (e.g. ether1).
DistancedistanceNumberNoPriority when several routes match the same destination — a smaller number is preferred, e.g. 1.
CommentcommentTextNoFor your own reference only.
DisableddisabledYes/NoNonoTurn the route off without deleting it.
+

+

OSPF Instances

+

RouterOS menu: /routing ospf instance · REST path: routing/ospf/instance

+

Dynamisches Innennetz-Routing-Protokoll — tauscht Routen automatisch mit anderen OSPF-Routern aus.

+

Only relevant when several routers on the same network should learn routes on their own.

+
+

⚠️ Warning: Misconfigured OSPF can overwrite routes to existing networks. Only use it with a network plan.

+
+

No curated form yet — every field appears as a free-form key/value pair (see "Custom Menu Path").

+

+

BGP Connections

+

RouterOS menu: /routing bgp connection · REST path: routing/bgp/connection

+

Routing-Protokoll für Verbindungen zwischen unabhängigen Netzen/Providern.

+

Usually not needed for a home/small network — relevant with your own provider-independent address space (multihoming).

+

No curated form yet — every field appears as a free-form key/value pair (see "Custom Menu Path").

+

VPN Servers/Clients

+

+

PPP Users

+

RouterOS menu: /ppp secret · REST path: ppp/secret

+

Zugangsdaten für PPPoE-/L2TP-/PPTP-/OpenVPN-Einwahl in den Router.

+

Each user can optionally be assigned a profile that dictates IP pool/DNS/encryption.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
UsernamenameTextYesYour choice, e.g. guest1.
PasswordpasswordTextYesChoose something sufficiently long and random.
ServiceserviceFixed choice: any, pppoe, l2tp, pptp, ovpn, sstpNoanyWhich dial-in type this user applies to.
ProfileprofileReference to an existing entry under /ppp profileNoName of a previously created PPP profile.
Local Addresslocal-addressTextNoThe router's IP address within this connection, without a prefix, e.g. 10.10.10.1.
Address for the Clientremote-addressTextNoA fixed IP for this user (e.g. 10.10.10.2), or the name of an address pool.
DisableddisabledYes/NoNonoTurn the user off without deleting it.
+

+

PPP Profiles

+

RouterOS menu: /ppp profile · REST path: ppp/profile

+

Vorlagen (IP-Pool, DNS, Verschlüsselung) für PPP-Benutzer.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
NamenameTextYesYour choice, e.g. vpn-clients.
Local Addresslocal-addressTextNoThe router's IP address, without a prefix, e.g. 10.10.10.1.
Address Pool for Clientsremote-addressTextNoName of a previously created address pool.
DNS Servers for Clientsdns-serverTextNoOne or more servers, comma-separated, e.g. 1.1.1.1,8.8.8.8.
+

+

L2TP VPN Server

+

RouterOS menu: /interface l2tp-server server · REST path: interface/l2tp-server/server

+

Accepts incoming L2TP VPN dial-ins.

+

A single server-wide on/off switch with shared encryption settings — users themselves come from "PPP Users".

+

No curated form yet — every field appears as a free-form key/value pair (see "Custom Menu Path").

+

+

OpenVPN Server

+

RouterOS menu: /interface ovpn-server server · REST path: interface/ovpn-server/server

+

Accepts incoming OpenVPN dial-ins.

+

Additionally needs a certificate ("/certificate") — users themselves come from "PPP Users".

+

No curated form yet — every field appears as a free-form key/value pair (see "Custom Menu Path").

+

Wi-Fi / CAPsMAN

+

+

Wi-Fi (Legacy Driver)

+

RouterOS menu: /interface wireless · REST path: interface/wireless

+

WLAN-Interfaces auf älteren/Standard-Wireless-Chips.

+

These interfaces already exist from the factory (one Wi-Fi chip = one interface) — they're only configured here, not newly created. A security profile (see "Wi-Fi Security Profiles") must be created first.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
Network Name (SSID)ssidTextYesThe name Wi-Fi devices see in the network list, e.g. MyWiFi.
Security Profilesecurity-profileTextNoName of a profile previously created under "Wi-Fi Security Profiles".
ModemodeFixed choice: ap-bridge, station, bridgeNoap-bridgeap-bridge = access point (normal case), station = connect as a client to another AP.
DisableddisabledYes/NoNonoTurn the Wi-Fi interface off without deleting it.
+

+

Wi-Fi Security Profiles

+

RouterOS menu: /interface wireless security-profiles · REST path: interface/wireless/security-profiles

+

Encryption/password templates for Wi-Fi interfaces (legacy driver).

+

A profile is created and then entered on a Wi-Fi interface as "security-profile".

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
NamenameTextYesYour choice, e.g. homenet-wpa2.
ModemodeFixed choice: none, static-keys-required, dynamic-keysNodynamic-keysdynamic-keys is the usual WPA/WPA2 mode.
Authenticationauthentication-typesFixed choice: wpa-psk, wpa2-psk, wpa-psk,wpa2-psk, wpa-eap, wpa2-eapNowpa2-psk = WPA2 with a shared password (home network standard).
WPA2 Passwordwpa2-pre-shared-keyTextNoAt least 8 characters.
+

+

Wi-Fi (new wifiwave2/802.11ax driver)

+

RouterOS menu: /interface wifi · REST path: interface/wifi

+

WLAN-Interfaces auf neueren Wireless-Chips.

+

A different, nested configuration schema from the legacy driver (dot notation like "security.passphrase") — don't mix with "/interface wireless". Only present on devices with a correspondingly new Wi-Fi chip.

+
+

⚠️ Warning: This app has never tested the .set path for the new driver against real hardware (see HANDOFF.md) — be sure to check after applying.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
Network Name (SSID)ssidTextYesThe name Wi-Fi devices see in the network list, e.g. MyWiFi.
Authenticationsecurity.authentication-typesFixed choice: wpa2-psk, wpa3-psk, wpa2-psk,wpa3-pskNowpa2-psk,wpa3-psk covers both older and newer devices.
Passwordsecurity.passphraseTextNoAt least 8 characters.
Target Bridgedatapath.bridgeTextNoName of the bridge this Wi-Fi network is assigned to (usually the same as the wired LAN), e.g. bridge.
DisableddisabledYes/NoNonoTurn the Wi-Fi interface off without deleting it.
+

+

CAPsMAN Controller

+

RouterOS menu: /caps-man manager · REST path: caps-man/manager

+

Central management of several Wi-Fi access points from one router.

+

Only relevant with several Wi-Fi access points that should be managed centrally — its own extensive configuration schema (configurations/channels/datapaths).

+

No curated form yet — every field appears as a free-form key/value pair (see "Custom Menu Path").

+

Firewall: Filter Rules

+

+

Filter Rules

+

RouterOS menu: /ip firewall filter · REST path: ip/firewall/filter

+

Decides whether packets are let through (accept), dropped (drop/reject), or checked further.

+

input = access to the router itself, forward = traffic passing through the router (e.g. LAN↔internet or between two networks), output = traffic leaving the router. Rules are checked top to bottom; the first match decides.

+
+

⚠️ Warning: Order matters. New rules land at the end of the list — an existing rule higher up can make a new rule unreachable. Check the position afterwards with "/ip firewall filter print", and use "move" if needed.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
ChainchainTextYesforwardinput = to the router, forward = through the router, output = from the router. Custom chains (jump targets via "jump") are also possible. Example: forward
ActionactionFixed choice: accept, drop, reject, log, jump, return, add-src-to-address-list, add-dst-to-address-list, fasttrack-connection, passthroughYesacceptWhat happens to matching packets. reject also sends back an error message, drop discards silently.
Source Addresssrc-addressTextNoSingle IP or network with prefix, e.g. 192.168.88.5 or 192.168.88.0/24. Empty = any.
Destination Addressdst-addressTextNoSingle IP or network with prefix, e.g. 192.168.88.5 or 192.168.88.0/24. Empty = any.
Source in Address Listsrc-address-listReference to an existing entry under /ip firewall address-listNoOnly packets whose sender is in this previously created address list.
Destination in Address Listdst-address-listReference to an existing entry under /ip firewall address-listNoOnly packets whose destination is in this previously created address list.
Incoming Interfacein-interfacePicker from the router's live interface listNoOnly packets arriving on this interface, e.g. ether1 or bridge.
Outgoing Interfaceout-interfacePicker from the router's live interface listNoOnly packets leaving via this interface, e.g. ether1 or bridge.
ProtocolprotocolFixed choice: tcp, udp, icmp, gre, ipsec-esp, ipsec-ahNoIP protocol. Empty = all.
Destination Port(s)dst-portTextNoOnly meaningful for tcp/udp. A single port (e.g. 80) or a range (e.g. 8000-8100).
Connection Stateconnection-stateFixed choice: new, established, related, invalid, untrackedNoStatus according to connection tracking. "established,related" is the usual "already-allowed connection" rule.
Layer 7 Protocollayer7-protocolTextNoName of a pattern previously created under "/ip firewall layer7-protocol" (e.g. detecting specific apps). Noticeably CPU-intensive, use with care.
CommentcommentTextNoFor your own reference only, no technical effect.
DisableddisabledYes/NoNonoTurn the rule off without deleting it.
+

Firewall: NAT (port forwarding etc.)

+

+

NAT Rules

+

RouterOS menu: /ip firewall nat · REST path: ip/firewall/nat

+

Translates addresses — internet sharing (srcnat/masquerade) and port forwarding (dstnat).

+

srcnat changes the sender address of outgoing packets (e.g. private LAN IP → public WAN IP). dstnat changes the destination address of incoming packets (e.g. a request to the WAN IP on port 80 → redirected to an internal server at 192.168.88.10:80).

+
+

⚠️ Warning: A dstnat rule (port forwarding) makes an internal device directly reachable from the internet — only set this up for services that should really be exposed, and don't block the corresponding port in the filter table afterwards.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
ChainchainFixed choice: srcnat, dstnatYessrcnatsrcnat = change sender address (internet sharing). dstnat = change destination address (port forwarding).
ActionactionFixed choice: masquerade, src-nat, dst-nat, netmap, redirect, sameYesmasquerademasquerade = automatic NAT via the current WAN IP (recommended for a changing IP). src-nat = fixed NAT address. dst-nat = rewrite the destination (port forwarding). redirect = redirect to the router itself.
Source Addresssrc-addressTextNoSingle IP or network with prefix, e.g. 192.168.88.0/24. Empty = any.
Destination Addressdst-addressTextNoSingle IP or network with prefix, e.g. 192.168.88.0/24. Empty = any.
Incoming Interfacein-interfacePicker from the router's live interface listNoFor dstnat, usually the WAN port (where the request from the internet comes in), e.g. ether1.
Outgoing Interfaceout-interfacePicker from the router's live interface listNoFor srcnat/masquerade, usually the WAN port, e.g. ether1.
ProtocolprotocolFixed choice: tcp, udp, icmpNoNeeded so ports can be checked.
Request's Destination Portdst-portTextNoThe port the request from outside arrives on, e.g. 8080.
Forward to (Internal IP)to-addressesTextNoOnly for dst-nat: the internal IP address to forward to, e.g. 192.168.88.10.
Forward to (Internal Port)to-portsTextNoOnly for dst-nat: internal port, if different from the destination port (e.g. external 8080 → internal 80).
CommentcommentTextNoFor reference only.
DisableddisabledYes/NoNonoTurn the rule off without deleting it.
+

Firewall: Mangle (marking/QoS prep)

+

+

Mangle Rules

+

RouterOS menu: /ip firewall mangle · REST path: ip/firewall/mangle

+

Marks connections/packets for later processing (e.g. by queues).

+

Mangle itself doesn't change how a packet is treated — it just sticks a mark on it. Only another rule (typically a queue or a routing rule) that checks for exactly this mark actually acts on it.

+
+

⚠️ Warning: A mark with nothing evaluating it (e.g. no matching queue) has no visible effect at all — this is the most common source of confusion with Mangle.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
ChainchainFixed choice: prerouting, input, forward, output, postroutingYesforwardProcessing point in the router's internal packet flow.
ActionactionFixed choice: mark-connection, mark-packet, mark-routing, change-mss, change-ttl, set-priority, accept, passthroughYesmark-connectionmark-connection marks the whole connection (affects all its packets), mark-packet marks only individual packets.
Connection Mark Namenew-connection-markTextNoA name of your choosing that, e.g., a queue later recognizes.
Packet Mark Namenew-packet-markTextNoA name of your choosing for the packet mark.
Still Check Further Mangle RulespassthroughYes/NoNoyesYes (default) lets subsequent Mangle rules also check this connection.
Source Addresssrc-addressTextNoSingle IP or network with prefix, e.g. 192.168.88.0/24. Empty = any.
Destination Addressdst-addressTextNoSingle IP or network with prefix, e.g. 192.168.88.0/24. Empty = any.
Incoming Interfacein-interfacePicker from the router's live interface listNoOnly packets arriving on this interface, e.g. ether1 or bridge.
Outgoing Interfaceout-interfacePicker from the router's live interface listNoOnly packets leaving via this interface, e.g. ether1 or bridge.
ProtocolprotocolFixed choice: tcp, udp, icmpNoIP protocol. Empty = all.
Destination Port(s)dst-portTextNoOnly meaningful for tcp/udp. A single port (e.g. 80) or a range (e.g. 8000-8100).
CommentcommentTextNoFor reference only.
DisableddisabledYes/NoNonoTurn the rule off without deleting it.
+

Firewall: Raw (before connection tracking)

+

+

Raw Rules

+

RouterOS menu: /ip firewall raw · REST path: ip/firewall/raw

+

Runs before any connection-tracking processing — mostly for load relief or coarse DDoS filtering.

+

Rules here apply before RouterOS even "knows" about a connection (connection tracking). This lets you, e.g., very cheaply drop known-uninteresting traffic, or deliberately exempt it from tracking (notrack).

+
+

⚠️ Warning: notrack removes the affected traffic from connection tracking — after that, no filter/NAT rules relying on connection-state or NAT apply to it anymore. Use only deliberately.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
ChainchainFixed choice: prerouting, outputYespreroutingprerouting = incoming packets, before the router processes them. output = packets generated by the router itself.
ActionactionFixed choice: accept, drop, notrackYesacceptnotrack = exempt from connection tracking (see warning above).
Source Addresssrc-addressTextNoSingle IP or network with prefix, e.g. 192.168.88.0/24. Empty = any.
Destination Addressdst-addressTextNoSingle IP or network with prefix, e.g. 192.168.88.0/24. Empty = any.
Incoming Interfacein-interfacePicker from the router's live interface listNoNur Pakete, die über dieses Interface hereinkommen, z.B. ether1.
ProtocolprotocolFixed choice: tcp, udp, icmpNoIP protocol. Empty = all.
Destination Port(s)dst-portTextNoOnly meaningful for tcp/udp. A single port (e.g. 80) or a range (e.g. 8000-8100).
CommentcommentTextNoFor your own reference only.
DisableddisabledYes/NoNonoTurn the rule off without deleting it.
+

Firewall: Address Lists

+

+

Address Lists

+

RouterOS menu: /ip firewall address-list · REST path: ip/firewall/address-list

+

Named groups of IP addresses/networks that filter/NAT/Mangle rules can reference as a condition.

+

Instead of listing individual IPs in every rule, create a named list here (e.g. "blocked" or "trusted") and reference it in filter/NAT/Mangle rules via "src-address-list"/"dst-address-list". Entries can be permanent or have an expiry (timeout).

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
List NamelistTextYesA name of your choosing, referenced in other rules, e.g. blocked.
AddressaddressTextYesSingle IP or network with prefix, e.g. 192.168.88.5 or 10.0.0.0/24.
ExpirytimeoutTime duration (days/hrs/min/sec, via stepper)NoOptional. The entry is removed automatically after this time. Leave everything at 0 = stays permanently until removed manually.
CommentcommentTextNoFor your own reference only.
+

Queues / Bandwidth Control

+

+

Simple Bandwidth Limit

+

RouterOS menu: /queue simple · REST path: queue/simple

+

Begrenzt Up-/Download einer IP-Adresse oder eines Netzes.

+

Sufficient for most home/small-network cases without Mangle marks.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
NamenameTextYesYour choice, e.g. limit-guest.
TargettargetTextYesIP address or network being limited, with prefix, e.g. 192.168.88.50/32.
Max Bandwidth (Upload/Download)max-limitTextYesTwo values separated by "/", e.g. 10M/50M (upload/download).
Burst Bandwidthburst-limitTextNoOptional: a higher bandwidth briefly allowed, e.g. 15M/60M.
DisableddisabledYes/NoNonoTurn the limit off without deleting it.
+

+

Queue Tree

+

RouterOS menu: /queue tree · REST path: queue/tree

+

Advanced, hierarchical bandwidth control based on Mangle marks.

+

Instead of a fixed address, a queue tree entry acts on traffic carrying a specific Mangle mark.

+
+

⚠️ Warning: Requires a matching Mangle rule that sets exactly this mark (see Firewall: Mangle) — without it, a queue tree entry has no effect.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
NamenameTextYesYour choice, e.g. queue-guest.
ParentparentTextYesAn interface (e.g. the WAN port, such as ether1) or the name of another queue tree entry.
Packet/Connection Markpacket-markTextNoName of the Mangle mark this entry acts on.
Max Bandwidthmax-limitTextNoA single value, e.g. 20M.
DisableddisabledYes/NoNonoTurn the limit off without deleting it.
+

Tools & Monitoring

+

+

Netwatch

+

RouterOS menu: /tool netwatch · REST path: tool/netwatch

+

Continuously monitors whether an address is reachable, and can trigger a script on a status change.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
Address to MonitorhostTextYesIP address or hostname, without a prefix, e.g. 192.168.88.1 or 8.8.8.8.
Check IntervalintervalTime duration (days/hrs/min/sec, via stepper)No10sHow often reachability is checked.
Script on Reachableup-scriptTextNoName of a script under "Scripts".
Script on Unreachabledown-scriptTextNoName of a script under "Scripts".
DisableddisabledYes/NoNonoTurn monitoring off without deleting it.
+

+

Email Sending (settings menu — exactly one entry, no add/remove)

+

RouterOS menu: /tool e-mail · REST path: tool/e-mail

+

Outgoing mail server used by the scheduler/Netwatch/scripts for notifications.

+

A single, device-wide set of settings — not a menu with multiple entries.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRouterOS ParameterTypeRequiredDefaultHelp Text
Mail Server AddressaddressTextYesHostname or IP address of the mail server, e.g. smtp.gmail.com.
PortportNumberNoUsually 587 (STARTTLS) or 465 (SSL).
Sender AddressfromTextNoE.g. router@example.com.
UsernameuserTextNoCredentials for the mail server.
PasswordpasswordTextNoCredentials for the mail server.
+ +
+

+

6. Backups

+

Backup/restore

+ +
+

+

7. Settings

+

Reachable via the app menu RouterOS Assistant → Settings… (or ⌘,) — +not a tab, but a native macOS Settings window with three tabs. Every +change takes effect immediately, no app restart needed.

+

General

+ +

Appearance

+ +

Network

+ +
+ \ No newline at end of file diff --git a/build-manual.py b/build-manual.py index 9d38ef3..b08eeb3 100644 --- a/build-manual.py +++ b/build-manual.py @@ -19,12 +19,72 @@ from pathlib import Path ROOT = Path(__file__).resolve().parent SCHEMA_SWIFT = ROOT / "RouterOSAssistant/Core/Models/RouterOSSchemaCatalog.swift" -MANUAL_MD = ROOT / "Manual.md" -MANUAL_PDF = ROOT / "Manual.pdf" +L10N_SWIFT = ROOT / "RouterOSAssistant/Core/Localization/L10n.swift" ASSETS = ROOT / "Manual-assets" DIAGRAMS = ASSETS / "diagrams" CHROME = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" +# One entry per manual language. "de" has no translation dict (it *is* the source +# language everything else is written against); every other language reuses the same +# DE->lang dictionary the app itself ships in L10n.swift for its own UI — Chapter 5 +# (Expert reference) is generated per language straight from RouterOSSchemaCatalog.swift's +# German strings run through that dictionary, so a new language needs nothing here beyond +# adding its md_source and appending translations to L10n.swift; no new Python code. +LANGUAGES = { + "de": {"md_source": ROOT / "Manual.md", "pdf": ROOT / "Manual.pdf"}, + "en": {"md_source": ROOT / "Manual.en.md", "pdf": ROOT / "Manual_en.pdf"}, +} + + +def load_l10n_translations(): + """Parses `private static let translations: [String: String] = [...]` out of + L10n.swift — the exact same DE->EN dictionary the running app uses for its own UI + strings — so Chapter 5's field labels/help texts translate identically to what the + app itself shows, instead of a second, separately-maintained translation.""" + src = L10N_SWIFT.read_text(encoding="utf-8") + marker = "translations: [String: String] = [" + start = src.index(marker) + len(marker) + end = find_matching_bracket(src, start - 1) + body = src[start:end] + + translations = {} + i = 0 + while i < len(body): + if body[i] == '"': + key, i = read_string_literal(body, i) + j = body.index(":", i) + 1 + while body[j] in " \t\n": + j += 1 + value, i = read_string_literal(body, j) + translations[key] = value + else: + i += 1 + return translations + + +def find_matching_bracket(s, start): + depth, i, in_string, escape = 0, start, False, False + while i < len(s): + c = s[i] + if in_string: + if escape: + escape = False + elif c == "\\": + escape = True + elif c == '"': + in_string = False + else: + if c == '"': + in_string = True + elif c == "[": + depth += 1 + elif c == "]": + depth -= 1 + if depth == 0: + return i + i += 1 + raise ValueError("unbalanced brackets starting at %d" % start) + CATEGORY_NAMES = { "firewallFilter": "Firewall: Filter-Regeln", "firewallNat": "Firewall: NAT (Portweiterleitung etc.)", @@ -268,20 +328,56 @@ def parse_schema(src): return ordered -def kind_label(kind): - t = kind.get("type") - if t in ("text", "bool", "int", "duration", "interfacePick"): - return { - "text": "Text", - "bool": "Ja/Nein", - "int": "Zahl", +STATIC_LABELS = { + "de": { + "singleton_note": " *(Einstellungsmenü — genau ein Eintrag, kein Anlegen/Löschen)*", + "menu_line": "RouterOS-Menü: `{menu}` · REST-Pfad: `{rest}`\n", + "warning": "> ⚠️ **Achtung:** {text}\n", + "generic_note": ( + "*Noch kein kuratiertes Formular — alle Felder erscheinen als freie " + "Schlüssel/Wert-Paare (siehe „Eigener Menüpfad“).*\n" + ), + "table_header": "| Feld | RouterOS-Parameter | Typ | Pflicht | Standard | Hilfetext |", + "yes": "Ja", "no": "Nein", + "no_fields": "*Keine kuratierten Felder — generischer Schlüssel/Wert-Zugriff.*\n", + "kind": { + "text": "Text", "bool": "Ja/Nein", "int": "Zahl", "duration": "Zeitdauer (Tage/Std/Min/Sek, per Stepper)", "interfacePick": "Auswahl aus Live-Interface-Liste des Routers", - }[t] + "enumPick": "Auswahl (fest): ", + "menuItemPick": "Verweis auf bestehenden Eintrag unter `{menu}`", + }, + }, + "en": { + "singleton_note": " *(settings menu — exactly one entry, no add/remove)*", + "menu_line": "RouterOS menu: `{menu}` · REST path: `{rest}`\n", + "warning": "> ⚠️ **Warning:** {text}\n", + "generic_note": ( + "*No curated form yet — every field appears as a free-form " + "key/value pair (see \"Custom Menu Path\").*\n" + ), + "table_header": "| Field | RouterOS Parameter | Type | Required | Default | Help Text |", + "yes": "Yes", "no": "No", + "no_fields": "*No curated fields — generic key/value access.*\n", + "kind": { + "text": "Text", "bool": "Yes/No", "int": "Number", + "duration": "Time duration (days/hrs/min/sec, via stepper)", + "interfacePick": "Picker from the router's live interface list", + "enumPick": "Fixed choice: ", + "menuItemPick": "Reference to an existing entry under `{menu}`", + }, + }, +} + + +def kind_label(kind, labels): + t = kind.get("type") + if t in labels["kind"] and t != "enumPick" and t != "menuItemPick": + return labels["kind"][t] if t == "enumPick": - return "Auswahl (fest): " + ", ".join(f"`{o}`" for o in kind.get("options", [])) + return labels["kind"]["enumPick"] + ", ".join(f"`{o}`" for o in kind.get("options", [])) if t == "menuItemPick": - return f"Verweis auf bestehenden Eintrag unter `{kind.get('menuPath')}`" + return labels["kind"]["menuItemPick"].format(menu=kind.get("menuPath")) return "—" @@ -289,7 +385,19 @@ def esc(s): return "" if s is None else s.replace("|", "\\|").replace("\n", " ") -def render_expert_reference(menus): +def schema_anchor(menu_path): + """Deterministic HTML anchor id for one Experte-menu's Manual heading, from its + RouterOS menu path — the same transform is duplicated in Swift (ManualAnchors.swift) + so the app can compute a schema's anchor from `RouterOSMenuSchema.menuPath` alone, + with no generated mapping file to keep in sync.""" + return "schema-" + menu_path.strip("/").replace(" ", "-") + + +def render_expert_reference(menus, lang, translate): + """`translate(s)` maps a German source string (displayName/summary/explanation/ + warning/field label/help/category name) to this language's text — identity for + "de", the app's own L10n.swift dictionary for every other language.""" + labels = STATIC_LABELS[lang] by_cat = {} for m in menus: by_cat.setdefault(m["category"], []).append(m) @@ -298,50 +406,49 @@ def render_expert_reference(menus): for cat in CATEGORY_ORDER: if cat not in by_cat: continue - lines.append(f"### {cat}\n") + lines.append(f"### {translate(cat)}\n") for m in by_cat[cat]: - note = " *(Einstellungsmenü — genau ein Eintrag, kein Anlegen/Löschen)*" if m["isSingleton"] else "" - lines.append(f"#### {m['displayName']}{note}") - lines.append(f"RouterOS-Menü: `{m['menuPath']}` · REST-Pfad: `{m['restPath']}`\n") + note = labels["singleton_note"] if m["isSingleton"] else "" + lines.append(f'') + lines.append(f"#### {translate(m['displayName'])}{note}") + lines.append(labels["menu_line"].format(menu=m["menuPath"], rest=m["restPath"])) if m["summary"]: - lines.append(f"{m['summary']}\n") + lines.append(f"{translate(m['summary'])}\n") if m["explanation"] and m["explanation"] != m["summary"]: - lines.append(f"{m['explanation']}\n") + lines.append(f"{translate(m['explanation'])}\n") if m.get("warning"): - lines.append(f"> ⚠️ **Achtung:** {m['warning']}\n") + lines.append(labels["warning"].format(text=translate(m["warning"]))) if m["generic"]: - lines.append( - "*Noch kein kuratiertes Formular — alle Felder erscheinen als freie " - "Schlüssel/Wert-Paare (siehe „Eigener Menüpfad“).*\n" - ) + lines.append(labels["generic_note"]) elif m["fields"]: - lines.append("| Feld | RouterOS-Parameter | Typ | Pflicht | Standard | Hilfetext |") + lines.append(labels["table_header"]) lines.append("|---|---|---|---|---|---|") for f in m["fields"]: default = f"`{esc(f['defaultValue'])}`" if f["defaultValue"] else "—" + required = labels["yes"] if f["required"] else labels["no"] lines.append( - f"| {esc(f['label'])} | `{esc(f['key'])}` | {kind_label(f['kind'])} " - f"| {'Ja' if f['required'] else 'Nein'} | {default} | {esc(f['help'])} |" + f"| {esc(translate(f['label']))} | `{esc(f['key'])}` | {kind_label(f['kind'], labels)} " + f"| {required} | {default} | {esc(translate(f['help']))} |" ) lines.append("") else: - lines.append("*Keine kuratierten Felder — generischer Schlüssel/Wert-Zugriff.*\n") + lines.append(labels["no_fields"]) lines.append("") return "\n".join(lines).strip() -def update_expert_reference_section(): +def update_expert_reference_section(lang, md_path, translate): src = SCHEMA_SWIFT.read_text(encoding="utf-8") menus = parse_schema(src) - ref_md = render_expert_reference(menus) + ref_md = render_expert_reference(menus, lang, translate) - manual = MANUAL_MD.read_text(encoding="utf-8") + manual = md_path.read_text(encoding="utf-8") start_marker, end_marker = "", "" start = manual.index(start_marker) + len(start_marker) end = manual.index(end_marker) manual = manual[:start] + "\n\n" + ref_md + "\n\n" + manual[end:] - MANUAL_MD.write_text(manual, encoding="utf-8") - print(f"Expert reference updated: {len(menus)} menus, {sum(len(m['fields']) for m in menus)} fields") + md_path.write_text(manual, encoding="utf-8") + print(f"[{lang}] Expert reference updated: {len(menus)} menus, {sum(len(m['fields']) for m in menus)} fields") # --- Diagram rendering --- @@ -363,57 +470,105 @@ def render_diagrams(): # --- Markdown -> HTML -> PDF --- -def render_pdf(): +STYLE = """ + body { font-family: -apple-system, "Helvetica Neue", Arial, sans-serif; font-size: 10.5pt; line-height: 1.5; color: #1a1a1a; } + h1 { font-size: 20pt; border-bottom: 2px solid #2f6fb0; padding-bottom: 6px; } + h2 { font-size: 15pt; color: #2f6fb0; margin-top: 28px; border-bottom: 1px solid #ccc; padding-bottom: 3px; } + h3 { font-size: 12.5pt; color: #1a4a75; margin-top: 20px; } + h4 { font-size: 11pt; margin-top: 14px; margin-bottom: 4px; } + code { background: #f2f2f2; padding: 1px 4px; border-radius: 3px; font-size: 92%; } + table { border-collapse: collapse; width: 100%; margin: 8px 0 16px 0; font-size: 9pt; } + th, td { border: 1px solid #ccc; padding: 4px 6px; text-align: left; vertical-align: top; } + th { background: #eef4fb; } + tr { page-break-inside: avoid; } + blockquote { border-left: 4px solid #d9a441; background: #fff8ea; margin: 10px 0; padding: 6px 12px; } + img { max-width: 90%; display: block; margin: 14px auto; } + a { color: #2f6fb0; } + hr { border: none; border-top: 1px solid #ddd; margin: 24px 0; } +""" + + +def render_body_html(md_path): from markdown_it import MarkdownIt - md_text = MANUAL_MD.read_text(encoding="utf-8") - md = MarkdownIt("gfm-like").enable("table") - body_html = md.render(md_text) + md_text = md_path.read_text(encoding="utf-8") + # html=True: lets the `` anchors inserted before each heading (see + # schema_anchor() and Manual.md's hand-placed tab-/step-anchors) pass through as + # real DOM ids instead of being escaped as literal text — CommonMark disables raw + # HTML by default, this is the one option that matters for that here. + md = MarkdownIt("gfm-like", {"html": True}).enable("table") + return md.render(md_text) - def fix_img(m): + +def fix_img_srcs(body_html, embed_as_data_uri): + import base64 + import mimetypes + + def fix(m): prefix, path, suffix = m.group(1), m.group(2), m.group(3) - if path.startswith(("http://", "https://", "file://", "/")): + if path.startswith(("http://", "https://", "file://", "data:", "/")): return m.group(0) - return f'{prefix}file://{(ROOT / path).resolve()}{suffix}' + full = (ROOT / path).resolve() + if embed_as_data_uri: + mime = mimetypes.guess_type(str(full))[0] or "image/png" + data = base64.b64encode(full.read_bytes()).decode("ascii") + return f'{prefix}data:{mime};base64,{data}{suffix}' + return f'{prefix}file://{full}{suffix}' - body_html = re.sub(r'(]*src=")([^"]+)("[^>]*>)', fix_img, body_html) + return re.sub(r'(]*src=")([^"]+)("[^>]*>)', fix, body_html) - html = f""" -RouterOS Assistant — Bedienungsanleitung + +def render_pdf(lang, md_path, pdf_path): + body_html = fix_img_srcs(render_body_html(md_path), embed_as_data_uri=False) + html = f""" +RouterOS Assistant — Manual {body_html}""" +{STYLE}{body_html}""" - html_path = ASSETS / "_manual_build.html" + html_path = ASSETS / f"_manual_build_{lang}.html" html_path.write_text(html, encoding="utf-8") subprocess.run( [CHROME, "--headless", "--disable-gpu", "--no-pdf-header-footer", - f"--print-to-pdf={MANUAL_PDF}", f"file://{html_path}"], + f"--print-to-pdf={pdf_path}", f"file://{html_path}"], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, ) html_path.unlink() - print(f"PDF written: {MANUAL_PDF} ({MANUAL_PDF.stat().st_size // 1024} KB)") + print(f"[{lang}] PDF written: {pdf_path} ({pdf_path.stat().st_size // 1024} KB)") + + +def render_app_html(lang, md_path): + """Self-contained Manual[_lang].html (images embedded as base64 data URIs, no + external file references) bundled straight into the app as a resource — see + ManualView.swift. Self-contained because once inside the .app bundle there's no + Manual-assets/ directory next to it to resolve relative image paths against.""" + body_html = fix_img_srcs(render_body_html(md_path), embed_as_data_uri=True) + html = f""" +RouterOS Assistant — Manual +{body_html}""" + + suffix = "" if lang == "de" else f"_{lang}" + out = ROOT / f"RouterOSAssistant/Resources/Manual{suffix}.html" + out.write_text(html, encoding="utf-8") + print(f"[{lang}] App HTML written: {out} ({out.stat().st_size // 1024} KB)") def main(): - update_expert_reference_section() + translations = load_l10n_translations() + + def translate_en(german): + return translations.get(german, german) + + translators = {"de": lambda s: s, "en": translate_en} + render_diagrams() - render_pdf() + for lang, cfg in LANGUAGES.items(): + update_expert_reference_section(lang, cfg["md_source"], translators[lang]) + render_pdf(lang, cfg["md_source"], cfg["pdf"]) + render_app_html(lang, cfg["md_source"]) if __name__ == "__main__": diff --git a/found.md b/found.md index ac523e6..ba6e866 100644 --- a/found.md +++ b/found.md @@ -167,7 +167,29 @@ Ursache: `focusPanel(subGraph:subLayout:)` in `OverviewView.swift` rendert Kante Build+alle 99 Unit-Tests grün, live bestätigt. ### 7. Manual direkt in die App integrieren -**Status:** offen +**Status:** fixed (live bestätigt) + +Wunsch: Manual so in die App integrieren, dass ein Hilfepunkt in der aktuell geöffneten Sektion direkt zur passenden Stelle im Manual springt (Textanker). + +Rückfrage vorab geklärt (AskUserQuestion): eingebettetes HTML (WebView) statt PDF/PDFKit; eigenes Hilfe-Fenster (wie Settings ⌘,) statt eigener Tab; Sprungmarken pro Wizard-Schritt + pro Experte-Schema, nicht nur pro Haupt-Tab. + +Umsetzung: +- **`build-manual.py`**: ``-Anker automatisch vor jede Experte-Menü-Überschrift eingefügt (`schema_anchor(menuPath)`, deterministisch aus dem RouterOS-Menüpfad). `Manual.md` bekam zusätzlich 12 handgesetzte ``-Anker vor den 6 Haupt-Tab- und 6 Wizard-Schritt-Überschriften. Neue Funktion `render_app_html()` erzeugt ein eigenständiges `RouterOSAssistant/Resources/Manual.html` (Bilder als Base64 eingebettet, kein `Manual-assets/`-Ordner nötig im App-Bundle) — MarkdownIt jetzt mit `html=True`, sonst wären die ``-Tags als Text escaped statt als echte DOM-IDs zu rendern. +- **`ManualView.swift`** (neu, `Features/Manual/`): `ManualAnchor`-Enum mit den 12 statischen Ankern + `schema(menuPath:)` (spiegelt `schema_anchor()` exakt — kein generiertes Mapping nötig, beide Seiten wenden dieselbe simple Transformation an). `ManualNavigator` (ObservableObject, app-weit als `@StateObject` in `RouterOSAssistantApp`) hält den angeforderten Anker. `ManualWebView` (WKWebView via `NSViewRepresentable`) lädt das gebündelte `Manual.html` einmalig, springt bei Anker-Änderung per JavaScript `scrollIntoView` (kein Reload/Flackern). Neues `Window("Handbuch", id: "manual")` in `RouterOSAssistantApp.swift`. +- **`ManualHelpButton`**: wiederverwendbarer "?"-Toolbar-Button, öffnet/fokussiert das Handbuch-Fenster und springt zum übergebenen Anker. Eingebaut in: alle 6 Haupt-Tabs (Verbinden, Übersicht, LAN-Scanner, Experte, Sicherungen — je Toolbar), alle 6 Wizard-Schritte (WAN/LAN/VLAN/WLAN/Firewall/Review), und `ExpertMenuDetailView` bekommt pro geöffnetem Schema automatisch den passenden Anker (`ManualAnchor.schema(schema.menuPath)`) — alle 45 Experte-Menüs sind damit einzeln verlinkt, nicht nur der Experte-Tab pauschal. + +Bewusst nicht umgesetzt: Settings-Fenster (⌘,) hat noch keinen Hilfe-Button — macOS-Settings-Fenster haben konventionell keine Toolbar, ein Button dort hätte nicht ins native Bild gepasst; bei Bedarf nachrüstbar (Kapitel 7 im Manual existiert bereits, Anker `tab-settings` ist gesetzt). + +Build grün, alle 99 Unit-Tests grün, `Manual.html` bestätigt im App-Bundle (`Contents/Resources/Manual.html`). Noch nicht live geprüft — bitte: Hilfe-Buttons in mehreren Tabs/Wizard-Schritten/Experte-Menüs anklicken, prüfen ob das Handbuch-Fenster öffnet und zur richtigen Stelle springt. + +Nachbesserung 1 (User-Feedback: "das manual schaltet aber nicht die Sprache in englisch um, denk dran weitere Sprachen folgen"): Rückfrage geklärt — komplette Handübersetzung aller Kapitel (nicht nur Kapitel 5 automatisch), Mechanismus generisch für beliebig viele Sprachen statt hart DE/EN. + +Umsetzung: +- **`Manual.en.md`** (neu): vollständige Handübersetzung aller Fließtext-Kapitel (0,1,2,3,4,6,7) — dieselbe Struktur/Anker wie `Manual.md`. Kapitel 8 "English summary" (bisheriger Behelf) aus `Manual.md` entfernt, da jetzt redundant. +- **`build-manual.py`** generalisiert: neues `LANGUAGES`-Dict (`{"de": Manual.md, "en": Manual.en.md}`, für weitere Sprachen nur ein neuer Eintrag + `Manual..md` nötig, kein neuer Python-Code). Kapitel 5 (Experte-Referenz, automatisch generiert) wird jetzt pro Sprache übersetzt, indem `L10n.swift`s eigenes DE→EN-Übersetzungs-Dictionary der App selbst wiederverwendet wird (per Regex aus dem Swift-Quelltext geparst, 714 Einträge) — Feldlabels/Hilfetexte im Manual stimmen dadurch exakt mit dem überein, was die App in Englisch zeigt, keine zweite, separat gepflegte Übersetzung. Bug beim ersten Anlauf: Klammersuche fand die falsche `[` (die des Typannotation `[String: String]`, nicht die des Array-Literals) — 0 Übersetzungen geladen, dadurch blieb Kapitel 5 komplett Deutsch. Gefixt, Gegenprobe: 714 Einträge geladen. +- **`ManualView.swift`**: `ManualWebView` lädt jetzt `Manual.html` (de) oder `Manual_.html` (alles andere), abhängig von `@AppStorage("appLanguage")`, mit Fallback auf Deutsch falls eine Sprache (noch) keine Übersetzung hat. Lädt bei Sprachwechsel neu (`Coordinator` merkt sich die zuletzt geladene Sprache), springt danach weiterhin zum aktuellen Anker. + +Build grün, alle 99 Unit-Tests grün, `Manual.html` + `Manual_en.html` beide bestätigt im App-Bundle. Bitte nochmal live testen: Sprache auf Englisch umschalten, Hilfe-Button klicken, prüfen ob Handbuch-Fenster jetzt englisch anzeigt. ### 8. Abwechselnde Farbkombis bei Tabellenansichten **Status:** fixed (live bestätigt: "passt") @@ -187,3 +209,8 @@ Build grün, alle 99 Unit-Tests grün. Achtung beim Live-Test: kann auch den "Ka Nachbesserung 2 (User-Feedback: auch das "Weitere Parameter"-Grid im Experte-Bearbeiten-Sheet soll Zeilen abwechselnd einfärben — Zeile 1,3,5... —, "bitte für das komplette Projekt umsetzen"): Grid-Zeilen (2 Parameter pro sichtbarer Zeile) bekommen jetzt `.background(TableZebra.color(for: rowIndex))` pro `GridRow`. Zusätzlich auf jede weitere echte Tabellen-/Listenansicht im Projekt ausgeweitet: "Bekannte Router"-Liste + Interface-Liste (Verbinden-Tab), Sicherungsliste (Sicherungen-Tab), Rohfelder-Sheet + Port-Scan-Ergebnisliste (LAN-Scanner), geplante Änderungen + Ablauf-Log (Einrichten-Wizard Review/Apply), Feld-Details + Verbindungsliste im Übersicht-Knoten-Detailpanel. Nicht angefasst: Experte-Sidebar (Navigationsliste, keine Datentabelle) und die Setup-Wizard-Konfigurationsformulare (VLAN/WLAN/LAN/WAN — je Zeile ein Mehrfeld-Unterformular, keine gleichförmigen Datenzeilen, Zebra-Streifen würden dort eher verwirren). Build grün, alle 99 Unit-Tests grün. Bitte erneut live testen. + +### 10. Selbständiger Wiederverbindungsversuch nach Disconnect +**Status:** offen + +Wunsch: fällt die Verbindung zum Router weg (z.B. während einer laufenden Sitzung), soll die App selbständig versuchen, die Verbindung wiederherzustellen, statt einfach im getrennten Zustand zu bleiben.