Port 9300 is the Elasticsearch inter-node transport port – used for cluster communication between Elasticsearch nodes, master election, shard replication, and cross-cluster search. Clients should always use the REST API on port 9200. Port 9300 uses the Elasticsearch binary transport protocol, not HTTP.
Port Number
9300
Protocol
TCP
Service
Elasticsearch Node-to-Node
Range
IANA Registered (1024–49151)
Show transport addresses of all cluster nodes (verify expected IPs)
curl -s http://localhost:9200/_nodes/transport | jq '.nodes[].transport_address'Quick cluster health – if nodes < expected, transport connectivity is broken
curl -s http://localhost:9200/_cluster/health | jq '{status, number_of_nodes, active_shards_percent}'Scan subnet for exposed 9300 ports (should only find cluster peers)
nmap -sV -p 9300 10.0.1.0/24Verify transport TLS is active between nodes (ES 8.0+)
openssl s_client -connect node2:9300 </dev/null 2>&1 | grep 'Verify return code'curl http://localhost:9200/_cluster/state
# Node-to-node comms on 9300 are internal – not for application clients
iptables -A INPUT -p tcp --dport 9300 -s 10.0.0.0/8 -j ACCEPTPort 9300 was chosen alongside 9200 when Elasticsearch was created in 2010. The transport protocol is a binary format optimized for speed and used for all inter-node communication. Before version 7.0, Java clients used the transport client (port 9300) directly; this was deprecated in favor of the REST client (port 9200). Elasticsearch 8.0 (2022) made transport TLS mandatory by default, closing a decade-long security gap.
Why can't I use port 9300 for application clients?
The transport protocol is internal, binary, and version-specific – it changes between minor versions without backward compatibility guarantees. Applications must use the HTTP REST API on port 9200 via the official Elasticsearch client libraries. The old Java TransportClient (which used 9300) was removed in Elasticsearch 8.0.
How do I verify transport TLS is working?
Check elasticsearch.yml: xpack.security.transport.ssl.enabled must be true with valid certificate/key/CA paths. Test: curl -s http://localhost:9200/_nodes?filter_path=**.transport_address,**.transport.publish_address shows the transport addresses. If nodes can communicate, your _cluster/health node_count matches. For explicit TLS check: openssl s_client -connect <peer>:9300.