A long delay when connecting over SSH is typically caused by the server performing a reverse DNS lookup on your client's IP address, which times out if the DNS server is unreachable or slow. To resolve this immediately, disable
UseDNS in the
/etc/ssh/sshd_config file on the server and restart the SSH service. This change eliminates the network latency associated with verifying the client's hostname, restoring near-instant connection speeds for most users.
Understanding the Root Cause of SSH Latency
When you initiate an SSH connection, the server does not simply accept the handshake; it performs several verification steps to ensure security and proper logging. One of the most common culprits for significant delays, often ranging from 10 to 30 seconds, is the reverse DNS lookup process. By default, OpenSSH attempts to resolve the IP address of the connecting client back into a hostname. This is done to populate the logs with meaningful hostnames rather than raw IP addresses.
If the DNS server configured on the SSH server cannot be reached, or if the authoritative nameserver for your client's IP address is slow to respond, the server will wait for the DNS query to time out before proceeding with the authentication prompt. This timeout period is what you experience as a "hang" or long delay. Additionally, other factors such as GSSAPI authentication attempts or slow key exchange algorithms can contribute to latency, but DNS issues are the most frequent cause in standard environments.
Disabling Reverse DNS Lookups
The most effective solution for eliminating DNS-related delays is to disable the reverse DNS lookup feature on the SSH daemon. This configuration change tells the server to skip the resolution step, allowing the connection to proceed directly to authentication. You must have administrative access to the SSH server to make this change.
Begin by opening the SSH daemon configuration file using a text editor with superuser privileges. The file is located at
/etc/ssh/sshd_config. Once open, search for the directive
UseDNS. It may be commented out with a hash symbol (
#) at the beginning of the line, meaning it is set to its default value. If you do not find it, you can add it manually.
Set the value to
no as shown below:
# Example /etc/ssh/sshd_config
...
UseDNS no
...
After saving the file, you must restart the SSH service for the changes to take effect. The command varies depending on your operating system. On systems using systemd, such as modern Ubuntu, Debian, or CentOS versions, use the following command:
sudo systemctl restart sshd
On older systems using SysVinit, you might need to use:
sudo service ssh restart
Once the service has restarted, attempt to connect again. The delay should be gone, and you should see the password prompt almost immediately. Note that while this speeds up connections, the logs on the server will now show IP addresses instead of hostnames. This is generally acceptable for most security auditing purposes, especially in dynamic IP environments.
Optimizing GSSAPI Authentication
Another potential source of delay is GSSAPI (Generic Security Services Application Program Interface) authentication. If your SSH client is configured to attempt Kerberos or other GSSAPI-based authentication methods, it may hang while trying to negotiate these credentials, particularly if you are not part of a domain environment where these services are active.
You can disable GSSAPI authentication on the client side by modifying your local SSH configuration file, usually located at
~/.ssh/config. Add the following line to the host block or globally:
Host *
GSSAPIAuthentication no
This prevents the client from wasting time attempting to acquire tickets or verify identities through GSSAPI mechanisms that are likely irrelevant to your current session. This fix is particularly useful if you are connecting from a workstation that is not joined to an Active Directory domain.
Checking Network and Firewall Settings
In some cases, the delay might not be software configuration but rather network-level interference. Firewalls or intrusion detection systems may be inspecting the initial packets, causing a pause before the TCP handshake completes. Ensure that there are no middleboxes dropping or delaying packets between your client and the server.
You can test this by using the
-v flag with the SSH command to see verbose output. This will show you exactly where the connection hangs. For example:
ssh -v user@server_ip
Look for lines indicating
debug1: Authentications that can continue: followed by a pause. If the pause occurs after the server presents its host key and before the authentication methods are listed, it strongly suggests a DNS or GSSAPI issue. If the pause occurs during the key exchange, it might be a network congestion issue.
For more advanced troubleshooting, consider checking if the server is experiencing high load or CPU spikes, which can also delay response times. However, in the vast majority of cases, adjusting
UseDNS and
GSSAPIAuthentication resolves the problem. If you are dealing with X11 forwarding issues alongside SSH delays, you might also want to review related guides on
X11 Forwarding over SSH - Can't Open Display to ensure your graphical tunneling is not contributing to resource contention.
Frequently Asked Questions
Does disabling UseDNS affect SSH security?
No, disabling
UseDNS does not reduce the security of your SSH connection. The primary purpose of this setting is to improve log readability by resolving IP addresses to hostnames. Security relies on cryptographic keys and authentication methods, which remain unchanged.
How can I verify if DNS is the cause of my delay?
You can verify this by adding the
-vvv flag to your SSH command to get detailed debug output. Watch for a significant pause after the server sends its banner and before it lists available authentication methods. If the pause correlates with a DNS timeout message in the debug log, DNS is the culprit.
Can I enable UseDNS only for specific hosts?
Yes, you can configure
UseDNS on a per-host basis in the client-side
~/.ssh/config file using the
Hostname and
User directives, although
UseDNS is primarily a server-side setting. You would typically manage this via the server's
sshd_config for consistency across all clients.
What if I still experience delays after changing UseDNS?
If delays persist, check for GSSAPI authentication attempts by adding
GSSAPIAuthentication no to your client config. Also, ensure that your server's clock is synchronized using NTP, as significant time drifts can cause authentication failures and retries that appear as delays.
Is it safe to remove BOM marks in SFTP usernames?
While removing Byte Order Marks (BOM) is crucial for certain file processing tasks, it is unrelated to SSH connection latency. However, if you are using SFTP over SSH and encountering authentication errors, ensure your username does not contain hidden characters. For more details on handling special characters, see
How to Remove BOM Mark in SFTP Username when Using OpenSSH.