{"id":2797,"date":"2026-04-16T10:20:33","date_gmt":"2026-04-16T10:20:33","guid":{"rendered":"https:\/\/www.serverspan.com\/blog\/"},"modified":"2026-04-16T10:20:33","modified_gmt":"2026-04-16T10:20:33","slug":"how-to-enable-ssh-on-a-vps-and-connect-with-putty-complete-guide-for-all-linux-and-bsd-families","status":"publish","type":"post","link":"https:\/\/www.serverspan.com\/en\/blog\/how-to-enable-ssh-on-a-vps-and-connect-with-putty-complete-guide-for-all-linux-and-bsd-families\/","title":{"rendered":"SSH on VPS: Enable &#038; Connect with PuTTY in 5 Minutes (All Linux\/BSD)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">When you first receive a VPS, the only access you have is through the NoVNC or Serial console inside the ServerSpan control panel. SSH is not always active out of the box, and on most modern OS images root login with a password is explicitly disabled by default. This guide walks you through every step \u2014 from the console to your first working SSH session \u2014 for every major Linux and BSD distribution, so you can connect from PuTTY, Windows Terminal, or any other SSH client without opening a support ticket.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What SSH Is and Why You Need It<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">SSH (Secure Shell) is an encrypted network protocol that lets you control your server remotely from any computer in the world. Instead of using the web-based console in the control panel, you open a terminal on your local machine and get instant access to your VPS as if you were sitting in front of it. The NoVNC and Serial console in your ServerSpan panel is your emergency fallback \u2014 SSH is how you actually work day to day.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The component that listens for incoming SSH connections on the server side is called <strong>OpenSSH Server<\/strong> (the process is called <code>sshd<\/code>). Your local machine uses an SSH <em>client<\/em> \u2014 PuTTY on Windows, or the built-in <code>ssh<\/code> command on Linux and macOS \u2014 to connect to it. By default, OpenSSH listens on <strong>port 22<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1 \u2014 Open Your VPS Console<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Log into your <a href=\"https:\/\/www.serverspan.com\/en\/virtual-servers\">ServerSpan control panel<\/a>, navigate to your VPS, and open the <strong>Console<\/strong> tab (NoVNC or Serial). You will see a black terminal screen. If it appears blank, press <kbd>Enter<\/kbd> once to get a login prompt. Type <code>root<\/code> and press <kbd>Enter<\/kbd>, then type your root password. Nothing appears on screen while you type \u2014 this is normal Linux and BSD behavior, not a keyboard problem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you never set a root password or forgot it, use the <strong>Password Reset<\/strong> function in the control panel before continuing. Once logged in, your prompt looks like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@hostname:~#<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Every command in this guide is typed here, in this console window. Do not close it until you confirm SSH is working from your own machine.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2 \u2014 Find Your OS Family<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The package manager, service manager, and some configuration details differ between distributions. If you are not sure which OS is running on your VPS, run this command:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat \/etc\/os-release<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>NAME<\/code> and <code>ID_LIKE<\/code> fields tell you exactly what you are working with. Use the table below to find your section:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Distribution<\/th><th>Family<\/th><th>Package manager<\/th><th>Service name<\/th><\/tr><\/thead><tbody><tr><td>Debian, Ubuntu, Linux Mint<\/td><td>Debian\/Ubuntu<\/td><td>apt<\/td><td>ssh<\/td><\/tr><tr><td>Rocky Linux, AlmaLinux, CentOS Stream, RHEL, Fedora<\/td><td>RHEL<\/td><td>dnf<\/td><td>sshd<\/td><\/tr><tr><td>openSUSE Leap, openSUSE Tumbleweed, SLES<\/td><td>SUSE<\/td><td>zypper<\/td><td>sshd<\/td><\/tr><tr><td>Arch Linux, Manjaro, EndeavourOS<\/td><td>Arch<\/td><td>pacman<\/td><td>sshd<\/td><\/tr><tr><td>Alpine Linux<\/td><td>Alpine<\/td><td>apk<\/td><td>sshd<\/td><\/tr><tr><td>FreeBSD, TrueNAS CORE<\/td><td>BSD<\/td><td>pkg<\/td><td>sshd (rc.d)<\/td><\/tr><tr><td>OpenBSD<\/td><td>BSD<\/td><td>pkg_add<\/td><td>sshd (rc.d)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3 \u2014 Install OpenSSH Server<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">First check whether the SSH server is already installed and running. Run the check that matches your family:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Debian \/ Ubuntu\nsystemctl status ssh\n\n# RHEL \/ SUSE \/ Arch\nsystemctl status sshd\n\n# Alpine Linux\nrc-status | grep sshd\n\n# FreeBSD \/ OpenBSD\nservice sshd status<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If the output says <code>Active: active (running)<\/code> (Linux) or <code>sshd is running<\/code> (BSD), skip directly to Step 4. If the service is not found or not running, install it using the instructions for your family below.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Debian and Ubuntu<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>apt update\napt install openssh-server -y<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On Debian and Ubuntu the service name is <code>ssh<\/code>, not <code>sshd<\/code>. The package installation starts and enables the service automatically.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rocky Linux, AlmaLinux, CentOS Stream, RHEL, Fedora<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>dnf install openssh-server -y\nsystemctl enable --now sshd<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">OpenSSH is often pre-installed on RHEL-family images but not always running. The <code>--now<\/code> flag starts the service immediately and marks it to start on every reboot.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">openSUSE Leap and Tumbleweed \/ SLES<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>zypper install openssh-server -y\nsystemctl enable --now sshd<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On openSUSE, the sshd configuration file lives at <code>\/etc\/ssh\/sshd_config<\/code> as on every other Linux family. However, on Tumbleweed a vendor-supplied default exists at <code>\/usr\/etc\/ssh\/sshd_config<\/code>. If <code>\/etc\/ssh\/sshd_config<\/code> does not exist after installation, copy the vendor default first:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cp \/usr\/etc\/ssh\/sshd_config \/etc\/ssh\/sshd_config<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">From that point on, edit <code>\/etc\/ssh\/sshd_config<\/code> as described in Step 5.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Arch Linux, Manjaro, EndeavourOS<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>pacman -Sy openssh\nsystemctl enable --now sshd<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Arch minimal images often ship without OpenSSH. The package is called <code>openssh<\/code> and installs both the client and the server in one package.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Alpine Linux<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>apk update\napk add openssh-server\nrc-update add sshd\nrc-service sshd start<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Alpine uses OpenRC rather than systemd, so <code>systemctl<\/code> does not exist here. The <code>rc-update add sshd<\/code> command marks the service to start at boot; <code>rc-service sshd start<\/code> starts it immediately in the current session.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">FreeBSD<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">OpenSSH comes pre-installed on FreeBSD. You only need to enable the service. The clean way to do it is with <code>sysrc<\/code>, which writes directly to <code>\/etc\/rc.conf<\/code> with correct syntax:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sysrc sshd_enable=\"YES\"\nservice sshd start<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If you prefer to do it manually, open <code>\/etc\/rc.conf<\/code> in the <code>ee<\/code> editor (which is always available on FreeBSD, unlike nano or vim on fresh installs) and add this line:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sshd_enable=\"YES\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then start the service:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/etc\/rc.d\/sshd start<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">OpenBSD<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">OpenSSH was created by the OpenBSD project and is built into the base system. No installation is needed. Enable and start it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>rcctl enable sshd\nrcctl start sshd<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">LXC containers without systemd<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If you are on an LXC container and <code>systemctl<\/code> returns <em>&#8220;Failed to connect to bus: No such file or directory&#8221;<\/em>, the container was initialized without systemd. Use the legacy service command instead:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>service ssh start      # Debian \/ Ubuntu on LXC\nservice sshd start     # RHEL, SUSE, Arch on LXC<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4 \u2014 Set a Root Password<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On cloud and VPS images the root account often has no password or is locked by default. Run this command to set one:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>passwd root<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You will be prompted to type a new password twice. Nothing appears on screen as you type. Choose something strong \u2014 at least 12 characters with a mix of uppercase, lowercase, numbers, and symbols. A confirmation message reading <code>passwd: password updated successfully<\/code> (or <code>password changed<\/code> on BSD) confirms it worked.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5 \u2014 Allow Root Login with Password in sshd_config<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is the step most guides handle poorly, and it is the primary reason SSH is installed and running but still refuses your connection. Modern distributions either block root login entirely or allow it only with SSH key pairs, not passwords. You need to change two directives in the SSH daemon configuration file.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On every Linux distribution, the main configuration file is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/etc\/ssh\/sshd_config<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On FreeBSD and OpenBSD the path is identical: <code>\/etc\/ssh\/sshd_config<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Open the file. Use <code>nano<\/code> if available, <code>ee<\/code> on FreeBSD, or <code>vi<\/code> on Alpine and OpenBSD:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nano \/etc\/ssh\/sshd_config    # Debian, Ubuntu, Rocky, SUSE, Arch\nee \/etc\/ssh\/sshd_config      # FreeBSD (ee is always present)\nvi \/etc\/ssh\/sshd_config      # Alpine, OpenBSD, or any system without nano<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Search for the line containing <code>PermitRootLogin<\/code>. On different distributions it looks like one of these:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#PermitRootLogin prohibit-password\nPermitRootLogin prohibit-password\nPermitRootLogin no\n#PermitRootLogin yes<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Change it \u2014 or add it if it is missing \u2014 so it reads exactly:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PermitRootLogin yes<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Remove the <code>#<\/code> at the beginning if there is one. Lines starting with <code>#<\/code> are comments and have no effect regardless of what they say.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now find the line containing <code>PasswordAuthentication<\/code> and make it read:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PasswordAuthentication yes<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Save the file. In nano: <kbd>Ctrl+X<\/kbd>, then <kbd>Y<\/kbd>, then <kbd>Enter<\/kbd>. In <code>ee<\/code>: <kbd>Esc<\/kbd>, then choose <strong>a) leave editor, saving changes<\/strong>. In <code>vi<\/code>: press <kbd>Esc<\/kbd>, type <code>:wq<\/code>, press <kbd>Enter<\/kbd>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ubuntu 22.04 and Ubuntu 24.04 \u2014 the override directory<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ubuntu 22.04 and newer ship with a configuration override directory at <code>\/etc\/ssh\/sshd_config.d\/<\/code>. Files in this directory take priority over the main <code>sshd_config<\/code>, meaning your changes above can be silently ignored if a conflicting setting exists in a drop-in file. Check what is there:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ls \/etc\/ssh\/sshd_config.d\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You will often see <code>50-cloud-init.conf<\/code>. Open it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nano \/etc\/ssh\/sshd_config.d\/50-cloud-init.conf<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If it contains <code>PasswordAuthentication no<\/code>, change it to <code>PasswordAuthentication yes<\/code> and save. This override directory is the single most common reason password authentication appears to do nothing on Ubuntu even after editing the main config file correctly.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">openSUSE \u2014 the vendor config fallback<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">On Tumbleweed, if you skipped the copy step in Step 3 and <code>\/etc\/ssh\/sshd_config<\/code> does not exist, the daemon reads from <code>\/usr\/etc\/ssh\/sshd_config<\/code>. Never edit the file under <code>\/usr\/etc\/<\/code> \u2014 it gets overwritten by package updates. Copy it first as described in Step 3, then edit the copy under <code>\/etc\/ssh\/<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 6 \u2014 Restart the SSH Service<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Changes to <code>sshd_config<\/code> take effect only after the daemon is restarted. Use the command that matches your system:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Debian \/ Ubuntu\nsystemctl restart ssh\n\n# Rocky Linux, AlmaLinux, CentOS, RHEL, Fedora, SUSE, Arch\nsystemctl restart sshd\n\n# Alpine Linux\nrc-service sshd restart\n\n# FreeBSD\nservice sshd restart\n\n# OpenBSD\nrcctl restart sshd\n\n# LXC containers without systemd (Debian\/Ubuntu)\nservice ssh restart\n\n# LXC containers without systemd (RHEL\/SUSE\/Arch)\nservice sshd restart<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">After restarting, verify the service came back up cleanly:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Linux with systemd\nsystemctl status ssh      # or sshd\n\n# Alpine\nrc-service sshd status\n\n# FreeBSD \/ OpenBSD\nservice sshd status<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The status should show the service as running. If it shows a failure, the most common cause is a syntax error in <code>sshd_config<\/code>. Test the configuration file before restarting to catch errors:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sshd -t<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If this command returns nothing, the syntax is valid. If it prints an error, it will tell you exactly which line in the file is wrong.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 7 \u2014 Find Your VPS IP Address<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Your VPS IP address is shown in the ServerSpan control panel on the VPS overview page. You can also retrieve it directly from the console:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Linux\nip a\n\n# FreeBSD \/ OpenBSD\nifconfig<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Look for an address that is not <code>127.0.0.1<\/code> (loopback) and not a <code>10.x.x.x<\/code> or <code>172.x.x.x<\/code> private range address unless your VPS is on a private network with NAT. Your public IPv4 address will typically look like <code>185.x.x.x<\/code> or <code>45.x.x.x<\/code> depending on the datacenter location.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 8 \u2014 Connect from Windows Using PuTTY<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">PuTTY is a free SSH client for Windows. Download it from the official site at <strong>putty.org<\/strong> and install it. Open PuTTY and fill in the configuration window:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>In the <strong>Host Name (or IP address)<\/strong> field, type your VPS IP address<\/li>\n\n\n\n<li>Confirm <strong>Port<\/strong> is set to <code>22<\/code><\/li>\n\n\n\n<li>Confirm <strong>Connection type<\/strong> is set to <strong>SSH<\/strong><\/li>\n\n\n\n<li>Click <strong>Open<\/strong><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">On the first connection to a new server, PuTTY shows a security alert: <em>&#8220;The host key is not cached for this server.&#8221;<\/em> This is expected and safe on a server you just set up. Click <strong>Accept<\/strong>. PuTTY stores the server&#8217;s fingerprint so it can warn you if it changes in the future.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A terminal window opens with the prompt <code>login as:<\/code>. Type <code>root<\/code> and press <kbd>Enter<\/kbd>. Type your root password and press <kbd>Enter<\/kbd>. The password does not appear on screen as you type \u2014 this is intentional, not a malfunction. If the credentials are correct, you land at:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@hostname:~#<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You are in. You can now close the NoVNC console and work entirely through PuTTY.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 9 \u2014 Connect from Linux or macOS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Open a terminal and type:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh root@YOUR_VPS_IP<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On the first connection you will see a fingerprint warning. Type <code>yes<\/code> and press <kbd>Enter<\/kbd> to accept it. Enter your root password when prompted. Nothing appears on screen as you type.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Common Problems and How to Fix Them<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Connection refused on port 22<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The SSH service is not running or a firewall is blocking the port. Return to the NoVNC console and check the service status, then check whether a host firewall is active. On Debian\/Ubuntu with UFW:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ufw allow 22\/tcp &amp;&amp; ufw reload<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On Rocky Linux \/ AlmaLinux \/ RHEL with firewalld:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>firewall-cmd --permanent --add-service=ssh &amp;&amp; firewall-cmd --reload<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On openSUSE with firewalld:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>firewall-cmd --permanent --add-service=ssh &amp;&amp; firewall-cmd --reload<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On Arch Linux, no firewall is active by default, so a refused connection typically means the service is not running.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On FreeBSD, if <code>pf<\/code> is enabled, add a pass rule for port 22 to <code>\/etc\/pf.conf<\/code> and run <code>pfctl -f \/etc\/pf.conf<\/code>. On OpenBSD, <code>pf<\/code> is active by default \u2014 edit <code>\/etc\/pf.conf<\/code> and add:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pass in on egress proto tcp from any to any port 22<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then reload: <code>pfctl -f \/etc\/pf.conf<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Permission denied, please try again<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">SSH is running but your credentials are rejected. The three most common causes: wrong password, <code>PermitRootLogin<\/code> is still not set to <code>yes<\/code>, or <code>PasswordAuthentication<\/code> is still <code>no<\/code> in an override file. Go back to Step 5, verify the main config and any drop-in files under <code>\/etc\/ssh\/sshd_config.d\/<\/code> (on Ubuntu), and restart the service again after any change. Confirm the active configuration without restarting with:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sshd -T | grep -E \"permitrootlogin|passwordauthentication\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This prints what the daemon is actually using at runtime. If either line still shows a restrictive value, the override has not been applied yet.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Nothing happens when I type my password<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This is normal behavior. Linux and BSD terminals do not echo passwords \u2014 no characters, no asterisks, nothing. Type your password and press <kbd>Enter<\/kbd>. If it fails you can try again. After several consecutive failures the server may temporarily block your IP address. Wait two minutes before retrying.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This appears when you rebuilt or reinstalled the OS on your VPS and try to reconnect from a machine that has the old host key cached. Since you performed the rebuild yourself it is safe to remove the old entry. On Linux and macOS:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh-keygen -R YOUR_VPS_IP<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In PuTTY on Windows, go to <strong>Registry Editor \u2192 HKEY_CURRENT_USER\\Software\\SimonTatham\\PuTTY\\SshHostKeys<\/strong> and delete the entry for your IP address, then reconnect and accept the new fingerprint.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">SSH starts but crashes immediately on Alpine or minimal containers<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The SSH daemon needs host keys to be generated before it can start. If you installed OpenSSH on a stripped-down container image, generate the host keys manually:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh-keygen -A<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then start the service again.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What to Do Next<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Root login with a password is the fastest way to get started, but once you are comfortable with the server you should make two improvements: switch to SSH key-based authentication and disable password login entirely, then move SSH off the default port 22. Both steps eliminate the vast majority of automated brute-force attempts that every internet-facing server receives within minutes of being provisioned. Our <a href=\"https:\/\/www.serverspan.com\/en\/blog\/practical-vps-security-guide-15-essential-security-steps-for-linux-servers\">practical VPS security guide covering 15 essential hardening steps<\/a> walks through both in detail, along with fail2ban, unattended upgrades, and firewall rules.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If this is your first VPS and you are not yet sure what to do with it beyond getting SSH working, the <a href=\"https:\/\/www.serverspan.com\/en\/blog\/complete-linux-vps-setup-guide-for-beginners\/\">complete Linux VPS setup guide for beginners<\/a> covers hostname and timezone configuration, user management, installing a web server, and setting up basic monitoring. For hands-on help with any configuration step, the <a href=\"https:\/\/www.serverspan.com\/en\/linux-administration\">ServerSpan managed Linux administration service<\/a> is available for direct technical assistance.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">All <a href=\"https:\/\/www.serverspan.com\/en\/virtual-servers\">ServerSpan VPS plans<\/a> \u2014 KVM and LXC \u2014 come with full root access and NoVNC\/Serial console available from day one. If SSH still does not work after following this guide, open a support ticket and include the <strong>exact error message<\/strong> shown in PuTTY or your terminal. &#8220;I can&#8217;t SSH in&#8221; takes significantly longer to diagnose than &#8220;I see <code>Permission denied (publickey,gssapi-keyex,gssapi-with-mic)<\/code>&#8221; or &#8220;Connection refused on port 22.&#8221; The error message tells us exactly where in the chain the problem is.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>When you first receive a VPS, the only access you have is through the NoVNC or Serial console inside the ServerSpan control panel. SSH is not always active out of the box, and on most modern OS images root login with a password is explicitly disabled by default. This guide walks you through every step [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2798,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,12],"tags":[15650,15670,15665,15659,15661,15657,15658,15656,15655,15653,15654,15668,15652,15677,15651,15667,15675,15678,15673,15662,15676,15671,15664,15679,15666,15680,15663,15674,15669,15660,15672],"class_list":["post-2797","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","category-virtual-servers","tag-allow-root-login-ssh-password","tag-apk-add-openssh-alpine","tag-connect-vps-putty-tutorial","tag-enable-ssh-alpine-linux","tag-enable-ssh-arch-linux","tag-enable-ssh-freebsd","tag-enable-ssh-openbsd","tag-enable-ssh-opensuse","tag-enable-ssh-rocky-linux-almalinux","tag-enable-ssh-root-login-debian","tag-enable-ssh-root-login-ubuntu","tag-enable-sshd-rocky-linux-almalinux-rhel","tag-how-to-enable-ssh-on-vps","tag-how-to-use-putty-ssh-beginners","tag-install-openssh-server-linux","tag-install-openssh-server-ubuntu-debian","tag-lxc-container-systemd-ssh-failed-connect-bus","tag-opensuse-usr-etc-ssh-sshd_config-vendor","tag-pacman-install-openssh-arch","tag-passwordauthentication-yes-sshd_config","tag-rcctl-enable-sshd-openbsd","tag-remote-host-identification-changed-fix-ssh-keygen","tag-ssh-connection-refused-port-22-fix","tag-ssh-password-not-visible-terminal-normal","tag-ssh-permission-denied-password-fix","tag-sshd-t-check-active-ssh-configuration","tag-sshd_config-permitrootlogin-yes","tag-sysrc-sshd_enable-freebsd","tag-ubuntu-sshd_config-d-override-50-cloud-init","tag-vps-ssh-setup-guide-beginners","tag-zypper-install-openssh-server-opensuse"],"_links":{"self":[{"href":"https:\/\/www.serverspan.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/2797","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.serverspan.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.serverspan.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.serverspan.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.serverspan.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2797"}],"version-history":[{"count":1,"href":"https:\/\/www.serverspan.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/2797\/revisions"}],"predecessor-version":[{"id":2799,"href":"https:\/\/www.serverspan.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/2797\/revisions\/2799"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.serverspan.com\/blog\/index.php?rest_route=\/wp\/v2\/media\/2798"}],"wp:attachment":[{"href":"https:\/\/www.serverspan.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2797"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.serverspan.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2797"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.serverspan.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2797"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}