ISC³ network
ISC³ lives in an isolated separate network inside the school, reachable via the VPN. This page maps the appliances, subnets and physical connectivity.
Topology
Two MikroTik devices run the network: a CCR2004-1G-12S+2XS (core router: WAN, NAT, Wireguard hub) and a CRS326-24G-2S+ (access switch for the nodes and their iDRACs), joined by a 2×10 G LACP bond. Everything is bridged into a single flat L2 domain (no VLAN filtering) — the subnets below are logical separations only, routed on the two MikroTiks. The same routers also carry the Rumba subnets.
Topology verified by logging into both routers (July 2026), NAS and PDU ports re-verified against the
CCR2004 bridge host table in August 2026 — the NAS is on sfp-sfpplus6/7 (it was previously
documented as sfp+3) and the PDU on sfp-sfpplus10.
sfp-sfpplus10 runs at 100 Mb, and that is correctThe PDU's management NIC is 10/100 only. Don't "fix" it.
Subnets
| Subnet | Usage | Gateway |
|---|---|---|
192.168.88.0/24 | Network appliances (NAS, PDU), calypsomaster, rumba, epyc0/epyc1 | 192.168.88.1 (CCR2004) |
192.168.89.0/24 | VPN | 192.168.89.1 (CCR2004) |
192.168.90.0/24 | Server iDRACs (out-of-band) | 192.168.90.1 (CRS326) |
192.168.91.0/24 | Servers | 192.168.91.1 (CRS326) |
192.168.92.0/24 | Rumba iDRAC (out-of-band) | 192.168.92.1 (CCR2004) |
192.168.93.0/24 | legacy Rumba servers — unused since the July 2026 reinstall | 192.168.93.1 (CCR2004) |
192.168.94.0/24 | legacy Rumba LXC containers — unused since the July 2026 reinstall | 192.168.94.254 (CCR2004) |
The CCR2004 src-NATs all legacy WireGuard traffic towards 192.168.88.0/24 to 192.168.88.1 (rule "NAT Wireguard -> Interne"). Appliances on that subnet therefore cannot tell those VPN users apart — and per-IP protections lump everyone together. This once locked the whole admin team out of the NAS; 192.168.88.1 and 192.168.88.0/24 are since on the DSM allow list so that particular block cannot recur. Keep this NAT quirk in mind for any other per-source-IP security feature on the 88 subnet.
NetBird runs with masquerade off (since 2026-08-03): every
NetBird client reaches the rack with its own overlay address (100.65.x.x), so logs attribute
actions to individuals and per-IP protections act per user. The plumbing that makes this work: a
static return route on the CCR2004 (100.64.0.0/10 → 192.168.88.159, covers the CRS326 too via
its default route) and an input-chain accept for 100.64.0.0/10 on the CRS326 (its input
otherwise drops non-88/91 sources, which would hide the switch's management UI). Replies from
88-subnet appliances hairpin through the CCR (first packet is asymmetric); harmless because
neither MikroTik has a drop invalid/default-drop forward rule. The NAS auto-block therefore
applies per user on the NetBird path — deliberately, so do not add 100.64.0.0/10 to the DSM
allow list.
Storage fast path (nodes ↔ NAS)
Traffic between the 91 and 88 subnets is software-routed by the CRS326's single 800 MHz core
(RouterOS 6, no L3 offload on this switch chip), with the return path additionally hairpinning
through the CCR2004 — a ~39 MB/s ceiling, measured by the
2026-08-02 performance audit. Since everything is one
flat L2 domain, the fix applied then was on-link routes so both ends ARP each other directly and
the packets never touch a router CPU (61.5 MB/s NFS writes, 108–113 MB/s reads per node —
before/after numbers on the history page and the
NAS history page).
What remains of it today: the NAS holds a static 192.168.91.250 on eth3, directly in the node
subnet, and that is the address every node and lab VM must mount
(how) — nothing in the 91 subnet routes to 192.168.88.250 any
more. The NAS-side script /usr/local/etc/rc.d/nas-fastpath.sh (a 192.168.91.0/24 dev eth2 route
re-added at DSM boot) is still installed; the per-node /32 route and its nas-fastpath.service
went with the 2026-08-28 node rebuild. Whether the NAS-side script is still needed is a
todo.
Applied from the same audit (2026-08-02, counters verified): a fasttrack-connection rule now
heads the CCR2004 forward chain (established/related traffic skips the slow conntrack path), and
both ends of the bond use transmit-hash-policy=layer-3-and-4 so flows spread across both
10 G links (layer-2 hashing pinned ~everything to one link per direction).
established,related in input, not just forwardThe CRS326 had no Internet for an unknown length of time — not egress, NAT or the SInf uplink, but
its own input chain ending in drop with no established,related accept, so answers to
connections it opened were dropped by itself. The forward chain did have that rule, which is
why everything behind the switch was online while the switch was not: NTP never synced and
check-for-updates timed out, both looking exactly like an upstream block. Found and fixed
2026-08-09. When a MikroTik alone cannot reach out, read its input chain before blaming the
uplink.
Setting transmit-hash-policy on the live CCR2004 bond re-formed the LACP aggregate — observed
live on 2026-08-02 as ~30–60 s of total unreachability
for everything behind the bond. Plan any future hash/bond edits for a quiet window.
The CRS326's old DHCP/DNS liabilities are closed: the pool that spanned the whole /24 was
narrowed and then both DHCP servers disabled outright (2026-08-05, nothing used them), and its
device DNS points at the CCR since 2026-08-09 instead of the retired 172.30.7.1.
Both MikroTiks run RouterOS 7.23.3 with matching RouterBOOT since 2026-08-09 —
the CCR from 7.20.4, the CRS
from 6.49.19 — and the CRS's DNS points at the CCR.
The CCR's pre-WireGuard leftovers are gone: Dude disabled 2026-08-05,
the L2TP server, its IPsec secret, the vpn PPP account and the wifx.ch L2TP client deleted
2026-08-09. Remote access is NetBird; the legacy WireGuard fleet was
turned off on 2026-08-07 and keeps one enabled break-glass peer.
Measured 2026-08-21 on wg13, the only enabled peer: the client's packets reach the CCR2004, the
router answers, and 40 to 95 % of the replies never arrive — in dead windows of about 14 s. Loss is
independent of packet size and rate, the RTT of what survives is stable at 5 ms, and the router's
own counters and CPU are clean. Reproduced from two different ISPs, so the client's home path is
not involved. Until it is fixed, the documented emergency access does not work reliably: assume
ssh and the Proxmox UI will time out over it. Story and measurements in
the incident.
Addressing
The eleven carnaval nodes — carnavalN is the ex-calypsoN chassis
and kept its address (since 2026-08-28; carnaval5 is powered off):
| Node | IP | iDRAC |
|---|---|---|
carnaval0 … carnaval10 | 192.168.91.10 … .20 (.91.(10+N)) | 192.168.90.10 … .20 (.90.(10+N)) |
The calypsomaster node is not available for connection to students. It still carries a kubeadm
control plane, but nothing runs on it — its former workers are carnaval nodes
(conversion plan):
| Node | IP |
|---|---|
calypsomaster | 192.168.88.248 |
calypsomaster iDRAC | 192.168.90.248 |
Other appliances on the network:
| Appliance | IP |
|---|---|
nas | 192.168.88.250 (plus 192.168.91.250 on its second 10 G port — why) |
pdu | 192.168.88.10 |
| router C (FS S3600-48T4S switch) | 192.168.88.2 |
The Rumba Proxmox node also lives on this subnet (rumba, 192.168.88.51, statically configured on vmbr0, attached to the CCR2004 on sfp+5), as does epyc1 (192.168.88.46, configured statically on the host — a Proxmox VE standalone node since August 2026 — with its BMC on 192.168.88.12). epyc0 (192.168.88.47) is in repair as of August 2026 and offline. Both reach the CCR2004 through the FS S3600-48T4S switch (router C) on sfp+12. See the rack layout page. The Tango workstation pair also lives here — the racked node on a dynamic 192.168.88.43 rather than the reserved .20 / .21 (why), the other momentarily out of the rack.
DNS
The CCR2004 (192.168.88.1) is the DNS server for the whole network (DHCP domain isc3, upstream 8.8.8.8, remote requests allowed — it answers VPN clients too). Machines with a static DNS entry can be reached by name, bare or as <name>.isc3:
| Name | IP |
|---|---|
calypso-master / calypsomaster | 192.168.88.248 |
calypsomaster-idrac | 192.168.90.248 |
rumba | 192.168.88.51 |
rumba-idrac | 192.168.92.10 |
srv-web01 | 192.168.88.150 |
nas | 192.168.88.250 |
pdu | 192.168.88.10 |
epyc0 | 192.168.88.47 |
epyc1 | 192.168.88.46 |
epyc1-bmc | 192.168.88.12 |
carnaval0 … carnaval10 | 192.168.91.10 … .20 |
The CCR has no domain-suffix handling: rumba and rumba.isc3 are two separate /ip dns static
records. Add both when registering a host, or the bare name will resolve while the FQDN silently
does not (which is how the carnaval entries were first added, 2026-08-04).
provisioning/network/carnaval-dns.sh writes both for a carnaval node.
.isc3 replaced the .calypso domain on 2026-08-28 (decision) — the .calypso twins and the
calypsoN names still exist on the router until removed
(todo). The PVE hosts carry <name>.isc3 in /etc/hosts (rewritten 2026-08-28, certificates reissued).
The SInf gateway (172.30.7.1) is the upstream WAN hop; it is no longer used as a DNS server.
Inbound from the Internet
Publicly, calypso.hevs.ch resolves to 153.109.29.7, which HES-SO/SInf maps to the CCR2004's WAN
address 172.30.7.2. Only two ports are published, both by dst-nat on the CCR2004:
| Port | Forwarded to | Serves |
|---|---|---|
| TCP 80 | 192.168.88.150 | ISC landing page — redirected to HTTPS by Caddy, and used for ACME challenges |
| TCP 443 | 192.168.88.150 | Same page over TLS (Let's Encrypt certificate for calypso.hevs.ch) |
UDP 51820 (Wireguard) is handled by the router itself, not by a forward.
Verified 2026-08-03 during the NetBird deployment: a dst-nat for UDP 3478 (STUN) counted zero packets across a client reconnect and a manual probe from outside — the filter is upstream at SInf/vsnet, not on the CCR2004. Inbound, the rack is reachable on exactly TCP 80/443 + UDP 51820, nothing else; adding a dst-nat for any other port is a no-op until SInf opens it. Details in When the network lies.
Both dst-nat rules shadow the MikroTik's own web interface: disabling them makes WebFig
reachable from the Internet on calypso.hevs.ch. To publish a different service, retarget them
(or better, add a vhost on srv-web01, which already terminates TLS) — never disable them.
Until 2026-07-31 they pointed at 192.168.94.13, the reverse-proxy container of the pre-migration
Rumba. That container disappeared with the reinstall, which left both ports pointing into a void
until they were retargeted.
Outbound to the Internet (what the upstream filters)
The SInf/vsnet uplink filters outbound traffic from the whole subnet — in ways that make ping,
dig and bare ssh misleading. The full failure catalogue with symptoms, wrong
diagnoses and the diagnostic toolbox is on its own page:
When the network lies. Summary of the facts, verified from rumba
(2026-08-01 during the ISC Learn restore,
SMTP re-checked 2026-08-02):
- ICMP to the Internet is dropped —
ping 8.8.8.8failing is normal, not a symptom. - Standard ports work: outbound 80/443 (and 22, per the GitLab tests) are fine.
- Non-standard ports are dropped: outbound TCP 20002 (hannibal's SSH) times out, while the
same host answers instantly from other networks. Test method:
curl portquiz.net:443(works) vscurl portquiz.net:20002(hangs) — portquiz listens on every port, so the difference is the uplink, not the target. - SMTP: only 465 to Infomaniak — 25/465/587 were all dropped (2026-08-02) until SInf granted
an egress-allow on request; verified 2026-08-10, it covers the whole
192.168.88.0/24but only TCP 465 to Infomaniak's mail IPs. 25 and 587 remain dropped, as does 465 to any other provider. See Email. - IPv6 is a trap: DNS returns AAAA records but there is no IPv6 route, so clients that prefer
IPv6 fail with Network is unreachable. Force IPv4 (
ssh -4,curl -4).
Workaround when a machine inside must reach a filtered port outside: a reverse tunnel through an
admin laptop that sees both networks, e.g.
ssh -f -N -R 127.0.0.1:2222:target.example:20002 root@rumba — sustained ~20–25 MB/s during the
293 GB ISC Learn pull. Asking SInf to open a specific egress port is the long-term alternative.
Uplink bandwidth (measured 2026-08-01)
Measured from rumba with parallel curl -4 transfers over HTTPS against
speed.cloudflare.com (nearest PoP, so this is the local uplink capacity, not long-haul
throughput), cross-checked the same day against mirror.init7.net. Two runs a few hours apart
gave consistent numbers:
| Direction | 1 TCP stream | Aggregate ceiling |
|---|---|---|
| Download | ~1.2–1.6 Gbit/s | ~4.3 Gbit/s (8 streams ≈ 16 streams — flat) |
| Upload | ~0.6–0.75 Gbit/s | ~1.3–1.4 Gbit/s (4 streams; more doesn't help) |
The link is asymmetric (~4.3 down / ~1.3 up), by upstream shaping or provisioning. Practical corollary: a single long-distance transfer should be expected to run at the single-stream figures, and the ~20–25 MB/s of the ISC Learn pull above was the laptop-relay bottleneck, not the uplink (~25× headroom downstream).
Both this network and the speed-test endpoints lie in their own ways (Cloudflare's silent
HTTP 429 budget above all) — the method notes and the exact scripts are in
History & operations.