Port 3000 — Node.js / dev server
TCP registered
What runs on port 3000
The conventional development port for Node.js, Next.js, Rails and Grafana.
No standard assignment; it became a convention because it is easy to type and above the 1024 privileged boundary. Node and Express default to it, as do Rails, Grafana and a long list of others — which is why "port 3000 is already in use" is one of the most common errors in development. It is a development port: in production a reverse proxy holds 443 and forwards here.
Security considerations
A development default, not a production one. Behind a reverse proxy in production.
Checking whether something is listening
# Linux / macOS — what is bound to the port
sudo lsof -i :3000
sudo ss -lntp | grep :3000
# Windows
netstat -ano | findstr :3000
Get-NetTCPConnection -LocalPort 3000
# is it reachable from outside?
nc -zv example.com 3000
curl -v telnet://example.com:3000
Freeing the port
# find the process, then stop it
sudo lsof -ti :3000 | xargs kill # Linux / macOS
netstat -ano | findstr :3000 # note the PID, then:
taskkill /PID <pid> /F # Windows
Should this port be open to the internet?
Usually not. Expose it only if a specific external client needs it, and restrict by source address where you can.
Opening or blocking port 3000
Finding the port is usually the first half of the job. Start narrow — the second rule is there for services that genuinely serve the public, and most do not:
# ufw — Debian, Ubuntu
sudo ufw allow from 10.0.0.0/8 to any port 3000 proto tcp
sudo ufw allow 3000/tcp # only if it genuinely serves the public
# firewalld — RHEL, Fedora, CentOS
sudo firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=10.0.0.0/8 port port=3000 protocol=tcp accept'
sudo firewall-cmd --reload
# iptables, if you are still there
sudo iptables -A INPUT -p tcp --dport 3000 -s 10.0.0.0/8 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 3000 -j DROP
# Windows
New-NetFirewallRule -DisplayName "Node.js / dev server 3000" -Direction Inbound -Protocol TCP -LocalPort 3000 -RemoteAddress 10.0.0.0/8 -Action Allow
10.0.0.0/8 stands in for a private range — substitute your own. Note that a firewall rule does not undo a service bound to 0.0.0.0; it only stops packets reaching it, and a misconfigured or disabled firewall then exposes it immediately.
Quick reference
| Port | 3000 |
| Protocol | TCP |
| Service | Node.js / dev server |
| Range | Registered (1024–49151) — any user process may bind |
Frequently asked questions
What is port 3000 used for?
The conventional development port for Node.js, Next.js, Rails and Grafana.
Is it safe to open port 3000?
A development default, not a production one. Behind a reverse proxy in production.
How do I check if port 3000 is open?
Locally, sudo lsof -i :3000 on macOS or Linux, or netstat -ano | findstr :3000 on Windows. From outside, nc -zv host 3000 tells you whether anything answers.
Why do I get "address already in use" on port 3000?
Another process is bound to it — often a previous run of your own program that did not exit cleanly. Find it with lsof -ti :3000 and stop it, or configure your application to use a different port.
Can I change the port this service uses?
Almost always yes, in the service's configuration. Moving off a default port reduces automated scan noise, but it is obfuscation rather than security — a real attacker scans all 65,535.
Other common ports
- Port 3306 — MySQL / MariaDB
- Port 3389 — RDP
- Port 4200 — Angular dev server
- Port 5000 — Flask / dev server
- Port 5173 — Vite
- Port 5432 — PostgreSQL
- Port 5672 — AMQP / RabbitMQ
- Port 6379 — Redis
- Port 8000 — HTTP alternate
- Port 8080 — HTTP alternate
- Port 8443 — HTTPS alternate
- Port 8883 — MQTT over TLS
- Port 9000 — PHP-FPM / SonarQube / Portainer
- Port 9090 — Prometheus
- Port 9200 — Elasticsearch
- Port 11211 — Memcached
- Port 27017 — MongoDB
- Port 20 — FTP data