Essential Debugging Techniques for Network and Service Connectivity
Saniyat Hossain
Posted on June 20, 2024
In the fast-paced world of software development, effective debugging is crucial for ensuring smooth operations and quick resolutions to issues. This article provides practical examples and tips for using essential tools like curl
, telnet
, and tcpdump
, along with connectivity checks for services such as Redis, MySQL, RabbitMQ, Minio, and more. We'll also cover additional tricks for extensive debugging and discuss tools like NGINX and HAProxy.
Tools and Techniques Overview
Curl: The Versatile HTTP Client
curl
is a powerful command-line tool for transferring data with URLs. It supports various protocols and provides extensive options for debugging.
Basic Usage:
curl -I http://example.com
Verbose Mode with SSL Verification and Proxy:
curl -kvvv --proxy http://proxy.example.com:8080 https://example.com
Example Response:
* Rebuilt URL to: https://example.com/
* Trying 93.184.216.34...
* TCP_NODELAY set
* Connected to example.com (93.184.216.34) port 443 (#0)
> GET / HTTP/1.1
> Host: example.com
> User-Agent: curl/7.68.0
> Accept: */*
< HTTP/1.1 200 OK
...
* Connection #0 to host example.com left intact
Tips and Tricks:
- Check Headers and Content:
curl -i http://example.com
- Follow Redirects:
curl -L http://example.com
- Download File:
curl -O http://example.com/file.zip
- Send Data with POST:
curl -d "param1=value1¶m2=value2" -X POST http://example.com/submit
- Use with Authentication:
curl -u username:password http://example.com
- Custom Headers:
curl -H "Custom-Header: value" http://example.com
- Debugging DNS:
curl --dns-servers 8.8.8.8 http://example.com
- Output to File:
curl http://example.com -o output.txt
- Testing APIs:
curl -X POST -H "Content-Type: application/json" -d '{"key1":"value1", "key2":"value2"}' http://api.example.com/endpoint
Telnet: Simple Connectivity Testing
telnet
is useful for testing connectivity to remote hosts and services.
Basic Usage:
telnet example.com 80
Example Response:
Trying 93.184.216.34...
Connected to example.com.
Escape character is '^]'.
Tips and Tricks:
- Check SMTP Server:
telnet smtp.example.com 25
- Test HTTP Service:
telnet example.com 80
GET / HTTP/1.1
Host: example.com
- Escape Character:
telnet example.com 80
(Ctrl + ])
quit
Tcpdump: Network Packet Analyzer
tcpdump
captures network packets for detailed analysis.
Basic Usage:
sudo tcpdump -i eth0
Capture Specific Traffic:
sudo tcpdump -i eth0 'tcp port 80'
Tips and Tricks:
- Save to File:
sudo tcpdump -i eth0 -w capture.pcap
- Read from File:
sudo tcpdump -r capture.pcap
- Filter by Host:
sudo tcpdump -i eth0 host example.com
- Filter by Port:
sudo tcpdump -i eth0 port 443
- Analyze HTTP Traffic:
sudo tcpdump -i eth0 -A -s 0 'tcp port 80'
- Limit Packet Capture:
sudo tcpdump -c 100 -i eth0
Ping: Network Latency Checker
Basic Usage:
ping example.com
Example Response:
PING example.com (93.184.216.34) 56(84) bytes of data.
64 bytes from example.com (93.184.216.34): icmp_seq=1 ttl=54 time=6.67 ms
64 bytes from example.com (93.184.216.34): icmp_seq=2 ttl=54 time=6.73 ms
...
SFTP: Secure File Transfer Protocol
Basic Usage:
sftp user@example.com
Example Response:
Connected to example.com.
sftp>
Wireshark: Network Protocol Analyzer
Wireshark is a GUI tool for capturing and analyzing network traffic.
Basic Usage:
- Open Wireshark.
- Select the network interface to capture traffic.
- Use filters (e.g.,
http
,tcp.port == 80
) to refine the capture.
Elasticsearch and Kibana: Search and Analytics Engine
Elasticsearch Basic Usage:
curl -X GET "localhost:9200"
Example Response:
{
"name" : "node-1",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "XYZ123",
...
}
Kibana Basic Usage:
Open a web browser and navigate to http://localhost:5601
.
Jenkins: Continuous Integration and Delivery
Basic Usage:
Navigate to Jenkins web interface at http://localhost:8080
.
Service Connectivity and Authentication Checks
Docker Container Setup
Dockerfile Example
# Use a slim base image
FROM debian:slim-buster
# Install necessary packages
RUN apt-get update && apt-get install -y \
curl \
telnet \
tcpdump \
mysql-client \
redis-tools \
rabbitmq-server \
mc \
td-agent \
postgresql-client \
--no-install-recommends && \
rm -rf /var/lib/apt/lists/*
CMD ["bash"]
Connectivity Checks
Redis
Installation:
Inside Docker Container:
RUN apt-get update && apt-get install -y redis-tools
Host Machines (Ubuntu, Windows, CentOS/RedHat, Kali Linux):
sudo apt-get update && sudo apt-get install -y redis-tools
Check Connection:
redis-cli -h redis.example.com -p 6379 ping
Possible Response:
PONG
Tips and Tricks:
- Check Connection:
redis-cli -h redis.example.com -p 6379 ping
- Test with Password:
redis-cli -h redis.example.com -p 6379 -a password ping
MySQL
Installation:
Inside Docker Container:
RUN apt-get update && apt-get install -y mysql-client
Host Machines (Ubuntu, Windows, CentOS/RedHat, Kali Linux):
sudo apt-get update && sudo apt-get install -y mysql-client
Check Connection:
mysql -h mysql.example.com -P 3306 -u username -p
Possible Response:
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.33 MySQL Community Server (GPL)
...
Tips and Tricks:
- Check Connection:
mysql -h mysql.example.com -P 3306 -u username -p
- Test with Database:
mysql -h mysql.example.com -P 3306 -u username -p database_name
RabbitMQ
Installation:
Inside Docker Container:
RUN apt-get update && apt-get install -y rabbitmq-server
Host Machines (Ubuntu, Windows, CentOS/RedHat, Kali Linux):
sudo apt-get update && sudo apt-get install -y rabbitmq-server
Check Connection:
curl -kvvv -u guest:guest http://rabbitmq.example.com:15672/api/overview
Possible Response:
* Trying rabbitmq.example.com...
* TCP_NODELAY set
* Connected to rabbitmq.example.com (93.184.216.34) port 15672 (#0)
> GET /api/overview HTTP/1.1
> Host: rabbitmq.example.com
> Authorization: Basic Z3Vlc3Q6Z3Vlc3Q=
> User-Agent: curl/
7.68.0
> Accept: */*
< HTTP/1.1 200 OK
...
Tips and Tricks:
- Check Connection:
curl -kvvv -u guest:guest http://rabbitmq.example.com:15672/api/overview
- Check Queues:
curl -kvvv -u guest:guest http://rabbitmq.example.com:15672/api/queues
Minio
Installation:
Inside Docker Container:
RUN apt-get update && apt-get install -y mc
Host Machines (Ubuntu, Windows, CentOS/RedHat, Kali Linux):
sudo apt-get update && sudo apt-get install -y mc
Check Connection:
curl -kvvv http://minio.example.com:9000
Possible Response:
* Trying minio.example.com...
* TCP_NODELAY set
* Connected to minio.example.com (93.184.216.34) port 9000 (#0)
> GET / HTTP/1.1
> Host: minio.example.com
> User-Agent: curl/7.68.0
> Accept: */*
< HTTP/1.1 200 OK
...
Tips and Tricks:
- Check Connection:
curl -kvvv http://minio.example.com:9000
- List Buckets:
curl -kvvv http://minio.example.com:9000/minio/health/ready
Fluentd/TD-Agent: Log Management
Installation:
Inside Docker Container:
RUN apt-get update && apt-get install -y td-agent
Host Machines (Ubuntu, Windows, CentOS/RedHat, Kali Linux):
curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-bionic-td-agent3.sh | sh
Check Connection:
curl -kvvv http://fluentd.example.com:24224
Possible Response:
* Trying fluentd.example.com...
* TCP_NODELAY set
* Connected to fluentd.example.com (93.184.216.34) port 24224 (#0)
> GET / HTTP/1.1
> Host: fluentd.example.com
> User-Agent: curl/7.68.0
> Accept: */*
< HTTP/1.1 200 OK
...
Tips and Tricks:
- Check Connection:
curl -kvvv http://fluentd.example.com:24224
- Check Logs:
tail -f /var/log/td-agent/td-agent.log
Kafka: Distributed Streaming Platform
Installation:
Inside Docker Container:
RUN apt-get update && apt-get install -y kafka
Host Machines (Ubuntu, Windows, CentOS/RedHat, Kali Linux):
sudo apt-get update && sudo apt-get install -y kafka
Check Connection:
kafka-console-consumer.sh --bootstrap-server kafka.example.com:9092 --topic test --from-beginning
Possible Response:
...
Message 1
Message 2
...
Tips and Tricks:
- Check Connection:
kafka-console-consumer.sh --bootstrap-server kafka.example.com:9092 --topic test --from-beginning
- Check Topics:
kafka-topics.sh --list --bootstrap-server kafka.example.com:9092
PostgreSQL
Installation:
Inside Docker Container:
RUN apt-get update && apt-get install -y postgresql-client
Host Machines (Ubuntu, Windows, CentOS/RedHat, Kali Linux):
sudo apt-get update && sudo apt-get install -y postgresql-client
Check Connection:
psql -h postgres.example.com -p 5432 -U username -d database_name
Possible Response:
Password for user username:
psql (13.3 (Ubuntu 13.3-1.pgdg20.04+1))
Type "help" for help.
database_name=>
Tips and Tricks:
- Check Connection:
psql -h postgres.example.com -p 5432 -U username -d database_name
- List Databases:
psql -h postgres.example.com -p 5432 -U username -c "\l"
NGINX: Web Server Debugging
Configuration Testing:
nginx -t
Reload Configuration:
sudo systemctl reload nginx
Log Files:
Access Log:
tail -f /var/log/nginx/access.log
Error Log:
tail -f /var/log/nginx/error.log
Debugging Tips:
- Check Server Status:
curl -I http://localhost
- Verify Configuration Syntax:
nginx -t
- Test Specific Configuration File:
nginx -c /etc/nginx/nginx.conf
- Check Connection Limit:
curl -I --limit-rate 1k http://localhost
- Analyze Request Headers:
curl -I http://localhost -H "Host: example.com"
HAProxy: Load Balancer Debugging
Configuration Testing:
haproxy -c -f /etc/haproxy/haproxy.cfg
Reload Configuration:
sudo systemctl reload haproxy
Log Files:
Access Log:
tail -f /var/log/haproxy.log
Debugging Tips:
- Check Frontend Status:
curl -I http://haproxy.example.com
- Verify Configuration Syntax:
haproxy -c -f /etc/haproxy/haproxy.cfg
- View Statistics:
curl http://haproxy.example.com/stats
- Check Backend Health:
curl http://haproxy.example.com:8080/health
- Analyze Headers:
curl -I http://haproxy.example.com -H "X-Forwarded-For: 1.2.3.4"
Wireshark: Network Protocol Analyzer
Wireshark is a GUI tool for capturing and analyzing network traffic.
Basic Usage:
- Open Wireshark.
- Select the network interface to capture traffic.
- Use filters (e.g.,
http
,tcp.port == 80
) to refine the capture.
Elasticsearch and Kibana: Search and Analytics Engine
Elasticsearch Basic Usage:
curl -X GET "localhost:9200"
Example Response:
{
"name" : "node-1",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "XYZ123",
...
}
Kibana Basic Usage:
Open a web browser and navigate to http://localhost:5601
.
Jenkins: Continuous Integration and Delivery
Basic Usage:
Navigate to Jenkins web interface at http://localhost:8080
.
Summary Table
Here's the summarized table of tools and connectivity checks with proper formatting:
Tool / Service | Usage | Example Command / Response | Tips and Tricks |
---|---|---|---|
Curl | HTTP Client | curl -I http://example.com |
Check headers, follow redirects, send data with POST, use with authentication, custom headers, debugging DNS |
Telnet | Simple Connectivity Testing | telnet example.com 80 |
Check SMTP server, test HTTP service, escape character |
Tcpdump | Network Packet Analyzer | sudo tcpdump -i eth0 |
Save to file, read from file, filter by host and port, analyze HTTP traffic |
Ping | Network Latency Checker | ping example.com |
Basic usage, measure latency |
SFTP | Secure File Transfer Protocol | sftp user@example.com |
Basic usage, file transfers |
Wireshark | Network Protocol Analyzer | GUI-based tool | Capture network traffic, use filters, analyze protocols |
Elasticsearch | Search and Analytics Engine | curl -X GET "localhost:9200" |
Check cluster status, use Kibana for visual analytics |
Jenkins | Continuous Integration and Delivery | Navigate to Jenkins web interface at http://localhost:8080
|
Automate builds and deployments, integrate with various tools |
Redis | Key-Value Store | redis-cli -h redis.example.com -p 6379 ping |
Check connection, test with password |
MySQL | Relational Database | mysql -h mysql.example.com -P 3306 -u username -p |
Check connection, test with database |
RabbitMQ | Message Broker | curl -kvvv -u guest:guest http://rabbitmq.example.com:15672/api/overview |
Check connection, check queues |
Minio | Object Storage | curl -kvvv http://minio.example.com:9000 |
Check connection, list buckets |
Fluentd / TD-Agent | Log Management | curl -kvvv http://fluentd.example.com:24224 |
Check connection, check logs |
Kafka | Distributed Streaming Platform | kafka-console-consumer.sh --bootstrap-server kafka.example.com:9092 --topic test --from-beginning |
Check connection, check topics |
PostgreSQL | Relational Database | psql -h postgres.example.com -p 5432 -U username -d database_name |
Check connection, list databases |
NGINX | Web Server Debugging | nginx -t |
Verify configuration, reload configuration, check logs |
HAProxy | Load Balancer Debugging | haproxy -c -f /etc/haproxy/haproxy.cfg |
Verify configuration, reload configuration, view statistics |
Conclusion
By leveraging tools like curl
, telnet
, tcpdump
, and others, and understanding how to check connectivity for services such as Redis, MySQL, RabbitMQ, and Minio, you can effectively diagnose and resolve network and service-related issues. Additionally, using NGINX and HAProxy debugging tips can help you maintain a smooth and efficient development workflow.
Feel free to share your thoughts and experiences in the comments below!
Posted on June 20, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.