ping proves a host is alive. It proves nothing about why your app can't talk to it. These are the four commands I reach for when the network "works" but the application doesn't.
Which process owns this port?
ss is the modern netstat — faster and clearer. -tulnp = TCP + UDP, listening, numeric ports, with process. When two services fight over a port, this tells you instantly who won.
Is it DNS? (It's usually DNS.)
Querying a specific resolver with @10.0.0.2 isolates whether the problem is the resolver or the record. +short strips the noise. If the public resolver answers and the internal one times out, you've found your blast radius.
Established but silent — capture the actual packets
When a connection shows ESTABLISHED in ss but no data flows, tcpdump shows the truth at the wire. A SYN going out with no SYN-ACK coming back means a firewall or security group is silently dropping the return path. -c 20 stops after 20 packets so you're not flooded.
The mental model
ss— what's listening and who connected (socket state)lsof -i— same, indexed by process/filedig— name resolution, per-resolvertcpdump— ground truth at the packet level
Work down the stack: socket state first, then DNS, then packets. Don't reach for tcpdump until ss has told you the connection exists.