Toolman 100% local

Port 389 — LDAP

TCP well-known

What runs on port 389

Directory services — user and group lookups, including Active Directory.

LDAP is the directory lookup protocol behind Active Directory and most enterprise single sign-on. A bind operation sends a username and password, and on port 389 without StartTLS it sends them in clear text — which is why an LDAP misconfiguration leaks credentials for the entire organisation rather than one account. 636 is the implicit-TLS equivalent. Modern Windows domain controllers reject unsigned simple binds by default for exactly this reason.

Security considerations

Unencrypted. Use LDAPS on 636 or StartTLS, otherwise credentials are readable on the wire.

Checking whether something is listening

# Linux / macOS — what is bound to the port
sudo lsof -i :389
sudo ss -lntp | grep :389

# Windows
netstat -ano | findstr :389
Get-NetTCPConnection -LocalPort 389

# is it reachable from outside?
nc -zv example.com 389
curl -v telnet://example.com:389

Freeing the port

# find the process, then stop it
sudo lsof -ti :389 | xargs kill        # Linux / macOS
netstat -ano | findstr :389            # 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 389

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 389 proto tcp
sudo ufw allow 389/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=389 protocol=tcp accept'
sudo firewall-cmd --reload

# iptables, if you are still there
sudo iptables -A INPUT -p tcp --dport 389 -s 10.0.0.0/8 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 389 -j DROP

# Windows
New-NetFirewallRule -DisplayName "LDAP 389" -Direction Inbound -Protocol TCP -LocalPort 389 -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

Port389
ProtocolTCP
ServiceLDAP
RangeWell-known (0–1023) — binding requires root on Unix

Frequently asked questions

What is port 389 used for?

Directory services — user and group lookups, including Active Directory.

Is it safe to open port 389?

Unencrypted. Use LDAPS on 636 or StartTLS, otherwise credentials are readable on the wire.

How do I check if port 389 is open?

Locally, sudo lsof -i :389 on macOS or Linux, or netstat -ano | findstr :389 on Windows. From outside, nc -zv host 389 tells you whether anything answers.

Why do I get "address already in use" on port 389?

Another process is bound to it — often a previous run of your own program that did not exit cleanly. Find it with lsof -ti :389 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

All port numbers