By Davy Rogers. Use these techniques only in environments you own or have explicit permission to test.

Loopback Address

The loopback address is a special IP address that refers to the local machine itself. It's used for testing network software, local services, and inter-process communication without involving the actual network hardware. Understanding loopback addresses is essential for development, testing, troubleshooting, and security testing of local services.

What You'll Learn

  • What loopback addresses are and how they work
  • IPv4 and IPv6 loopback ranges
  • Use cases for localhost
  • Loopback in networking and development
  • Security implications and localhost attacks
  • Testing with loopback addresses
  • Common tools using localhost

What Is a Loopback Address?

A loopback address is a special IP address that routes back to the same machine that sent the traffic.

The Analogy:

Regular network call:
You → Phone → Network → Friend's phone → Friend

Loopback:
You → Phone → [loops back] → You
(Talking to yourself, but useful!)

Key Concept:

Traffic sent to loopback:
1. Never leaves your computer
2. Doesn't touch network hardware
3. Stays in software/kernel
4. Returns to the same machine

Perfect for testing!

Loopback Addresses

IPv4 Loopback

Range: 127.0.0.0/8 (127.0.0.0 - 127.255.255.255)

Most common: 127.0.0.1

127.0.0.1 = localhost
127.0.0.2 = also localhost
127.0.0.3 = also localhost
...
127.255.255.254 = also localhost

All 16,777,214 addresses in 127.0.0.0/8 are loopback!

IPv6 Loopback

Address: ::1

Full notation: 0000:0000:0000:0000:0000:0000:0000:0001
Short notation: ::1

Only ONE IPv6 loopback address
(Unlike IPv4's 16 million)

Comparison:

IPv4:
- 127.0.0.0/8 entire range
- 127.0.0.1 most commonly used
- Can use any address in range

IPv6:
- ::1 only
- Single loopback address
- More consistent

Localhost

localhost is the hostname that resolves to loopback addresses.

/etc/hosts File:

Linux/macOS (/etc/hosts):

127.0.0.1       localhost
::1             localhost

Windows (C:\Windows\System32\drivers\etc\hosts):

127.0.0.1       localhost
::1             localhost

DNS Resolution:

# Resolve localhost
ping localhost

# Output (Linux):
PING localhost (127.0.0.1) 56(84) bytes of data.

# Output (Windows):
Pinging localhost [::1] with 32 bytes of data:

How Loopback Works

Network Stack Shortcut:

Normal network path:
Application → TCP/IP stack → Network driver → Network card → Cable → ...

Loopback path:
Application → TCP/IP stack → [loops back] → TCP/IP stack → Application
                              └─ Never reaches hardware

Visual:

┌────────────────────┐
│   Application A    │
│   (Web browser)    │
└──────┬─────────────┘
       │
       │ HTTP request to 127.0.0.1:8080
       ▼
┌──────────────────────────┐
│   TCP/IP Stack           │
│   ┌────────────────┐     │
│   │ Loopback check │     │
│   │ Is dest 127.*? │     │
│   │ Yes → Loop back│     │
│   └────────────────┘     │
└──────┬───────────────────┘
       │
       │ Route back locally
       ▼
┌────────────────────┐
│   Application B    │
│   (Web server)     │
└────────────────────┘

Never touches network card!

Use Cases for Loopback

1. Local Development

Running web servers locally:

# Start web server on localhost
python3 -m http.server 8000
# Server at http://127.0.0.1:8000

# Node.js
node server.js
# Server at http://localhost:3000

# PHP
php -S localhost:8080

Why useful:

  • Test before deploying
  • No internet needed
  • Fast (no network latency)
  • Safe (not exposed to network)

2. Database Connections

Connecting to local databases:

# MySQL
mysql -h 127.0.0.1 -u root -p
mysql -h localhost -u root -p

# PostgreSQL
psql -h localhost -U postgres

# MongoDB
mongo --host 127.0.0.1

# Redis
redis-cli -h 127.0.0.1

3. Service Testing

Testing services without network:

# Test SSH locally
ssh user@localhost

# Test web server
curl http://127.0.0.1

# Test DNS
dig @127.0.0.1 example.com

# Test proxy
curl -x http://127.0.0.1:8080 http://example.com

4. Inter-Process Communication (IPC)

Programs talking to each other:

# Server listens on localhost
import socket
server = socket.socket()
server.bind(('127.0.0.1', 5000))
server.listen()

# Client connects to localhost
client = socket.socket()
client.connect(('127.0.0.1', 5000))

Testing with Loopback

Ping Localhost:

# IPv4
ping 127.0.0.1

# IPv6
ping6 ::1

# Using hostname
ping localhost

Expected output (Linux):

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.032 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.045 ms

Very fast! (microseconds)

Check Listening Services:

# Linux
netstat -tuln | grep 127.0.0.1
ss -tuln | grep 127.0.0.1

# Example output:
tcp   0   0 127.0.0.1:3306    0.0.0.0:*    LISTEN
tcp   0   0 127.0.0.1:6379    0.0.0.0:*    LISTEN

# Windows
netstat -an | findstr 127.0.0.1

Test HTTP Service:

# Start simple server
python3 -m http.server 8080 --bind 127.0.0.1

# Test from another terminal
curl http://127.0.0.1:8080

# Or in browser:
http://localhost:8080

Loopback vs 0.0.0.0

127.0.0.1 (localhost):
- Loopback interface
- Only accessible from same machine
- Secure (not exposed to network)

Example:
Server binds to 127.0.0.1:8080
Only your computer can access it

0.0.0.0 (all interfaces):
- Listens on ALL network interfaces
- Accessible from network
- Less secure (exposed)

Example:
Server binds to 0.0.0.0:8080
Anyone on network can access it

Binding Examples:

# Secure - localhost only
server.bind(('127.0.0.1', 8080))
# Access: http://127.0.0.1:8080 only

# Open to network
server.bind(('0.0.0.0', 8080))
# Access: http://127.0.0.1:8080
#         http://192.168.1.100:8080 (from network)

# Specific interface
server.bind(('192.168.1.100', 8080))
# Access: http://192.168.1.100:8080 only

Security Considerations

1. Localhost-Only Services

Services bound to 127.0.0.1 are generally safe:

# Check what's listening on localhost only
netstat -tuln | grep 127.0.0.1

# Examples:
127.0.0.1:3306    MySQL (not exposed)
127.0.0.1:6379    Redis (not exposed)
127.0.0.1:27017   MongoDB (not exposed)

Good! These are protected.

2. SSRF (Server-Side Request Forgery)

Attackers can abuse localhost:

Vulnerable web app:
User input: http://127.0.0.1:8080/admin
App fetches URL server-side
Bypasses external firewall!
Can access internal services

Example attack:

# Web app has "fetch URL" feature
# Attacker submits:
http://localhost:6379/

# App fetches from its own localhost
# Can now interact with Redis!
# Might be able to execute commands

Defense:

# Whitelist allowed hosts
ALLOWED_HOSTS = ['api.example.com', 'cdn.example.com']

# Block loopback
BLOCKED_HOSTS = ['127.0.0.1', 'localhost', '::1']

if url.host in BLOCKED_HOSTS:
    raise SecurityException("Loopback not allowed")

3. Local Privilege Escalation

Exploiting localhost services:

# Check services running as root on localhost
ps aux | grep root | grep -E "(127.0.0.1|localhost)"

# If exploitable, could gain root access

4. DNS Rebinding

Attack that bypasses localhost restrictions:

1. Attacker controls DNS: evil.com
2. First query: evil.com → 1.2.3.4 (attacker's server)
3. Browser allows connection
4. Second query: evil.com → 127.0.0.1 (rebinding!)
5. Now JavaScript can access localhost
6. Bypasses Same-Origin Policy

Defense:

  • Check Host header
  • Use HTTPS with proper cert validation
  • Implement CORS properly

Localhost in Different Contexts

Web Development:

# Common localhost URLs
http://localhost:3000      # React dev server
http://localhost:8080      # Vue, general dev
http://localhost:4200      # Angular
http://localhost:5000      # Flask default
http://127.0.0.1:8000      # Django, Python http.server

Databases:

MySQL:    127.0.0.1:3306
PostgreSQL: localhost:5432
MongoDB:  127.0.0.1:27017
Redis:    127.0.0.1:6379

Proxies and Tunnels:

# SOCKS proxy
ssh -D 127.0.0.1:1080 user@remote

# HTTP proxy
export http_proxy=http://127.0.0.1:8080

# Port forwarding
ssh -L 127.0.0.1:3000:remotehost:3000 user@jumphost

Loopback Interface (lo)

The loopback interface is a virtual network interface.

View Loopback Interface:

# Linux
ip addr show lo

# Output:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
# Windows
ipconfig

# Output:
Ethernet adapter Loopback Pseudo-Interface 1:
   IPv6 Address. . . : ::1
   IPv4 Address. . . : 127.0.0.1

Loopback MTU:

# Usually 65536 bytes
# Much larger than Ethernet (1500)
# No physical limitations!

ip link show lo | grep mtu
# mtu 65536

Tools Using Localhost

netcat:

# Server
nc -l 127.0.0.1 4444

# Client
nc 127.0.0.1 4444
echo "Hello" | nc localhost 4444

curl:

# Test local web server
curl http://127.0.0.1:8080
curl http://localhost:3000

# With headers
curl -I http://127.0.0.1

telnet:

# Test if port is open
telnet localhost 80
telnet 127.0.0.1 22

nmap:

# Scan localhost
nmap 127.0.0.1
nmap localhost

# Full scan
nmap -p- 127.0.0.1

Try It Yourself

Exercise 1: Ping Loopback

# IPv4
ping 127.0.0.1

# Try other addresses in range
ping 127.0.0.2
ping 127.100.50.25

# IPv6
ping6 ::1

# All should work!

Exercise 2: Start a Server

# Terminal 1: Start server
python3 -m http.server 8888 --bind 127.0.0.1

# Terminal 2: Test connection
curl http://127.0.0.1:8888
curl http://localhost:8888

# Browser:
http://127.0.0.1:8888

# Try from another computer - should fail!
# (Unless you expose it)

Exercise 3: Check Listening Services

# What's listening on localhost?
# Linux:
ss -tuln | grep 127.0.0.1
netstat -tuln | grep 127.0.0.1

# Windows:
netstat -an | findstr 127.0.0.1

# Identify each service
# Should they be localhost-only?

Exercise 4: Port Forwarding

# Forward remote MySQL to localhost
ssh -L 127.0.0.1:3306:localhost:3306 user@remote-server

# Now connect as if MySQL is local
mysql -h 127.0.0.1 -u root -p

# Traffic encrypted through SSH!

Localhost Troubleshooting

Can't Connect to localhost:

# 1. Check if service is running
ps aux | grep [service_name]

# 2. Check if port is listening
netstat -tuln | grep [port]

# 3. Check firewall
# Linux:
sudo iptables -L -n | grep 127.0.0.1
# Windows:
netsh advfirewall show allprofiles

# 4. Check /etc/hosts
cat /etc/hosts | grep localhost

# 5. Try explicit IP
curl http://127.0.0.1:[port]

"Connection Refused":

Causes:
1. Service not running
2. Service crashed
3. Bound to wrong interface (e.g., 0.0.0.0 instead of 127.0.0.1)
4. Firewall blocking (rare for localhost)

Fix:
Check service status and logs

Quick Reference

# Loopback addresses
127.0.0.1           # IPv4 loopback (most common)
127.0.0.0/8         # Full IPv4 loopback range
::1                 # IPv6 loopback
localhost           # Hostname for loopback

# Test connectivity
ping 127.0.0.1
ping6 ::1
curl http://localhost

# Check listening services
netstat -tuln | grep 127.0.0.1    # Linux
ss -tuln | grep 127.0.0.1         # Linux (modern)
netstat -an | findstr 127.0.0.1   # Windows

# View loopback interface
ip addr show lo      # Linux
ifconfig lo          # Linux/macOS
ipconfig             # Windows

# Start local server
python3 -m http.server 8000 --bind 127.0.0.1

Comparison Table

Aspect            127.0.0.1       0.0.0.0         192.168.x.x
────────────────────────────────────────────────────────────────
Access            Local only      All interfaces  Network
Security          High            Low             Medium
Use case          Development     Production      Internal
Network traffic   No              Yes             Yes
Firewall needed   Usually no      Yes             Yes

Resources

Tools:

  • netcat: Test localhost connections
  • curl: HTTP requests to localhost
  • nmap: Scan localhost ports
  • telnet: Test port connectivity

Reading:

Practice:

  • Run web servers locally
  • Connect to local databases
  • Use SSH port forwarding to localhost
  • Understand SSRF vulnerabilities

Next Steps

  1. Practice local development with localhost
  2. Understand binding (127.0.0.1 vs 0.0.0.0)
  3. Learn SSH tunneling for secure access
  4. Study SSRF attacks and defenses
  5. Use localhost for safe testing

Localhost is your safe testing ground—master it for development, debugging, and security testing!


"127.0.0.1: There's no place like home."