Skip to content
netproof
ChallengesPathsSet up your labSign in
netproof

Prove you can do the job before anyone gives you one.

ChallengesCommon fixesSet up your labSign inPrivacyTermsContact

Challenges

Pick a real scenario, build the fix in a free local lab, and submit your work.

Challenge of the weekPublish an inside server on one public portAn outside client needs to reach an inside web server through the router's single public IP, but only that one port, nothing else.Take it on →Start hereNew to NetProof? Do the tutorial first.A guided 10-minute lab that walks you through one real fix from start to finish. No signup, runs in your browser.Start the tutorial →

Want a guided order? Follow a path. Prefer to solve on your own machine? Set up your lab. Seen a problem worth solving? Propose a challenge.

67 of 67
  • tutorialtutorial

    First steps: your first fix in the lab

    A two-minute guided tour of the browser lab. Add one route, watch it work, and earn your first proof. No setup, no install.

    ~10 min
  • easyaddressing

    Carve up a /24 with VLSM, efficiently

    One /24, four segments with different host counts. Design a non-overlapping VLSM plan with no waste, apply it, and prove every segment reaches every other.

    ~35 min
  • easysecurity

    Harden the SSH daemon

    The SSH server still allows root logins and password auth, the two settings every attacker hopes to find. Lock down sshd_config to key-only, no-root access.

    ~20 min
  • easyrouting

    host-A can't reach host-B

    Two LANs, one router link between them, and no connectivity. Find the gap and fix it.

    ~30 min
  • easylinux

    Lock down a secrets file

    A config file with credentials is world-readable. Fix its ownership and permissions so the owner can write it, the app group can read it, and nobody else can touch it. It's the daily bread of Linux administration.

    ~20 min
  • easylinux

    Schedule a nightly backup with cron

    The backup job is misconfigured and runs far too often. Fix the crontab so it runs once a day at 02:30, graded by actually testing when the schedule fires.

    ~15 min
  • easylinux

    Set up a team's users and groups

    A new team needs accounts with the right group access. Developers, deploy, and one person who spans both. Write the user and group commands, graded on the resulting memberships.

    ~20 min
  • easylinux

    The app logs are filling the disk

    An application writes logs that nothing ever rotates, and the disk is filling up. Add a logrotate policy that rotates, caps, compresses, and retains a sane number of files.

    ~25 min
  • easydevops

    The app starts before its database is ready

    A Compose stack starts the app the moment the database container starts, not when it can accept connections, so the app crashes on boot. Make it wait for a healthy database.

    ~25 min
  • easyrouting

    The branch office can't reach the internet

    A stub site has no way out. Everything internal works, but nothing beyond the edge is reachable. Add the route that fixes it.

    ~25 min
  • easylinux

    Write a proper systemd service

    A service starts but never restarts on crash, runs as root, and won't come back after a reboot. Write a unit file that restarts on failure, runs as a non-root user, and starts at boot.

    ~20 min
  • mediumswitching

    A native VLAN mismatch on the trunk

    Two switches share an 802.1Q trunk, but the two ends disagree on the native VLAN. Untagged frames land in the wrong VLAN. Align the native VLAN on both ends.

    ~35 min
  • mediumservices

    A remote subnet isn't getting addresses

    There's one central DHCP server, and a subnet a router-hop away that leases nothing. Bridge the gap with a relay.

    ~50 min
  • mediumlinux

    A shared folder the whole team can use

    The dev team shares /srv/projects, and the last "fix" was chmod 777. Set real group ownership, group collaboration rights, setgid inheritance, and lock everyone else out.

    ~20 min
  • mediumvirtualization

    A tenant VM landed on the wrong network

    Two tenants run on one host, each on its own bridge so they can't see each other. One VM is on the wrong bridge and can reach the other tenant. Move it back.

    ~35 min
  • mediumrouting

    Add a backup default route that only kicks in on failure

    A site has a primary uplink and an idle backup. Add a floating static default route so the backup is used only when the primary's route is gone.

    ~35 min
  • mediumcloud

    An IAM policy that grants everything

    A Terraform IAM policy allows "*" on "*" (full admin) for a job that only reads and writes one bucket. Scope it to least privilege.

    ~30 min
  • mediumospf

    An OSPF neighbor won't come up

    Three routers, OSPF area 0, but one adjacency is stuck. Two routers can ping each other yet never become neighbors. Diagnose why.

    ~50 min
  • mediumbgp

    BGP won't come up between two ASes

    An eBGP session between two providers won't establish, and even once it does, a prefix is missing. Fix both.

    ~60 min
  • mediumaddressing

    Carve a /24 to fit four departments

    One 10.20.0.0/24 block, four departments with very different sizes. A flat equal split doesn't fit. Design a VLSM plan that sizes each subnet to its host count.

    ~35 min
  • mediumsecurity

    Catch the port scanner, not the busy hosts

    A firewall log shows one host probing many ports in seconds, mixed with normal traffic. Write a threshold rule that flags the scanner without alerting on busy-but-benign hosts.

    ~40 min
  • mediumsecurity

    Defuse a SUID privilege escalation

    A legacy report tool is setuid-root AND world-writable, so any user can overwrite it and their code runs as root. Find the misconfiguration and fix the permissions without breaking the tool.

    ~25 min
  • mediumaddressing

    Five segments, one /23

    A warehouse, an office, a voice VLAN, a DMZ and a router link all have to fit in 172.16.4.0/23 with no overlap and no waste. Design the VLSM plan, apply it, and route between the segments.

    ~40 min
  • mediumdevops

    Gate config changes with CI

    Network changes shouldn't merge unreviewed. Write a CI workflow that checks out the repo and validates the configs on every pull request, the GitOps guardrail for network automation.

    ~30 min
  • mediumautomation

    Generate an ACL from an allow-list

    Maintaining firewall ACLs by hand drifts and errs. Render an extended ACL from a list of allowed services, so the policy is data and the device config is generated.

    ~40 min
  • mediumautomation

    Generate switch VLAN config from a template

    Hand-configuring VLANs and access ports across switches doesn't scale. Write a template that renders the VLAN database and access-port config from a variables file.

    ~40 min
  • mediumnat

    Get the LAN online with one public IP

    An inside LAN needs to reach the outside through a single public address. Routing's fine. The translation is what's missing.

    ~40 min
  • mediumsecurity

    Guest Wi-Fi can reach everything

    The guest network has a route straight into the services subnet, file server included. Write an extended ACL so guests get DNS and the portal, and nothing else.

    ~35 min
  • mediumdevops

    Harden a Dockerfile

    A container image runs as root, floats on the latest tag, and bakes an API token into a layer. Fix the Dockerfile to a pinned base, a non-root user, and no secrets in the image.

    ~25 min
  • mediumsecurity

    Harden nginx TLS

    The web frontend still negotiates SSLv3 and RC4, protocols broken for a decade. Restrict nginx to modern TLS, strong ciphers, and turn on HSTS.

    ~25 min
  • mediumdevops

    Harden the CI workflow's supply chain

    A GitHub Actions workflow pulls third-party actions by mutable tag and runs with a write-scoped token. Pin every action to a commit SHA and drop the token to least privilege.

    ~30 min
  • mediumlinux

    Harden the kernel's network stack

    A server's sysctl settings still route between interfaces and accept ICMP redirects. Lock the kernel network parameters down for a host that isn't a router.

    ~30 min
  • mediumvirtualization

    Isolate VMs with bridge VLANs

    Three VMs share one hypervisor bridge. Use VLAN filtering so the two sales VMs talk to each other while the engineering VM is isolated. That's the everyday job of virtual networking.

    ~35 min
  • mediumcloud

    Least-privilege cloud security group

    A security group leaves SSH and the database open to the whole internet. Rewrite the ingress rules so each service is reachable only from where it should be, graded by replaying traffic and flagging anything still exposed to 0.0.0.0/0.

    ~30 min
  • mediumsecurity

    Least-privilege sudo for a deploy user

    The deploy account has full root via sudo, far more than it needs. Scope it down to exactly one command (restarting the app), graded on the commands the rule actually grants.

    ~20 min
  • mediumsecurity

    Let replies in, keep new connections out

    The edge ACL lets internal hosts browse out, but it also lets the internet open new connections inward. Restrict the inbound filter to established return traffic only.

    ~40 min
  • mediumsecurity

    Lock down a host with nftables

    A server accepts connections on every port from anywhere. Write an nftables ruleset that default-drops, allows web to all, and restricts SSH to the admin network, graded by replaying real connection attempts through your rules.

    ~35 min
  • mediumsecurity

    Lock down the server subnet without locking yourself out

    Write an ACL that enforces a precise access policy, in the right place and direction, respecting the implicit deny.

    ~50 min
  • mediumservices

    Lock down the time service

    An open NTP daemon answers the whole internet and trusts unauthenticated upstreams. Restrict who it serves and require authenticated time.

    ~30 min
  • mediumservices

    One subnet leases, the other stays dark

    Two client subnets, one central DHCP server, one router relaying for them. One subnet gets addresses, the other gets nothing. Relay both.

    ~45 min
  • mediumospf

    OSPF is talking to the office LAN

    Both routers blast OSPF hellos onto their host LANs, a waste and an attack surface. Make the LAN interfaces passive without breaking the adjacency or losing the routes.

    ~30 min
  • mediumnat

    Publish an inside server on one public port

    An outside client needs to reach an inside web server through the router's single public IP, but only that one port, nothing else.

    ~40 min
  • mediumaddressing

    Replace four routes with one

    A router carries four separate static routes to four contiguous /24s. Collapse them into the single summary route that covers exactly those networks.

    ~30 min
  • mediumcloud

    Secure a Kubernetes Deployment

    A Deployment runs a privileged, root container with no resource limits and no health checks. Bring it up to a baseline pod-security standard the way a real cluster admission controller would demand.

    ~35 min
  • mediumdevops

    Segment a compose stack

    A three-tier docker-compose stack has every container on one flat network and the database published to the host. Split it into frontend/backend networks so the proxy can never touch the database.

    ~25 min
  • mediumcloud

    Stop a public S3 bucket in Terraform

    A Terraform S3 bucket is public-read and unencrypted, a data breach waiting to happen. Fix the config to block public access and turn on encryption.

    ~25 min
  • mediumautomation

    Template an OSPF fabric from a vars file

    Stop hand-writing configs. Write one Jinja2 template that generates every router's OSPF config from a vars file, and prove the rendered fabric actually converges.

    ~40 min
  • mediumcloud

    The backend accepts traffic from anywhere

    A namespace has no default-deny, and the backend's NetworkPolicy allows ingress from every pod. Lock it to default-deny plus a targeted frontend to backend allow.

    ~35 min
  • mediumvirtualization

    The DB VMs can't reach the network

    A hypervisor bridge fans two VLANs of VMs out to the physical NIC over a trunk. Web VMs reach the network; the DB VMs don't. Fix the trunk.

    ~40 min
  • mediumlinux

    The export daemon runs as root with no guardrails

    A unit file straight from a wiki page - root, no restart policy, no sandboxing. Harden it with a service account, restart-on-failure, and systemd's filesystem and privilege guards.

    ~25 min
  • mediumswitching

    The link bundle won't come up

    Two links between switches should be one LACP port-channel, but a config mismatch keeps it down. Fix it so the bundle forms.

    ~40 min
  • mediumtroubleshooting

    The OSPF neighbors won't come up

    Two routers share a link but never become OSPF neighbors, so neither learns the other's routes. Find why the adjacency is stuck and fix it.

    ~45 min
  • mediumrouting

    The rest of the network can't see the external route

    R1 has a static route to an external block, but no other router knows about it. OSPF is up. The route just isn't getting into it.

    ~40 min
  • mediumospf

    The server LAN never reaches OSPF

    A directly-connected server LAN isn't advertised into OSPF, so the neighbor can't reach it. Redistribute connected routes into OSPF.

    ~40 min
  • mediumlinux

    The sync job runs all night

    An inventory sync should poll every 15 minutes during business hours, weekdays only. Right now it fires around the clock, weekends included. Fix the schedule, graded by when it actually fires.

    ~20 min
  • mediumtroubleshooting

    The web app went dark after a change

    A client can't reach the web server, and there's more than one reason. An ACL over-blocks the web traffic, and replies have no way home. Find and fix both.

    ~45 min
  • mediumswitching

    The wrong switch is the spanning-tree root

    Three switches in a triangle, and STP elected the wrong root, so traffic takes a bad path. Make the intended switch the root, loop-free.

    ~40 min
  • mediumrouting

    Traffic dies at the second hop

    Three routers in a chain, and the far LAN is unreachable. The first hop is configured; the transit router and the return path are not.

    ~35 min
  • mediumospf

    Traffic is taking the slow path

    Two paths to the same destination, and OSPF is using the wrong one, the low-bandwidth backup link. Make it prefer the right path without breaking the backup.

    ~45 min
  • mediumswitching

    VLAN 10 and VLAN 20 can't talk

    Same-VLAN hosts reach each other, but inter-VLAN routing over a router-on-a-stick is broken. Find the L2/L3 gap.

    ~45 min
  • mediumswitching

    VLAN 20 can't reach VLAN 10

    A layer-3 switch should route between VLAN 10 and VLAN 20 using SVIs, but inter-VLAN routing is half-built. Finish it so the two VLANs can talk.

    ~45 min
  • mediumsecurity

    Write a detection for an SSH brute-force

    Read an auth.log, then write a threshold detection rule that flags the brute-force attacker without alerting on a user who just fat-fingered their password. Real detection engineering, graded on whether your rule actually fires correctly.

    ~40 min
  • mediumbgp

    Your edge is accepting routes it shouldn't

    A BGP peer is sending you a prefix you never agreed to carry. The session is fine. You just need to accept what you want and drop the rest.

    ~45 min
  • hardbgp

    A multi-homed edge keeps choosing the wrong upstream

    You have two upstreams advertising the same destination. Make your router prefer one of them outbound, and steer inbound traffic the same way.

    ~75 min
  • hardautomation

    Automate OSPF across three routers

    Don't configure by hand. Write an Ansible playbook that brings up OSPF consistently across three routers, idempotently.

    ~90 min
  • hardsecurity

    Catch DNS-tunneling exfiltration

    A host is sneaking data out over DNS. Write a detection rule that flags the tunneling domain without firing on a busy CI box that legitimately makes lots of lookups. The trick is choosing what to group by.

    ~45 min
  • hardtroubleshooting

    Everything's down: restore the network

    A multi-site network is broken by three independent faults across L2, L3, and a filter. Restore end-to-end connectivity and document what you found.

    ~120 min
  • In progress

    New labs land regularly. Switching, OSPF, BGP policy, and automation challenges are on the way.