Intro
Redis is widely used for caching, session storage, and message brokering, but network connectivity issues can cripple applications that depend on it. Symptoms may include timeouts, refused connections, or intermittent failures. This guide provides a practical, step-by-step approach to diagnosing and resolving Redis networking problems. We cover essential tools and commands, from verifying DNS resolution to testing TCP connectivity and checking firewall rules. By the end, you will have a repeatable troubleshooting process and a checklist for ongoing operations. Whether you are a developer, DevOps consultant, or part of a startup team, mastering these techniques will help you quickly restore service and prevent future issues.
Version and Environment Inventory
Before troubleshooting, gather information about your Redis setup. This inventory helps identify potential compatibility issues and narrow down the problem area. Record the following details:
- Redis server version:
redis-server --versionorredis-cli info server | grep redis_version - Redis client library and version (if applicable)
- Operating system and kernel version on both server and client
- Network topology: Are Redis server and client on the same host, same LAN, or across the internet? Are there load balancers, NAT, or virtual networks involved?
- Redis configuration file location and relevant settings:
bind,port,protected-mode,requirepass,tls-*options. - DNS setup: Is the client using a hostname or IP address? Are there custom DNS entries?
Create a table summarizing this information for reference:
| Component | Details | Version/Value |
|---|---|---|
| Redis server | Version, OS, IP/hostname | e.g., 7.2.4, Ubuntu 22.04, 192.168.1.10 |
| Client | Application environment, library | e.g., Node.js 20, redis 4.6.10 |
| Network | Topology, firewalls, NAT | e.g., same VPC, security group allowing 6379 |
| Configuration | Key settings | bind, protected-mode, requirepass |
This inventory is crucial because many Redis networking issues stem from misconfiguration or environment changes. For example, Redis by default binds to 127.0.0.1, which only allows local connections. If your client runs on a different machine, you will need to update the bind directive.
Safe Configuration Path
When making changes to Redis networking settings, proceed carefully to avoid disrupting production traffic. Follow these best practices:
- Back up the current configuration file before editing:
cp /etc/redis/redis.conf /etc/redis/redis.conf.bak - Make changes incrementally and test each one. Avoid changing multiple parameters at once.
- Use a staging environment if possible to replicate the production setup and test changes.
- Apply changes with a configuration management tool if available, or restart Redis gracefully after changes.
Key Redis Network Configuration Options
- bind: Specifies which network interfaces Redis listens on. For connections from remote hosts, set to the server IP or
0.0.0.0for all interfaces, but use with caution and enable authentication/firewall. - port: Default is 6379. Change if needed, but ensure clients use the correct port.
- protected-mode: When enabled (default) and no password is set, Redis only accepts connections from loopback. For remote access, either set a password or set
protected-mode no(not recommended without other security measures). - requirepass: Sets a password for client authentication. Always set this for remote access.
- tls-port, tls-cert-file, etc.: Enable TLS for encrypted connections.
Example: Enabling Remote Connections with Password
Suppose you need to allow connections from a remote application server (IP 192.168.1.20) to your Redis server (192.168.1.10). Follow these steps:
- Edit
redis.conf:
bind 192.168.1.10
protected-mode yes
requirepass yourstrongpassword
- Restart Redis:
sudo systemctl restart redis-serverorsudo service redis-server restart
- Verify Redis is listening:
sudo netstat -tlnp | grep redisshould show:
tcp 0 0 192.168.1.10:6379 0.0.0.0:* LISTEN 1234/redis-server
On the client side, connect using:
redis-cli -h 192.168.1.10 -p 6379 -a yourstrongpassword ping
Expected output: PONG
Important: Using -a on the command line exposes the password in process lists. Consider using the REDISCLI_AUTH environment variable or providing the password interactively.
Verification and Diagnostics
Once your configuration is in place, use the following diagnostic steps to verify connectivity and identify issues.
1. Basic Connectivity: ping and telnet
- Use
pingto test network reachability (ICMP may be blocked, so this is not always conclusive):
ping 192.168.1.10
- Use
telnetorncto test TCP connection to the Redis port:
telnet 192.168.1.10 6379
If successful, you will see something like:
Trying 192.168.1.10...
Connected to 192.168.1.10.
Escape character is '^]'.
Then type PING and press Enter. Redis should respond with +PONG. If you see -NOAUTH Authentication required., authentication is needed. Type AUTH yourpassword before PING.
2. Using redis-cli
redis-cli is the standard Redis command-line client. Use it to test connection and authentication:
redis-cli -h 192.168.1.10 -p 6379 -a yourstrongpassword ping
Expected: PONG
If you get Could not connect to Redis at 192.168.1.10:6379: Connection refused, the server is not reachable or not listening on that interface/port. Check the server's bind and firewall.
3. DNS Resolution
If you are using a hostname instead of an IP address, verify DNS resolution from the client machine:
nslookup myredis.example.com
or
dig myredis.example.com
Ensure the resolved IP is correct and reachable. Redis does not perform DNS lookups when binding; it uses the IP literal in bind. So if you set bind to a hostname, Redis resolves it once at startup. It's better to use an IP address to avoid reliance on DNS during startup.
4. Firewall Rules
Firewalls (iptables, firewalld, cloud security groups) can block port 6379. Check rules on the server and any intermediate devices:
- On Linux with iptables:
sudo iptables -L -n | grep 6379
Look for an ACCEPT rule for port 6379. If missing, add a rule (but understand your firewall management):
sudo iptables -A INPUT -p tcp --dport 6379 -j ACCEPT
However, for permanent changes, use your distribution's firewall tool (e.g., firewalld, ufw).
- Cloud environments: Check security group or network ACL to ensure inbound TCP 6379 is allowed from the client's IP range.
5. Routing and Network Issues
Use traceroute to see the path and identify where packets may be dropped:
traceroute 192.168.1.10
If the route does not complete, there is a network infrastructure issue (e.g., missing route, VPN down).
6. Redis Logs
Redis logs can provide clues. Check the log file (typically /var/log/redis/redis-server.log):
tail -f /var/log/redis/redis-server.log
Look for messages about connection refused, bind errors, or authentication failures.
7. Performance and Connection Limits
Sometimes connectivity issues are due to resource exhaustion. Check client connection count:
redis-cli info clients
Look for connected_clients and maxclients. If at max, increase maxclients in config and restart.
Failure Modes and Recovery
Understanding common failure modes helps you quickly recover and implement rollback plans.
Common Failure Modes
- Connection refused: Server not running or listening on the wrong interface/port. Recovery: Start Redis or correct
bind/port. - Connection timeout: Typically firewall or network routing issue. Recovery: Check firewall, security groups, and routing.
- Authentication required error: Client did not supply password or wrong password. Recovery: Provide correct password; reset password if forgotten (restart with
--requirepasstemporarily). - DNS resolution failure: Hostname does not resolve. Recovery: Use IP address or fix DNS records.
- TLS handshake failure: Mismatched certificates or client not configured for TLS. Recovery: Verify certificates and client TLS settings.
- Performance degradation: High latency or packet loss. Recovery: Investigate network quality, Redis slowlog, and client timeouts.
Rollback and Recovery Steps
When a configuration change causes issues, revert to the backup configuration:
sudo cp /etc/redis/redis.conf.bak /etc/redis/redis.conf
sudo systemctl restart redis-server
After rollback, verify connectivity again using the diagnostic steps above. If the issue persists, check other factors like client code changes or network changes.
Example Scenario: After enabling remote access, clients cannot connect
You changed bind to 0.0.0.0 and restarted Redis. Now no clients can connect. Investigate:
- Check if Redis is listening:
ss -tlnp | grep 6379should show*:6379or0.0.0.0:6379. - Check firewall: If you have a local firewall, it may still block the port. Add an allow rule.
- Check
protected-mode: If you setprotected-mode yesbut no password, Redis will deny external connections. Either set a password or disable protected mode (not recommended). - Rollback: Restore the original config and restart.
Common Pitfalls and How to Avoid Them
Beyond the failure modes above, here are frequent mistakes that lead to Redis networking issues, with explanations and preventive measures:
- Binding to 127.0.0.1 by default: New installations often leave the default bind address, causing remote clients to fail with "Connection refused". Always review the
binddirective inredis.confand set it to the appropriate interface IP or0.0.0.0(with security in place).
- Ignoring
protected-mode: Whenprotected-modeis enabled and no password is set, Redis rejects external connections even ifbind 0.0.0.0is set. Understand that protected mode is a safety feature; either setrequirepassor disable protected mode only in trusted networks.
- Using hostnames in
bind: As noted, Redis resolves the hostname only at startup. If DNS changes or the service restarts when DNS is unavailable, Redis may fail to start or bind incorrectly. Use IP addresses to avoid this fragility.
- Firewall misconfiguration: Many cloud deployments have both OS-level firewalls and security group rules. Forgetting to open the port in either layer results in timeouts. Always check both and test from an external host.
- Not setting a password: Exposing Redis without authentication to the internet can lead to data theft or loss. Even on internal networks, setting a strong password is a basic security practice. Use
requirepassand considerACLfor granular permissions.
- Overlooking client-side timeouts: Application connection pools may have shorter timeouts than Redis's own settings, causing apparent disconnects. Review client library configuration (e.g.,
connectTimeout,commandTimeout) and adjust to match network latency and Redis response times.
Operations Checklist
Use this checklist for regular maintenance and when troubleshooting. For each item, assign a responsible person and review frequency.
| Checklist Item | Command/Action | Responsible | Review Frequency |
|---|---|---|---|
| Verify Redis service is running | systemctl status redis-server | Sysadmin (e.g., Jane Doe) | Daily automated check, manual weekly |
| Check listening interfaces and port | ss -tlnp | grep redis | Sysadmin | Weekly |
| Test local connectivity | redis-cli ping (expect PONG) | Application developer | Every deployment |
| Test remote connectivity from application host | redis-cli -h <host> -p <port> -a <pass> ping | Application developer | Every deployment |
| Review Redis log for errors | tail -n 100 /var/log/redis/redis-server.log | Sysadmin | Daily |
| Monitor connection count | redis-cli info clients | grep connected_clients | Monitoring team | Continuous via metrics, alert if >80% of maxclients |
| Check firewall rules for port 6379 | sudo iptables -L -n | grep 6379 and cloud security group | Network admin | Monthly or after any network change |
| Validate DNS resolution if using hostnames | nslookup <hostname> | Network admin | Monthly or after DNS changes |
| Ensure TLS certificates are valid and not expired | openssl x509 -enddate -noout -in /path/to/cert.pem | Security engineer | Quarterly or before expiry (e.g., 30 days ahead) |
| Review application connection pool settings | Check max connections, timeouts in app config | Application developer | Monthly or during performance reviews |
| Document any changes made and update configuration backup | Update runbook and config backup in version control | Sysadmin | After every change |
Conclusion
Redis networking troubleshooting requires a systematic approach. By maintaining an accurate inventory of your environment, making safe configuration changes, and using the diagnostic commands outlined here, you can quickly identify and resolve connectivity issues. The provided operations checklist helps prevent problems and ensures your Redis deployment remains healthy. Start with a narrow, measurable pilot when diagnosing issues, as early isolation simplifies the process. Remember to implement security measures like authentication and TLS when exposing Redis beyond localhost. With these practices, you can keep your Redis-backed applications running smoothly.