Portquiz tests outbound TCP and UDP connectivity to a remote server by attempting connections on every port, or a chosen list of ports and ranges. It identifies which ports make it through network infrastructure such as firewalls, NAT devices, and proxies, and reports how each closed port was closed: rejected (actively refused), dropped (silently discarded), or interfered (something other than the portquiz server answered, such as a transparent proxy, captive portal, or DPI filter).

There are three clients that share the same scanning engine: a command line client for Windows, macOS, and Linux, an Android app, and a browser test page served by the portquiz server itself. The browser page needs nothing installed, so it works on phones and locked-down machines, testing TCP with web requests and UDP with WebRTC STUN requests. The server runs on Linux, uses iptables to redirect every port to a single listener, and can get a Let’s Encrypt certificate to serve the browser page over HTTPS. Each release includes an Alpine package with an OpenRC service.

A public server runs at portquiz.toor.sh. Open it in a browser for a quick check, or point the command line client or Android app at it for a full test.

Scans use rate limiting and adaptive timeouts, so testing every port of one protocol takes about 2 minutes by default. Results can be saved as JSON reports and compared with -diff, for example to check a network before and after a firewall change, or to compare two networks. The Android app and browser page keep a history of past runs and can compare any two of them, including reports imported from other clients.

./portquiz -json home.json -label "home wifi" portquiz.toor.sh
./portquiz -json office.json -label office portquiz.toor.sh
./portquiz -diff home.json office.json