Get started
SSH into a GPU server
Create a key, send us the public half with your order, then connect, share access with your team and harden SSH.
On this page
To SSH into a GPU server from FullGPU, you need a key pair: the private key stays on your computer and the public key goes on the server. We install the public key you send with your order, so your first login works without a password. This page covers SSH key setup on macOS, Linux and Windows, a config entry, access for teammates and basic hardening. If your server is already delivered, the quickstart picks up after the first login.
Create an ed25519 key
ed25519 keys are short, fast and supported by every current OpenSSH release. The same command works on macOS, Linux and in PowerShell on Windows 10 or 11, which include the OpenSSH client:
ssh-keygen -t ed25519 -C "alice-laptop"
- Press Enter to accept the default location:
~/.ssh/id_ed25519on macOS and Linux,C:\Users\you\.ssh\id_ed25519on Windows. - Choose a passphrase. It protects the key if your laptop is lost.
- Display the public key:
You should see a single line starting with# macOS and Linux cat ~/.ssh/id_ed25519.pub # Windows PowerShell Get-Content $env:USERPROFILE\.ssh\id_ed25519.pubssh-ed25519. The text after-Cis only a label.
Send the public key with your order
Paste the whole .pub line into your server request. If you forgot, send it through the contact form before delivery. Share only the file ending in .pub: we only need the public key, and the private key should never leave your computer.
Connect to the server
ssh root@203.0.113.10
Use the IP address and username from your welcome email; this site uses root and the documentation address 203.0.113.10 in examples. On the first connection, SSH shows the server's host key fingerprint and asks you to confirm. Type yes and it is saved in ~/.ssh/known_hosts. You should land on a shell prompt, and whoami prints your username. If your key is not in the default location, add -i followed by its path.
Save the connection in ~/.ssh/config
A config entry saves typing and is reused by scp, rsync and VS Code. Add this to ~/.ssh/config on your computer (C:\Users\you\.ssh\config on Windows):
Host gpu1
HostName 203.0.113.10
User root
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
ServerAliveInterval 60
Now ssh gpu1 connects directly. IdentitiesOnly yes makes SSH offer only this key, which avoids "Too many authentication failures" when your agent holds several. ServerAliveInterval keeps idle sessions from being dropped.
Give teammates access
Give each person their own key, so you can revoke one without touching the others. Ask each teammate for their public key, then pick one approach.
Add a key to an existing account
nano ~/.ssh/authorized_keys # paste the key on a new line and save
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
Each line of authorized_keys is one key. To revoke access, delete the line.
Create a separate account (recommended)
sudo adduser --disabled-password bob
sudo mkdir -p /home/bob/.ssh
sudo nano /home/bob/.ssh/authorized_keys # paste Bob's public key
sudo chown -R bob:bob /home/bob/.ssh
sudo chmod 700 /home/bob/.ssh
sudo chmod 600 /home/bob/.ssh/authorized_keys
adduser asks for a full name and other details; press Enter to skip them. The account has no password, so Bob can only log in with his key: ssh bob@203.0.113.10 should give him a shell. If he needs administrator rights, set a password he will use for sudo with sudo passwd bob, then run sudo usermod -aG sudo bob. The docker group is equivalent to root, so add only people you would trust with sudo.
Turn off password login
Key-only login shuts out password guessing. Check the effective settings first:
sudo sshd -T | grep -Ei '^(passwordauthentication|kbdinteractiveauthentication|permitrootlogin)'
If passwordauthentication shows yes, add a drop-in file. OpenSSH keeps the first value it reads for most settings, and files in /etc/ssh/sshd_config.d/ are read in alphabetical order, so the 00- prefix makes these lines win:
sudo tee /etc/ssh/sshd_config.d/00-keys-only.conf >/dev/null <<'EOF'
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password
EOF
sudo sshd -t && sudo systemctl reload ssh
Keep your current session open. From a second terminal, confirm that key login still works and that password login is refused:
ssh gpu1 'echo key login works'
ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password gpu1
The second command should end with Permission denied (publickey).
Optional: fail2ban
With passwords off, scanners cannot get in, but they still fill your logs. fail2ban bans addresses after repeated failures, and Ubuntu's package enables its sshd jail by default:
sudo apt install -y fail2ban
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
You should see the sshd jail and its counters. If the service does not start, read sudo journalctl -u fail2ban; on minimal images without /var/log/auth.log, add backend = systemd under an [sshd] section in /etc/fail2ban/jail.local and restart it.
Port forwarding basics
SSH can carry other connections, so you can reach a service that listens only on the server's loopback interface without opening a port:
# your localhost:8888 reaches 127.0.0.1:8888 on the server
ssh -N -L 8888:127.0.0.1:8888 gpu1
# several ports at once
ssh -N -L 8888:127.0.0.1:8888 -L 8000:127.0.0.1:8000 gpu1
-N opens the tunnel without a remote shell; stop it with Ctrl+C. Remote development uses this for JupyterLab, and the firewall guide covers services that must be public.
Troubleshooting
- Permission denied (publickey). Run
ssh -v gpu1to see which keys are offered, and check the username. On the server,~/.sshmust be mode 700 andauthorized_keysmode 600, both owned by that user. - REMOTE HOST IDENTIFICATION HAS CHANGED. Expected after a reinstall: remove the old entry with
ssh-keygen -R 203.0.113.10. If the server was not reinstalled, do not connect, and contact us. - Locked out after a change. Do not keep retrying. Contact support with the server IP and what you changed.
Still stuck?
Send us the details — server IP, what you ran and any error output. An engineer replies 24/7.