Innovate | Connect | Transform
ContactService statusUSD $

GICT knowledge base

How to Troubleshoot and Fix Slow SSH Connections in Linux

Published

Linux and Commands

Secure Shell (SSH) is a fundamental tool for managing remote Linux servers. It provides secure, encrypted access to the command line over a network, making it an essential part of system administration. However, there are times when SSH connections become painfully slow—either during login, while typing commands, or when executing remote operations.

A slow SSH connection can lead to productivity loss, user frustration, and even potential timeouts in automation scripts. In this article, we’ll explore the most common reasons why SSH might be slow and walk through practical troubleshooting steps to identify and resolve the root cause. We’ll cover topics like DNS resolution, reverse lookups, network latency, and more, ensuring that your remote administration tasks remain efficient.

Symptoms of a Slow SSH Connection

Before diving into the technicalities of troubleshooting, let’s identify what users typically experience with slow SSH connections:

  • Long delay before the login prompt appears
  • Login prompt appears, but authentication takes an extended period of time
  • Connection is established, but there is noticeable lag when typing or executing commands
  • High latency when running remote commands, leading to sluggish response times

Understanding where the slowness occurs helps in narrowing down the possible causes.

Step 1: Test Connection Time with ssh -vvv

The first step in diagnosing slow SSH connections is to run a verbose SSH connection test, which provides you with detailed feedback on where the process may be hanging:

ssh -vvv user@hostname

This command will output detailed debug logs that show various stages of the connection process, including:

  • DNS resolution times
  • Key exchange durations
  • Authentication delays
  • Shell startup times

What to look for: If there is a pause after “Connecting to,” the issue most likely lies with DNS or network configurations. If there is a delay after “Authenticating,” you may want to investigate the authentication methods used and check for issues with PAM (Pluggable Authentication Module). If the delay occurs after authentication is successful, check for delays in shell startup scripts or remote lookups.

Step 2: DNS and Reverse Lookup Issues

One of the most common causes of a slow SSH login experience is reverse DNS lookup issues.

Why It Matters:

When a user connects via SSH, the server may attempt to resolve the client’s IP address to a hostname before allowing the login. If reverse DNS is slow or misconfigured, this can introduce delays during the login process.

How to Check DNS Configuration:

On the SSH server, check the SSH daemon configuration file located at /etc/ssh/sshd_config for the following line:

UseDNS yes

If this line is not commented, SSH will attempt reverse lookups. You can disable this feature by changing it to:

UseDNS no

After making this change, restart the SSH daemon for the settings to take effect:

sudo systemctl restart sshd

Note: This setting only pertains to the server side and not the client side.

Step 3: Check Hostname Resolution on Client

If the client is attempting to connect using a hostname (e.g., ssh user@server), and there is a delay, the issue could originate from client-side hostname resolution.

To quickly test this, try connecting directly using the server’s IP address:

ssh [email protected]

If connecting via the IP address is fast, but using the hostname leads to delays, the root problem lies within:

  • /etc/resolv.conf
  • /etc/hosts
  • A broken DNS server that is slow to respond

Fixing Hostname Resolution Issues:

  • Ensure that the nameserver entries in /etc/resolv.conf are correct and point to a reliable DNS server.
  • Consider using a fast public DNS server like Google DNS (8.8.8.8) or Cloudflare DNS (1.1.1.1) to improve resolution speed.
  • If the server’s IP address is static, add it to your /etc/hosts file to bypass DNS queries altogether. The entry would look like:
    192.168.1.100   server

Step 4: Check SSH Authentication Methods

Another potential source of delays during SSH login stems from the methods used for authentication. SSH attempts various authentication methods to establish a connection. When multiple authentication methods are enabled, this can introduce additional delays before a successful login is achieved.

Optimal Client SSH Configuration:

Check to see if your client SSH configuration file, typically located at ~/.ssh/config, specifies preferred authentication methods. You can limit the authentication methods by adding the following line:

Host server
    PreferredAuthentications publickey

On the server side, review the SSH daemon configuration file at /etc/ssh/sshd_config for these settings:

PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication no

Disabling GSSAPI can prevent long Kerberos lookups that might fail or time out. To do this, set:

GSSAPIAuthentication no

After making any changes, restart the SSH service to apply these configurations:

sudo systemctl restart sshd

Step 5: Profile Network Latency

Network issues can contribute substantially to slow SSH response times. Using tools to measure and analyze network latency can reveal underlying problems.

Use Ping for Latency Testing:

Try pinging the SSH server to measure round-trip times and identify latency:

ping -c 5 server

This will send five packets to the server and show the time it takes for each round trip. If the results indicate high latency, further investigation is warranted:

  • Check for network congestion during peak usage times.
  • Examine physical connections and cabling for breakdowns or quality issues.
  • Look for potential issues with routing configurations, whether on your local network or ISP side.

Testing with `mtr` and `traceroute`:

To gain further insights regarding network paths and latency across hops, use the mtr command, which combines the functionalities of ping and traceroute:

mtr server

This will provide detailed feedback on packet loss and latency at each network hop to the server.

Using Traceroute:

In addition to mtr, employing the traceroute command can help identify where delays may be occurring across the network:

traceroute server

Examine the results for any high latency hops and note the routers or switches that are causing the delays.

Step 6: Analyze Server’s PAM and Shell Scripts

After successful authentication in SSH, if there is a noticeable delay before the shell prompt appears, the root cause may be related to either PAM (Pluggable Authentication Modules) or the shell configuration scripts being executed during login.

Evaluating PAM Modules:

PAM is essential for managing authentication and can include modules like LDAP or Kerberos, which might introduce latency if they are misconfigured:

sudo less /var/log/auth.log

Examine logs for any time gaps or errors related to authentication. If you suspect that PAM modules are causing delays, you may need to troubleshoot individual modules for performance issues or misconfigurations.

Analyzing Shell Initialization Scripts:

SSH shells often execute startup scripts such as .bashrc, .bash_profile, or .profile. If these scripts contain commands that take a long time to execute, it can result in delays once you successfully log in:

  • Look out for external network calls in the scripts or commands like who that may be slow on misconfigured utmp files.
  • Verify that any mounted filesystems, especially network-based mounts like NFS, are not presenting issues during login.

Fixing Shell Initialization Delays:

You can test if delays arise from shell scripts by commenting out sections of these scripts and testing your login speed. Alternatively, use:

ssh user@host 'echo ok'

This command bypasses the interactive shell to help determine if logged-in shell scripting is the source of the slowdown.

Step 7: Avoid X11 Forwarding (If Not Needed)

X11 forwarding is a convenient feature that allows graphical applications to run remotely and display on your local machine. However, if you don’t require this feature, it can introduce unnecessary delays during SSH sessions. Disable X11 forwarding on both sides:

Disable on the Client:

ssh -x user@host

Disable on the Server:

Modify the SSH daemon configuration file as follows:

X11Forwarding no

Make sure to restart the SSH server afterward to apply this change:

sudo systemctl restart sshd

Step 8: Compare with Localhost or Internal Connection

If possible, try connecting from the same host to itself or from another machine within the same local area network (LAN):

ssh user@localhost
ssh [email protected]

If the connection is fast in this scenario, yet slow when connecting from an external network, it indicates that the issue resides with:

  • DNS or reverse DNS configurations
  • Public network routing
  • ISP-level latency affecting the connection
  • Potential firewall delays between you and the destination

Step 9: Check for Fail2ban, Firewalld, or Security Tools

Security measures can inadvertently affect SSH connection speeds, especially if there are failed attempts. Tools like fail2ban may slow subsequent login attempts:

sudo fail2ban-client status

Also, assess your firewall settings, as firewalld or iptables may introduce throttling or rate-limiting effects on SSH traffic:

sudo iptables -L -n

If necessary, adjust the rules to ensure that legitimate SSH traffic is not being unnecessarily delayed or blocked.

Step 10: Use Multiplexing for Faster Connections

If you frequently SSH into a specific server, consider implementing connection multiplexing. This technique allows a single SSH connection to be reused for multiple sessions, resulting in faster connection times for subsequent logins:

Add the following to your ~/.ssh/config file:

Host server 
    ControlMaster auto 
    ControlPath ~/.ssh/cm-%r@%h:%p 
    ControlPersist 10m

This configuration sets up a master connection that remains alive after the first login, allowing future SSH commands to execute nearly instantaneously without re-establishing a new connection.

Bonus: Use Alternative Protocols if Necessary

If SSH continues to lag despite your troubleshooting efforts, and if you’re operating within a local and trusted network, consider exploring alternatives like Mosh (Mobile Shell). Mosh provides a more resilient user experience over unstable connections by allowing interactive command sessions that don’t drop when the network experiences interruptions.

To install Mosh:

sudo apt install mosh

Then connect as you normally would:

mosh user@server

Mosh keeps the session alive and usable even during brief drops in connectivity, enhancing the overall user experience.

Conclusion

Troubleshooting slow SSH connections can stem from a myriad of factors including DNS resolution issues, reverse lookups, improper SSH authentication methods, and network problems. However, the methodologies highlighted in this guide provide you with valuable insight into diagnosing and addressing these challenges effectively. With this information, you can ensure that your SSH sessions remain fast, responsive, and reliable.

By regularly monitoring your SSH connections and performing the optimizations discussed, you can prevent slow connections from disrupting your work. Whether you are managing servers in a home lab or across a data center, mastering these troubleshooting techniques will enhance your ability to maintain a robust Linux environment. Quick and efficient resolution of SSH connection issues will not only enhance your productivity but also lead to an overall smoother experience in managing your Linux systems.

Related guides

Account services are unavailable until the production backend is configured.