Open ports are the front doors to your network services — and sometimes they are wide open without you knowing it. Every service running on your Mac or your home network devices listens on a specific port: your web server on port 80, SSH on port 22, file sharing on port 445. If an attacker can reach those ports, they can probe for vulnerabilities, brute-force credentials, or exploit outdated software.
Whether you are a developer checking if your local server is accessible, a system administrator verifying a firewall rule, or a security-conscious user auditing what your IoT devices expose, port scanning is a foundational skill. The good news is that macOS ships with several built-in tools that can check open ports. The bad news is that those tools are basic, slow, and tell you almost nothing about what is listening. This guide walks you through every method available on macOS — from the simplest Terminal one-liner to professional-grade scanners that identify services, detect versions, and look up known vulnerabilities. By the end, you will know exactly which tool fits your situation and how to use it.
What Is Port Scanning and Why Does It Matter?
Think of an IP address as a street address for a building. The building has 65,535 apartment doors (ports), and each door can either be open, closed, or locked behind a security gate. When a service wants to communicate over the network, it picks a door number and listens there for visitors. A web server opens door 80 (HTTP) or 443 (HTTPS). An SSH daemon opens door 22. A database might open door 3306 or 5432.
Port scanning is the act of knocking on those doors to see which ones answer. It is the single most fundamental technique in network security — used by defenders to audit their own systems and by attackers to find entry points. Understanding port scanning lets you answer critical questions: What services is my Mac exposing to the local network? Did the firewall rule I configured actually work? Is that cheap security camera streaming video to an open port anyone can reach?
TCP vs UDP Ports
There are two transport protocols that use ports: TCP (Transmission Control Protocol) and UDP (User Datagram Protocol). TCP is connection-oriented — it performs a three-way handshake (SYN, SYN-ACK, ACK) before any data flows. This makes TCP scanning reliable: if the handshake completes, the port is open. If you get a RST (reset) packet back, the port is closed. If nothing comes back, the port is likely filtered by a firewall.
UDP is connectionless. You send a packet, and if nothing comes back, the port might be open or filtered — you cannot easily tell the difference. This makes UDP scanning inherently slower and less reliable. Most port scanners focus on TCP for this reason, though services like DNS (port 53), SNMP (port 161), and DHCP (port 67/68) rely on UDP and should not be ignored in a thorough audit.
Port Ranges
Ports are divided into three ranges. Well-known ports (0–1023) are assigned to standard services by IANA — HTTP on 80, HTTPS on 443, SSH on 22, and so on. These require root privileges to open on most systems. Registered ports (1024–49151) are used by applications that register with IANA — MySQL on 3306, PostgreSQL on 5432, and many others. Dynamic or ephemeral ports (49152–65535) are assigned temporarily by the operating system for outgoing connections. When your browser fetches a web page, it uses a random ephemeral port as the source.
Why Scan Ports?
- Security auditing: Verify that only intended services are reachable. An open port you did not expect might indicate a misconfiguration or malware.
- Troubleshooting: Your application cannot connect? Check whether the destination port is actually open and accepting connections.
- Firewall verification: You configured a rule to block port 445. Did it work? A port scan tells you immediately.
- Finding running services: After scanning your local network and discovering devices, port scanning reveals what those devices are doing.
- Compliance: Many security frameworks require periodic port scans to ensure no unauthorized services are running.
Legal note: Scanning your own network is perfectly legal. Scanning networks you do not own or have permission to test can violate computer crime laws in most jurisdictions. Always get written authorization before scanning third-party systems.
Common Ports Every Mac User Should Know
Before you start scanning, you should know what you are looking for. Here is a reference table of the ports you are most likely to encounter on a home or small office network, along with their risk level. Risk indicates how dangerous it is to have that port exposed to the network without proper protection.
| Port | Service | Risk | Notes |
|---|---|---|---|
| 22 | SSH | Medium | Remote terminal access — should be firewalled or key-only |
| 53 | DNS | Medium | DNS server — can be abused for amplification attacks |
| 80 | HTTP | Low | Web server (unencrypted traffic) |
| 139 | NetBIOS | High | Legacy Windows networking — worm propagation vector |
| 443 | HTTPS | Low | Web server (encrypted traffic) |
| 445 | SMB | High | File sharing — primary target for WannaCry-style worms |
| 548 | AFP | Medium | Apple File Protocol (legacy) — replaced by SMB on modern macOS |
| 554 | RTSP | Medium | Real-Time Streaming Protocol — IP cameras, media servers |
| 631 | CUPS/IPP | Low | macOS print server — Internet Printing Protocol |
| 3306 | MySQL | High | Database — never expose to network without tunneling |
| 3389 | RDP | High | Remote Desktop Protocol — constant brute-force target |
| 5432 | PostgreSQL | High | Database — never expose to network without tunneling |
| 5900 | VNC | High | Screen sharing — often unencrypted, single-password auth |
| 8080 | HTTP Alt | Medium | Development servers, proxies, alternative web services |
| 8443 | HTTPS Alt | Low | Alternative HTTPS — common for management consoles |
| 9100 | RAW Printing | Low | Direct network printer communication |
| 62078 | iphone-sync | Low | iOS USB sync — visible when iPhone tethered via USB |
If you scan your network and find ports marked High that you were not expecting, that is a sign something needs immediate attention. SMB (445), RDP (3389), and VNC (5900) are among the most exploited ports on the internet. Database ports (3306, 5432) should never be directly reachable from a network — they should be behind a firewall or accessed via SSH tunnels only.
Method 1 — macOS Built-in Tools
macOS includes several tools that can check open ports without installing anything. They range from a retired GUI app to versatile command-line utilities. Let us go through each one.
Network Utility Port Scanner (Legacy)
Apple used to ship a graphical tool called Network Utility that included a dedicated Port Scan tab. You could enter an IP address and a port range, click Scan, and it would test each port with a basic TCP connect. If the port was open, it would appear in the results list with the service name.
On older macOS versions (pre-Ventura), you can still find it by opening Spotlight and searching for "Network Utility" or by navigating to /System/Library/CoreServices/Applications/Network Utility.app. On macOS Sonoma and later, Apple has moved its functionality into the System Information app, but the port scan feature is effectively gone or deeply buried.
Network Utility was a good starting point, but it had severe limitations. It only performed TCP connect scans (no SYN, no UDP), offered no service version detection, and had no way to export or analyze results. It scanned sequentially, making even a small port range painfully slow. If you still have access to it, it works for a quick single-port check. For anything more, you need a real tool.
Using nc (netcat) for Single Port Checks
The fastest way to check a specific port on macOS is nc (netcat), which ships with every Mac. Open Terminal and run:
nc -zv 192.168.1.1 80
The flags: -z means scan mode (connect and immediately close, send no data), -v means verbose output. If port 80 is open, you will see:
Connection to 192.168.1.1 port 80 [tcp/http] succeeded!
If the port is closed or unreachable:
nc: connectx to 192.168.1.1 port 80 (tcp) failed: Connection refused
You can scan a range of ports by specifying a start and end:
nc -zv 192.168.1.1 20-100
This will try every port from 20 to 100 and report which ones respond. You can add a timeout to avoid waiting forever on filtered ports:
nc -zv -w 3 192.168.1.1 20-100
The -w 3 flag sets a three-second timeout per port. For UDP scanning, add the -u flag:
nc -zuv 192.168.1.1 53
Netcat is excellent for quick, targeted checks. Need to verify that your web server is listening? One command. Need to test if SSH is reachable after a firewall change? Five seconds. But it falls apart for anything larger. Scanning a full 65,535-port range with netcat is sequential and can take over an hour. There is no parallelism, no service detection, and no structured output. It is a surgical tool, not a scanner.
Using lsof to Check Your Own Open Ports
What if you want to see which ports your own Mac is listening on? That is a different question from scanning a remote host. The answer is lsof:
sudo lsof -i -P -n | grep LISTEN
The flags: -i shows internet connections, -P prevents port number to name resolution (so you see raw numbers), -n prevents DNS lookups (faster output). Combined with grep LISTEN, this shows only ports your Mac is actively listening on.
Example output:
rapportd 426 andrea 4u IPv4 0x1234 0t0 TCP *:49152 (LISTEN)
rapportd 426 andrea 5u IPv6 0x5678 0t0 TCP *:49152 (LISTEN)
cupsd 488 root 5u IPv4 0x9abc 0t0 TCP 127.0.0.1:631 (LISTEN)
httpd 1234 root 4u IPv6 0xdef0 0t0 TCP *:80 (LISTEN)
This tells you that CUPS (printing) is listening on localhost port 631, Apache is listening on port 80 on all interfaces, and rapportd (Apple's Rapport daemon for AirPlay/handoff) is listening on an ephemeral port. Each line shows the process name, PID, user, and the exact port and protocol.
This is invaluable for checking what you are exposing. If you see a process you do not recognize listening on a port, investigate immediately. Use ps aux | grep [PID] to learn more about the process.
macOS Firewall and Port Checking
macOS has a built-in firewall accessible via System Settings > Network > Firewall (or System Preferences > Security & Privacy > Firewall on older versions). However, this firewall is application-based, not port-based. It allows or blocks entire applications from receiving incoming connections, but it does not let you create rules like "block all traffic to port 445."
For port-based filtering, macOS uses pf (Packet Filter), inherited from BSD. You can inspect the current pf rules with:
sudo pfctl -sr
And check if pf is enabled:
sudo pfctl -s info | head -1
By default, pf is active but has minimal rules on a standard macOS installation. If you need to block a specific port, you would edit /etc/pf.conf and add a rule like:
block in on en0 proto tcp from any to any port 445
Then reload with sudo pfctl -f /etc/pf.conf. After applying the rule, you should scan that port from another machine to verify the block is working — which brings us back to why port scanning matters.
The macOS application firewall has a significant limitation for auditing purposes: it cannot tell you what is actually reachable from an external perspective. A port can be "open" on your Mac but blocked by your router's NAT. Or a port might be allowed by the macOS firewall but blocked by a pf rule. The only way to know what is truly reachable is to scan from outside — from another device on the network or from the internet.
Method 2 — nmap via Homebrew (The Power Tool)
If netcat is a stethoscope, nmap is an MRI machine. It is the industry-standard port scanner, maintained since 1997, capable of scanning entire networks with dozens of scan techniques, service version detection, OS fingerprinting, and scriptable vulnerability checks. It is open-source, free, and available on macOS via Homebrew.
Installing nmap on Mac
First, you need Homebrew, the macOS package manager. If you do not have it, install it with:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Then install nmap:
brew install nmap
Verify the installation:
nmap --version
You should see output showing the Nmap version (7.95 or later as of 2026) along with supported libraries.
Essential nmap Scan Types
nmap offers a staggering number of scan modes. Here are the ones you will actually use:
Host discovery — Find all live hosts on a subnet without scanning ports:
nmap -sn 192.168.1.0/24
This sends ARP requests on local networks and ICMP/TCP probes on remote networks. It is the nmap equivalent of scanning your local network.
TCP connect scan — The simplest full port scan (no root required):
nmap -sT 192.168.1.1
This completes the full TCP three-way handshake with each port. It is detectable by the target (connection logs will show your IP), but it works without sudo and is the most reliable scan type.
SYN scan (stealth) — The most popular scan type, requires root:
sudo nmap -sS 192.168.1.1
Also called a "half-open" scan. It sends a SYN packet and analyzes the response: SYN-ACK means open, RST means closed, no response means filtered. It never completes the handshake, so many older logging systems do not record it. On modern systems with decent monitoring, it is just as visible as a connect scan.
Service version detection — Find out what software is running on each open port:
nmap -sV 192.168.1.1
After finding open ports, nmap sends protocol-specific probes and matches the responses against a database of thousands of service signatures. Instead of just "port 22 open," you get "OpenSSH 9.6p1 on Ubuntu."
OS detection — Guess the operating system of the target:
sudo nmap -O 192.168.1.1
Uses TCP/IP stack fingerprinting techniques (TTL analysis, TCP window size, IP options) to identify the target OS.
Comprehensive scan — The "tell me everything" command:
sudo nmap -sS -sV -O -p- 192.168.1.1
This runs a SYN scan on all 65,535 ports, detects service versions, and fingerprints the OS. It is thorough but slow — expect it to take several minutes per host.
Specific ports — Scan only the ports you care about:
nmap -p 22,80,443,445,3389,5900,8080 192.168.1.1
All ports — Scan the entire 0–65535 range:
nmap -p- 192.168.1.1
This is slow but thorough. Services sometimes hide on non-standard ports (a web server on port 8888, SSH on port 2222), and a targeted scan of common ports will miss them.
Reading nmap Output
nmap uses three primary port states:
- open — A service is actively listening and accepting connections on this port. This is what you are looking for (and what attackers look for).
- closed — The port is reachable (the host responds), but no service is listening. The operating system's TCP stack is responding with RST packets.
- filtered — nmap cannot determine whether the port is open because a firewall or packet filter is preventing probes from reaching it. No response at all, or ICMP unreachable messages.
Here is what real output looks like:
$ nmap -sV 192.168.1.1
Starting Nmap 7.95 ( https://nmap.org )
Nmap scan report for router.local (192.168.1.1)
Host is up (0.003s latency).
Not shown: 993 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2 (protocol 2.0)
53/tcp open domain dnsmasq 2.90
80/tcp open http lighttpd 1.4.71
443/tcp open ssl/http lighttpd 1.4.71
445/tcp filtered microsoft-ds
548/tcp closed afp
8080/tcp open http-proxy Squid 5.7
This tells you the router has SSH, DNS, HTTP (both plain and encrypted), and a web proxy running. SMB (port 445) is filtered, meaning the firewall is blocking it — good. AFP is closed, meaning the port is reachable but nothing is listening — expected if Apple File Protocol is disabled. The VERSION column shows the exact software: OpenSSH 9.2, dnsmasq 2.90, lighttpd 1.4.71, Squid 5.7. This information is critical for security because specific versions have specific known vulnerabilities.
When nmap Falls Short
nmap is incredibly powerful, but it has real limitations in daily workflow:
- CLI only: There is no visual overview of your network. You get text output for each host, but no network map, no device-type icons, no at-a-glance security dashboard.
- No continuous monitoring: Each scan is a snapshot. If a new port opens at 3 AM, nmap will not alert you. You would need to write cron jobs, parse XML output, and build your own diffing logic.
- No built-in vulnerability lookup: nmap can detect that a host runs "OpenSSH 8.2," but it will not tell you that version has CVE-2023-38408 (a critical remote code execution vulnerability). nmap's NSE scripting engine can do some of this, but the scripts are complex to configure and maintain.
- No integration with discovery: nmap treats port scanning and host discovery as separate operations. You scan for hosts, then scan each host for ports, then manually correlate results. There is no persistent device database linking MAC addresses, vendor info, OS fingerprints, and port scan history.
- Isolated scans: Each nmap run is independent. There is no built-in history, no diffing between scans ("port 8080 was closed last Tuesday but is open now"), and no alerting on changes.
For a one-time security audit, nmap is unbeatable. For ongoing network monitoring and security management, you need something that builds on its capabilities with persistence, analysis, and automation.
Method 3 — Paranoid Port Scanner (GUI + Intelligence)
Paranoid is a native macOS network scanner that includes nmap-grade port scanning integrated with device discovery, service detection, vulnerability assessment, and continuous monitoring — all in a single app with no Terminal required.
Port Scanning in Paranoid
When you scan your network with Paranoid, port scanning happens as part of the discovery process, not as a separate step. Every discovered host automatically gets its most common ports checked. For deeper analysis, select any host and launch a targeted port scan with configurable ranges:
- Top 100 ports: The most commonly used ports, covering web servers, SSH, databases, file sharing, and remote access. Takes seconds.
- Top 1000 ports: Covers the vast majority of services you will encounter in practice. Takes about a minute per host.
- Full 65535 ports: Every single TCP port. Thorough but time-consuming. Use this when you suspect services hiding on non-standard ports.
- Custom range: Specify exactly which ports to scan. Useful when you are looking for a specific service or testing a specific firewall rule.
Paranoid runs concurrent port probes with configurable limits, similar to nmap's parallel scanning. Results appear in real time as each port responds: port number, state (Open/Closed/Filtered), the recognized service name, and a color-coded risk indicator. The visual presentation means you can spot problems instantly — a column of red High risk indicators jumps out in a way that a wall of Terminal text never does.
Service Version Detection (Banner Grabbing)
Finding that port 22 is "open" is step one. Knowing that it is running "OpenSSH 9.6p1" is step two — and it is the step that actually matters for security. Paranoid uses nmap's own service probe database for banner grabbing and version detection. Here is how it works under the hood:
- Probe selection: For each open port, Paranoid selects the most likely protocol probes, ordered by rarity (most common protocols first). Port 80 gets HTTP probes first. Port 22 gets SSH probes.
- Banner grab: Paranoid sends each probe and captures the response banner — the first bytes the service sends back.
- Regex matching: The response is matched against thousands of regex rules from the nmap service probe database. Each rule can extract the product name, version number, extra info, and CPE (Common Platform Enumeration) identifier.
- Result enrichment: The matched information is linked to the device profile, so you see "OpenSSH 9.6p1" next to the device's hostname, MAC address, vendor, and OS.
For example, when Paranoid probes port 22 on your router, it might receive the banner SSH-2.0-OpenSSH_9.2 and match it to the rule that extracts "OpenSSH" as the product and "9.2" as the version. When it probes port 80, it sends an HTTP GET request and might receive a Server: lighttpd/1.4.71 header, identifying both the product and version. This is the same level of detail you get from nmap -sV, but with a visual interface and persistent storage.
CVE Vulnerability Lookup
This is where Paranoid goes significantly beyond what netcat, Network Utility, or even basic nmap usage can offer. After identifying a service version, Paranoid checks its offline CVE database for known vulnerabilities affecting that exact version. The process is automatic:
- CPE matching: The service's CPE identifier (e.g.,
cpe:/a:openbsd:openssh:8.2) is looked up against the CVE database. - Vulnerability listing: Every matching CVE is displayed with its severity score (CVSS), description, and exploitation risk.
- Weakness scoring: Paranoid calculates an overall security posture score for each host, considering all identified services and their vulnerabilities.
Example: You scan your network and Paranoid finds a NAS device running OpenSSH 8.2 on port 22. The CVE lookup reveals CVE-2023-38408 (CVSS 9.8 Critical — remote code execution via the ssh-agent forwarding feature) and CVE-2023-48795 (CVSS 5.9 Medium — the "Terrapin" prefix truncation attack). Suddenly that innocuous NAS is a serious risk that needs a firmware update.
With netcat, you would know port 22 is open. With nmap, you would know it is OpenSSH 8.2. With Paranoid, you know it is OpenSSH 8.2 and it has two known vulnerabilities, one of them critical. That is the difference between data and actionable intelligence.
Integration with Discovery
One of Paranoid's strongest advantages is that port scanning is not an isolated activity. It is woven into the complete network discovery and monitoring workflow:
- Linked device profiles: Port scan results are attached to each device alongside MAC address, vendor identification, OS fingerprint, device type, and hostname. You see the complete picture in one panel.
- Export everything together: When you export results as CSV, JSON, or HTML reports, all data is included: device identity + open ports + service versions + vulnerabilities. The HTML reports include sortable tables, SVG charts, and a dark/light toggle.
- Historical comparison: Paranoid stores scan sessions and can diff them. If port 8080 was closed last week but is open today, you will see it highlighted as a change. This is critical for detecting unauthorized services, new attack surfaces, or rogue devices opening backdoor ports.
- Continuous monitoring: With background monitoring enabled, Paranoid periodically rescans and alerts you to new open ports or changed services without any manual intervention.
Paranoid combines nmap-grade port scanning with CVE lookup and visual reporting. No Terminal required.
Port Scanning Best Practices
Knowing how to scan is only half the equation. Knowing how to use that information effectively is what separates a script kiddie from a competent network administrator. Here are the practices that matter.
Always Scan Your Own Network First
Before worrying about external threats, understand your own attack surface. Run a full port scan on every device on your local network. You will likely be surprised by what you find: the smart TV with port 5555 open (Android Debug Bridge), the printer with an unauthenticated web interface on port 80, the router with Telnet (port 23) enabled alongside SSH. You cannot secure what you do not know about.
Document Your Baseline
The first scan establishes your baseline — the "normal" state of your network. Write down (or save a scan session) which ports should be open on each device and why. Port 80 on the router: expected, management interface. Port 631 on your Mac: expected, CUPS printing. Port 445 on the NAS: expected, SMB file sharing. Any future deviation from this baseline is a potential security event that warrants investigation.
Close Unnecessary Ports
Every open port is a potential attack vector. If a service is not needed, disable it. On your Mac, you can disable Remote Login (SSH, port 22) in System Settings > General > Sharing. Disable Screen Sharing to close VNC (port 5900). On your router, disable UPnP, remote management, and any services you do not actively use. After disabling a service, scan again to verify the port is actually closed.
Keep Services Updated
When a port scan identifies a service version, check whether that version has known vulnerabilities. An outdated version of OpenSSH, Apache, or any other service can be a serious risk even on an internal network. Firmware updates for routers, NAS devices, and IoT gadgets are frequently overlooked. Set a monthly reminder to check for updates, or use a tool that does it automatically.
Use Firewall Rules to Restrict Access
Some services need to be running but should not be accessible from the entire network. Use firewall rules to limit which IP addresses can reach sensitive ports. For example, your PostgreSQL database should only accept connections from your application server's IP, not from every device on the network. On macOS, use pf rules for port-level filtering rather than the built-in application firewall.
Monitor for Changes Over Time
A single scan is a photograph. Security requires a time-lapse. Schedule regular scans and compare results over time. A port that was closed yesterday but is open today might indicate a new service installation, a configuration change, or malicious activity. Tools like Paranoid automate this with background monitoring and change alerts. If you are using nmap, at minimum save results to XML (nmap -oX output.xml) and write a script to diff successive scans.
macOS-Specific Note: Application Firewall vs pf
Many Mac users assume the built-in firewall toggle in System Settings provides comprehensive protection. It does not. The macOS application firewall is a simple allow/block list for applications that accept incoming connections. It does not filter by port number, does not apply to outgoing connections, and does not block connections to services started by system processes.
For real port-level security on macOS, configure pf rules. This is more complex than flipping a switch, but it is the only way to achieve the same level of control that iptables provides on Linux. Third-party macOS firewalls like Little Snitch or Lulu provide a more user-friendly interface to similar functionality, with the added benefit of outgoing connection filtering.
Troubleshooting Common Port Scan Issues
Port scanning is usually straightforward, but some situations produce confusing results. Here are the problems you are most likely to encounter on macOS and how to resolve them.
"All Ports Show as Filtered"
If every port on a target shows as "filtered," a firewall is blocking your probes before they reach the host's TCP stack. This could be the target's host firewall, a router's built-in firewall, or a dedicated firewall appliance on the network.
To diagnose: try pinging the host (ping 192.168.1.1). If ping works but port scanning shows all filtered, the host is up but actively firewalling port probes. Check if the target has a restrictive firewall configured. If you are scanning your own device from another machine, temporarily disable pf (sudo pfctl -d) and scan again to confirm.
"Permission Denied" When Scanning
Some nmap scan types require root privileges. SYN scans (-sS), OS detection (-O), and UDP scans (-sU) all need raw socket access, which requires sudo. If you see "Permission denied" or nmap falls back to a connect scan when you requested a SYN scan, prefix your command with sudo:
sudo nmap -sS -O 192.168.1.1
For netcat, TCP scans work without sudo. UDP scans (nc -zu) also work without root on macOS, but may produce less accurate results.
"Scan Is Extremely Slow"
Several factors can make port scans crawl. The most common is scanning too many ports on a host with a strict firewall — each filtered port requires a timeout (typically 1–2 seconds) before nmap gives up. Scanning all 65,535 ports on a heavily firewalled host can take 30+ minutes.
Solutions: Reduce the port range to common ports (nmap --top-ports 1000). Increase nmap's speed with timing templates (nmap -T4 for aggressive timing). Reduce the number of retries (--max-retries 1). Use a SYN scan instead of a connect scan, as it is faster because it does not complete the handshake.
"nmap Not Found"
If Terminal says nmap: command not found, either Homebrew is not installed or nmap was not installed via Homebrew. First, check if Homebrew exists:
which brew
If not found, install Homebrew first (see the installation command in the nmap section above). If Homebrew exists but nmap does not, install it:
brew install nmap
On Apple Silicon Macs, Homebrew installs to /opt/homebrew/bin/. Make sure this path is in your shell's $PATH. If you use zsh (the macOS default), add to ~/.zshrc:
eval "$(/opt/homebrew/bin/brew shellenv)"
"Results Differ Between Tools"
If netcat says port 80 is open but nmap says it is filtered (or vice versa), the most likely explanation is different scan techniques. Netcat uses a full TCP connect, while nmap's default (with sudo) is a SYN scan. Some firewalls treat these differently — they might allow completed connections but block half-open SYN probes. Another common cause is timing: the service started or stopped between scans.
To compare apples to apples, force nmap to use the same connect scan that netcat uses:
nmap -sT -p 80 192.168.1.1
If results still differ, check for intermediate firewalls or proxies that might be intercepting traffic differently based on TCP flags.
"macOS Asks to Accept Incoming Connections"
When you run nmap or other scanning tools, macOS may pop up a dialog asking if you want to allow incoming connections. This is the application firewall detecting that nmap is opening network sockets. Click "Allow" — this does not open your Mac to external connections; it simply permits nmap to function. If you clicked "Deny" by mistake, go to System Settings > Network > Firewall > Options and find nmap in the application list.
Port Scanner Comparison Table
Here is a side-by-side comparison of every port scanning method we have covered. This should help you decide which tool to reach for depending on your situation.
| Feature | netcat | Network Utility | nmap | Paranoid |
|---|---|---|---|---|
| TCP Scan | ✓ | ✓ | ✓ | ✓ |
| UDP Scan | ✓ | ✗ | ✓ | ✓ |
| Service Detection | ✗ | ✗ | ✓ | ✓ |
| Version Detection | ✗ | ✗ | ✓ | ✓ |
| CVE Lookup | ✗ | ✗ | ~ | ✓ |
| GUI Interface | ✗ | ✓ | ✗ | ✓ |
| Scan Speed | Slow | Slow | Fast | Fast |
| Continuous Monitoring | ✗ | ✗ | ✗ | ✓ |
| Change Detection | ✗ | ✗ | ✗ | ✓ |
| Export Formats | ✗ | ✗ | XML | CSV/JSON/HTML |
| Device Discovery | ✗ | ✗ | ✓ | ✓ |
| OS Fingerprinting | ✗ | ✗ | ✓ | ✓ |
| No Terminal Required | ✗ | ✓ | ✗ | ✓ |
| Price | Free | Free | Free | €49.90 |
Which tool should you use? It depends on the situation. For a quick "is this port open" check, nc -zv is unbeatable — one command, instant answer. For a deep one-time audit of a specific host, nmap -sV provides the most detailed output with decades of community support. For ongoing network security management where you need port scanning integrated with device detection, vulnerability assessment, visual reporting, and change monitoring, Paranoid wraps everything into a single native macOS app.
Many professionals use all three. Netcat for quick checks during troubleshooting. nmap for scripted, deep audits and penetration testing. Paranoid as the daily driver for visual network awareness and continuous monitoring. They complement each other rather than compete.
A Note on Online Port Scanners
You may have encountered websites that offer to scan your ports from the internet (like "check if port 80 is open on my public IP"). These tools scan your public-facing IP address and can only see ports that are forwarded through your router. They are useful for verifying that your router is not exposing services to the internet, but they tell you nothing about your local network. Every tool discussed in this guide scans locally, which means they test reachability within your network — the attack surface that matters for anyone already connected to your WiFi.
Consider this scenario: an attacker joins your WiFi network (perhaps it has a weak password, or they are on a guest network with insufficient isolation). From their position inside the network, they can reach every locally open port on every device. Your router's NAT provides zero protection against internal attackers. This is why local network security scanning matters at least as much as external port checks.
The Real Goal: Visibility
Port scanning is not about finding problems to panic about. It is about achieving visibility. You cannot make informed security decisions without knowing what is actually running on your network. A port scan transforms your network from an abstract diagram into a concrete inventory of services, software versions, and potential risks. Once you have that inventory, you can make rational choices: close this port, update that service, firewall this device, monitor that server.
The worst security posture is ignorance. You do not know what ports are open. You do not know what software versions are running. You do not know if your firewall rules are working. A single port scan changes all of that. And with the right tools, you can maintain that visibility continuously — not just on the day you remember to check.
Find every open port and vulnerability
Download Paranoid and scan your network's ports with service detection, version identification, and CVE vulnerability lookup — all in one native macOS app.