When you run netstat on Linux/Unix systems, you might encounter entries like:
[::]:ssh [::]:* LISTEN
The [::] notation represents the IPv6 wildcard address (equivalent to 0.0.0.0 in IPv4). It indicates that the service is listening on all available IPv6 interfaces.
In IPv6:
::is the compressed form of0000:0000:0000:0000:0000:0000:0000:0000- When enclosed in brackets
[::], it represents the wildcard address - The colon after the brackets (
[::]:) separates the address from the port number
Here's how to check listening ports with netstat:
netstat -tulnp | grep '\['
Sample output showing IPv6 listening sockets:
tcp6 0 0 [::]:http [::]:* LISTEN 1234/nginx
tcp6 0 0 [::]:ssh [::]:* LISTEN 5678/sshd
When writing network applications, you might need to handle IPv6 wildcard addresses. Here's a Python example:
import socket
# Create IPv6 TCP socket
s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
# Bind to all IPv6 interfaces
s.bind(('::', 8080))
print("Listening on [::]:8080")
You'll typically see [::] in these cases:
- Services configured to listen on all interfaces (IPv4 and IPv6)
- When IPv6 is enabled but no specific address is bound
- In dual-stack implementations where IPv6 is preferred
If you need to verify IPv6 connectivity:
# Check IPv6 routes
ip -6 route
# Test connectivity
ping6 ::1
# Check firewall rules for IPv6
ip6tables -L
Binding to [::] means your service is accessible from:
- All network interfaces
- Both IPv4 and IPv6 (via IPv4-mapped addresses)
- Consider restricting binding to specific interfaces when possible
When examining netstat output, you'll often encounter [::] as part of socket information. This notation represents IPv6's wildcard address, equivalent to 0.0.0.0 in IPv4. It indicates the service is listening on all available IPv6 interfaces.
Consider this output line:
[::]:ssh [::]:* LISTEN
Here's what each component means:
[::]:ssh- The service is listening on port 22 (SSH) across all IPv6 interfaces[::]:*- Accepting connections from any remote IPv6 addressLISTEN- Current socket state
When programming network applications, understanding these notations is crucial:
// Python example checking listening ports
import socket
def check_ipv6_listening():
for port in [22, 80, 443]:
sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
result = sock.connect_ex(('::1', port))
if result == 0:
print(f"Port {port} is listening on IPv6")
sock.close()
Here's how equivalent configurations appear:
| Address Type | Wildcard Notation | Example |
|---|---|---|
| IPv4 | 0.0.0.0 | 0.0.0.0:80 |
| IPv6 | :: | [::]:80 |
The brackets around :: are necessary because the colon is also used for port separation. In configuration files, you might see variations:
# Apache configuration example Listen [::]:80 Listen 0.0.0.0:80
When debugging, combine netstat with other tools for complete information:
$ netstat -tulnp | grep '$$::$$' $ ss -tulnp | grep -i ssh $ lsof -i -P -n | grep LISTEN