Din nyinköpta VPS är som en olåst dörr – script kiddies över hela världen står och bultar på. Den här guiden visar hur du låser dörren ordentligt, så att din openclaw inte rymmer och ställer till med skit.

0. Innan vi sätter igång

Du har precis skaffat en VPS, känner dig peppad och har fått din IP och ditt root-lösenord. Vad gör du sen?

Många hoppar direkt in och börjar installera mjukvara och rulla ut sina projekt.

Det är en farlig vana.

Din VPS har en publik IP, vilket betyder att vem som helst i hela världen kan försöka koppla upp sig mot den. Och med standardinställningarna ser det ut så här:

  • Porten är öppen för alla: 22
  • Användarnamnet är det välkända root
  • Det enda som står mellan dig och kaos är ett enda lösenord

Varje dag skannar otaliga automatiserade skript IP-intervall och försöker brutea sig in med vanliga lösenord. Din server är under attack från sekunden den går live.

Så, allra första grejen du ska göra när du fått tag på din VPS är inte att installera mjukvara – det är att säkra upp den.


1. Målet med den här guiden

Målet med den här artikeln är:

  • ✅ Skapa säker fjärråtkomst: SSH-nyckelinloggning + icke-standardport
  • ✅ Skapa en vanlig användare: undvik att köra direkt som root
  • ✅ Sätt upp en brandvägg: öppna bara de portar du faktiskt behöver
  • ✅ Slå på nätverksoptimering: BBR får nätverket att flyga
  • ✅ Stoppa brute force-attacker: fail2ban bannar automatiskt elaka IP:n

När du är klar med det här har din VPS en gedigen grund, och du kan lugnt börja rulla ut tjänster i den.


2. Planering och funderingar

Varför göra alla dessa inställningar?

En nyinköpt VPS är som en ny lägenhet rakt från byggentreprenören:

Standardläge Risk Vår lösning
Inloggning som root För hög behörighet, stor risk vid misstag Skapa vanlig användare + sudo
Lösenordsinloggning Kan knäckas med brute force SSH-nyckel-inloggning
Standardport 22 Uppsöks aktivt av skanners Byt till icke-standardport
Brandvägg avstängd Alla portar exponeras utåt UFW släpper endast igenom nödvändiga portar
Ursprungligt nätverk Hög paketförlust, hög latens BBR-kongestionskontroll

Övergripande flöde

VPS初始化流程

Vi följer den här ordningen, och jag kommer att förklara varför vi gör varje steg.

3. Steg för steg

3.1 Första inloggning och systemuppdatering

Hämta serverns IP

När du har köpt din VPS kommer leverantören att ge dig:

  • IP-adress: till exempel 192.168.1.100
  • Port: vanligtvis 22 (vissa leverantörer byter till en annan port)
  • Användarnamn: oftast root
  • Lösenord: en slumpmässigt genererad teckensträng

VPS 服务商后台的登录信息页面

Anslut via SSH

Mac / Linux-användare: öppna terminalen och kör direkt:

1
2
ssh root@你的服务器IP
# 例如:ssh [email protected]

Windows-användare:

  • Windows 10/11 har OpenSSH inbyggt, så du kan köra kommandot ovan direkt i PowerShell eller CMD
  • Annars kan du använda verktyg som Termius eller MobaXterm

Första gången du ansluter får du en fråga om att bekräfta fingeravtrycket:

1
2
3
The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

Den frågar i princip: “Jag känner inte igen den här maskinen, är du säker på att du vill ansluta?”

Skriv yes och tryck på Enter. Skriv sedan in lösenordet (obs: inga tecken syns när du skriver, det är en vanlig säkerhetsfunktion), och tryck på Enter.

首次 SSH 连接的完整过程,包含指纹确认

Ser du något i den här stilen betyder det att du är inloggad:

1
2
3
Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.x.x-x-generic x86_64)
...
root@hostname:~#

💡 Varför ska du dubbelkolla fingeravtrycket?

Det är för att skydda dig mot “man-in-the-middle-attacker”. Genom att spara serverns fingeravtryck första gången du ansluter kan du känna igen om någon försöker imitera din server senare – om fingeravtrycket plötsligt ändras vet du att något är lurt.

登录成功了

Lär känna din server

När du har loggat in är det läge att kolla läget och se vad din maskin faktiskt har under huven:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看系统版本
cat /etc/os-release

# 查看内核版本
uname -r

# 查看 CPU 核心数和型号
nproc
lscpu | grep "Model name"

# 查看内存
free -h

# 查看磁盘
df -h

服务器基本信息输出

Spara den här informationen någonstans, du kommer behöva den när du ska felsöka senare.

Uppdatera systemet

När du kollat av servern är det dags för det första riktiga ärendet: att uppdatera systemet. Systemavbilden på en ny server kan vara flera månader gammal, och det kan ha släppts en hel del säkerhetsuppdateringar under tiden:

1
2
# 更新软件包列表 + 升级所有软件 + 清理
apt update && apt full-upgrade -y && apt autoremove -y && apt autoclean

Så här funkar flaggorna:

  • apt update: uppdaterar paketindexet
  • apt full-upgrade: uppgraderar alla paket, inklusive kärnan
  • -y: svarar automatiskt ja på allt, så du slipper knappa in “yes”
  • apt autoremove: städar bort beroenden som inte längre behövs
  • apt autoclean: rensar cachen med nedladdade installationspaket

apt update 和 apt upgrade 执行过程

⏱️ Det här steget kan ta några minuter beroende på hur mycket som ska uppdateras. Ibland poppar det upp en fråga under tiden – bara följ instruktionerna på skärmen så går det bra.

Kolla om du behöver starta om

Efter en kärnuppdatering brukar du behöva starta om servern för att den ska träda i kraft:

1
2
# 检查是否需要重启
cat /var/run/reboot-required 2>/dev/null && echo ">>> 需要重启" || echo ">>> 无需重启"

是否需要重启

Om den säger att en omstart krävs:

1
reboot

Efter omstarten får du SSH:a in igen.

Installera standardverktyg

1
apt install -y sudo curl wget git vim htop tree unzip net-tools ufw fail2ban neofetch

Vad är de här verktygen till för?

Verktyg Användning
sudo Låter vanliga användare köra admin-kommandon
curl / wget Ladda ner filer
git Versionshantering
vim Textredigerare
htop Snyggare processövervakning
tree Visar katalogstruktur som ett träd
net-tools Nätverksverktyg (ifconfig, netstat m.m.)
ufw Enkel och smidig brandvägg
fail2ban Skydd mot brute force-attacker
neofetch Snygg visning av systeminfo
neofetch 显示的系统信息

3.2 Skapa en icke-root-användare

Varför inte köra direkt som root?

root-användaren har alldeles för mycket makt. Ett litet misstag med rm -rf / och allt är borta. För vardagliga sysslor bör du använda en vanlig användare och bara ta till administratörsrättigheter via sudo när det verkligen behövs.

En龙虾 (openclaw) är ju ett riktigt monster – du vågar väl inte ge den root-access?

Skapa användaren

1
2
# 创建用户(把 ittinker 换成你想要的用户名)
adduser ittinker

Systemet ber dig ställa in ett lösenord och lite annan info:

1
2
3
4
5
6
7
8
New password:              # 输入密码(不会显示)
Retype new password: # 再输入一次
Full Name []: # 可以直接回车跳过
Room Number []: # 回车跳过
Work Phone []: # 回车跳过
Home Phone []: # 回车跳过
Other []: # 回车跳过
Is the information correct? [Y/n] # 输入 Y 确认

adduser 创建用户的完整交互过程

Ge sudo-rättigheter

1
2
# 把用户加入 sudo 组, ittinker 换成你自己上面创建的那个用户
usermod -aG sudo ittinker

Dubbelkolla att det funkar:

1
2
3
4
5
# 切换到新用户 ittinker 换成你自己上面创建的那个用户
su - ittinker

# 测试 sudo 是否生效
sudo whoami

Om utskriften blir root har sudo konfigurerats korrekt.
测试sudo

💡 Smartis

Skriv exit för att byta tillbaka till root-användaren. I nästa steg fortsätter vi att ställa in allt som root, och byter till den vanliga användaren när konfigurationen är klar.


3.3 Ställ in inloggning med SSH-nyckel

Nyckelautentisering vs. lösenordsautentisering

SSH密钥认证原理

Att logga in med nycklar är mycket säkrare än med lösenord:

  • Lösenord kan brute-forceas, nycklar är i princip omöjliga att knäcka
  • Slipper knappa in lösenordet varje gång – mycket smidigare
  • Även om lösenordet läcker kommer ingen in utan din privata nyckel

Steg 1: Generera nyckelparet lokalt

Kör detta på din egen dator (inte på servern):

1
2
# 生成 ED25519 密钥(推荐,更安全更快)
ssh-keygen -t ed25519 -C "[email protected]"

Du får den här uppmaningen:

1
Enter file in which to save the key (/Users/你/.ssh/id_ed25519):

Tryck bara Enter för att använda standardsökvägen. Här använder vi ./ittinker , vilket betyder att filen sparas i den aktuella mappen med namnet ittinker

1
Enter passphrase (empty for no passphrase):

Du kan lösenordsskydda nyckeln (ett extra lager säkerhet), eller trycka Enter direkt för att hoppa över det.

本地生成 SSH 密钥的过程

När nyckeln är genererad hittar du två filer i mappen ~/.ssh/ (nedan är standardfilnamnen, så här blir det om du tryckte Enter tidigare):

  • id_ed25519: privat nyckel, absolut inte får läcka ut!
  • id_ed25519.pub: publik nyckel, ska laddas upp till servern

💡 ed25519 vs RSA

ed25519 är den algoritm som rekommenderas idag, den är säkrare och har kortare nycklar än traditionell RSA. Om ditt system är för gammalt och inte stöder den kan du använda ssh-keygen -t rsa -b 4096.

En liten detalj: nycklarna som ed25519 genererar är ganska små, medan RSA-filerna är stora. Jag frågade AI och fick veta att storleken inte spelar någon roll, det beror bara på algoritmen.

Steg två: Ladda upp den publika nyckeln till servern

Metod A: Använd ssh-copy-id (rekommenderas)

1
2
# 在你的电脑上执行
ssh-copy-id -i ~/.ssh/id_ed25519.pub yourname@你的服务器IP

När du har skrivit in lösenordet kopieras den publika nyckeln automatiskt till servern.

ssh-copy-id 执行成功

Metod B: Kopiera manuellt

Om ssh-copy-id inte fungerar kan du göra det manuellt:

1
2
# 1. 在你的电脑上,查看公钥内容
cat ~/.ssh/id_ed25519.pub

Kopiera det som skrivs ut (en lång textsträng som börjar med ssh-ed25519).

1
2
3
4
5
6
7
8
9
10
11
# 2. 在服务器上,为新用户创建 .ssh 目录, ittinker 换成你刚刚创建的用户名
mkdir -p /home/ittinker/.ssh
chmod 700 /home/ittinker/.ssh

# 3. 创建 authorized_keys 文件并粘贴公钥
vim /home/ittinker/.ssh/authorized_keys
# 按 i 进入编辑模式,粘贴公钥,按 Esc,输入 :wq 保存退出

# 4. 设置正确的权限
chmod 600 /home/ittinker/.ssh/authorized_keys
chown -R ittinker:ittinker /home/ittinker/.ssh

⚠️ Rättigheter är superviktigt!

SSH är väldigt petigt med filrättigheter:

  • .ssh katalog: 700 (bara din egen användare har tillgång)
  • authorized_keys fil: 600 (bara din egen användare kan läsa och skriva)

Är rättigheterna fel kommer SSH att vägra använda nyckeln vid inloggning.

Steg 3: Testa nyckelinloggning

Öppna ett nytt terminalfönster (låt det ursprungliga vara öppet ifall du råkar ställa in fel så du kan åtgärda det), och testa att logga in med nyckel:

1
ssh ittinker@你的服务器IP

Om du kan logga in utan att behöva skriva in lösenord så är nyckeln korrekt konfigurerad! 🎉

(Om du har satt ett passphrase för din privata nyckel kommer du att bli ombedd att skriva in det, det är helt normalt)
使用密钥成功登录(无需服务器密码)

Här la vi till en -i-parameter, för vi har inte den här nyckeln i standardsökvägen, utan i den aktuella sökvägen. Om vi inte anger det kommer systemet att använda standardnyckeln.


3.4 Säkra upp SSH

Nu när nyckelinloggning fungerar är det dags att härda SSH:

  1. Ändra standardporten (slipper portscanners)
  2. Stäng av lösenordsinloggning
  3. Förbjuda root från att logga in direkt

Redigera SSH-konfigurationsfilen

1
2
3
4
5
# 备份原配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

# 编辑配置
nano /etc/ssh/sshd_config

修改前

Leta upp och ändra följande inställningar (vissa kan vara utkommenterade, ta bort # i början):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 修改端口(选一个 1024-65535 之间的数字)
Port 22000

# 禁止 root 登录
PermitRootLogin no

# 允许密钥登录
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# 禁止密码登录(确保密钥登录测试成功后再改!)
PasswordAuthentication no

# 使用更安全的 SSH2 协议
Protocol 2

# 最大认证尝试次数
MaxAuthTries 3

# 客户端超时设置
ClientAliveInterval 300
ClientAliveCountMax 2

修改后的 sshd_config 关键配置

Spara och avsluta (ctrl + o).

I Nano sparar du med ctrl + o. Den frågar efter filnamnet, tryck bara på Enter. För att avsluta trycker du ctrl + x.

Starta om SSH-tjänsten

1
systemctl restart sshd.service

⚠️ Viktig påminnelse!

Stäng inte det aktuella terminalfönstret! Testa först i ett nytt fönster att den nya konfigurationen fungerar och att du kan logga in:

1
ssh -p 22000 yourname@你的服务器IP

Om det funkar kan du stänga det gamla fönstret. Om du inte kommer in kan du fortfarande fixa konfigurationen i det gamla fönstret.

Om du har köpt en lättviktsserver är chansen stor att du inte kan ändra den här porten, men en traditionell ECS går bra att ändra. Tänk på det.


3.5 Konfigurera UFW-brandväggen

UFW防火墙规则

UFW (Uncomplicated Firewall) är Ubuntus standardbrandvägg. Den är enkel att ställa in men ändå riktigt kraftfull.

Grundläggande konfiguration

1
2
3
4
5
6
7
8
9
10
11
# 设置默认策略:拒绝所有入站,允许所有出站
ufw default deny incoming
ufw default allow outgoing

# 允许 SSH(使用你设置的端口)
ufw allow 22000/tcp comment 'SSH'
ufw allow 22/tcp comment 'SSH' # 如果是轻量服务器,还是开22端口

# 允许 HTTP 和 HTTPS
ufw allow 80/tcp comment 'HTTP'
ufw allow 443/tcp comment 'HTTPS'

Aktivera brandväggen

1
ufw enable

Du får en fråga som ser ut så här:

1
Command may disrupt existing ssh connections. Proceed with operation (y|n)?

Skriv y för att bekräfta.

Kontrollera statusen

1
ufw status verbose

ufw status 的输出结果

23022 var bara en slarv från min sida, ni kör bara med de värden som passar er egen situation

Utskriften ser ut ungefär så här:

1
2
3
4
5
6
7
8
9
10
11
12
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)

To Action From
-- ------ ----
22000/tcp (SSH) ALLOW IN Anywhere
80/tcp (HTTP) ALLOW IN Anywhere
443/tcp (HTTPS) ALLOW IN Anywhere
22000/tcp (SSH (v6)) ALLOW IN Anywhere (v6)
80/tcp (HTTP (v6)) ALLOW IN Anywhere (v6)
443/tcp (HTTPS (v6)) ALLOW IN Anywhere (v6)

Snabbreferens för vanliga kommandon

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看状态
ufw status

# 添加规则
ufw allow 8080/tcp

# 删除规则
ufw delete allow 8080/tcp

# 允许特定 IP 访问所有端口
ufw allow from 192.168.1.100

# 禁用防火墙(不推荐)
ufw disable

# 重置所有规则
ufw reset

3.6 Slå på BBR-acceleration

BBR (Bottleneck Bandwidth and Round-trip propagation time) är en TCP-styralgoritm utvecklad av Google som kan ge nätverksprestandan ett rejält lyft.

Slå på med ett klick

1
2
3
4
5
6
# 添加 BBR 配置
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf

# 使配置生效
sysctl -p

Kontrollera att det är aktiverat

1
2
# 查看当前拥塞控制算法
sysctl net.ipv4.tcp_congestion_control

Utskriften bör vara:

1
net.ipv4.tcp_congestion_control = bbr
1
2
# 确认 BBR 模块已加载
lsmod | grep bbr

Utskriften ser ut ungefär så här:

1
tcp_bbr    20480  3

💡 Effekten av BBR

När du har slagit på BBR, särskilt i miljöer med instabilt nätverk eller hög fördröjning, kommer du garanterat att märka:

  • Snabbare nedladdningshastigheter
  • Mer responsiva SSH-sessioner
  • Snabbare webbsideladdningar

bbr 开启


3.7 Konfigurera fail2ban för att skydda mot brute force-attacker

fail2ban håller koll på loggarna och bannlyser automatiskt IP-adresser som misslyckas med att logga in för många gånger.

Grundläggande konfiguration

1
2
3
4
5
# 复制默认配置(不要直接修改 jail.conf)
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# 编辑配置
vim /etc/fail2ban/jail.local

Leta upp avsnittet [sshd] och se till att följande inställningar är på plats:

1
2
3
4
5
6
7
8
[sshd]
enabled = true
port = 22000 # 改成你的 SSH 端口
filter = sshd
logpath = /var/log/auth.log
maxretry = 3 # 最大尝试次数
bantime = 3600 # 封禁时间(秒),这里是 1 小时
findtime = 600 # 在这个时间窗口内

fail2ban

Starta tjänsten

1
2
3
4
5
# 重启 fail2ban
systemctl restart fail2ban

# 设置开机自启
systemctl enable fail2ban

Kolla statusen

1
2
3
4
5
# 查看 fail2ban 状态
fail2ban-client status

# 查看 SSH 监控状态
fail2ban-client status sshd

fail2ban-client status sshd 的输出

Utskriften ser ut ungefär så här:

1
2
3
4
5
6
7
8
9
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:

Vanliga kommandon

1
2
3
4
5
6
7
8
# 手动封禁 IP
fail2ban-client set sshd banip 1.2.3.4

# 手动解封 IP
fail2ban-client set sshd unbanip 1.2.3.4

# 查看被封禁的 IP
fail2ban-client status sshd

3.8 [Valfritt] Hantera flera servrar med SSH Config

Om du har flera servrar är det ganska tråkigt att skriva in ssh -p 22000 user@ip varje gång. Du kan förenkla det rejält med hjälp av SSH Config.

Konfigurationsfil

Redigera ~/.ssh/configdin lokala dator:

1
vim ~/.ssh/config

Lägg till konfigurationen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 第一台服务器
Host vps1
HostName 192.168.1.100
User yourname
Port 22000
IdentityFile ~/.ssh/id_ed25519

# 第二台服务器
Host vps2
HostName 192.168.1.101
User admin
Port 22222
IdentityFile ~/.ssh/id_ed25519

# 通用设置(应用于所有连接)
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes

Så använder du det

Nu kan du koppla upp dig direkt med ett alias:

1
2
3
4
5
# 连接第一台服务器
ssh vps1

# 连接第二台服务器
ssh vps2

Slipper du att memorera IP, port och användarnamn!


3.9 [Valfritt] Tillåt endast Cloudflare

Om din sajt ligger helt och hållet bakom Cloudflare kan du ställa in så att port 80/443 enbart tillåter Cloudflares IP-adresser – det ger dig ett extra lager av säkerhet.

⚠️ OBS: För att den här konfigurationen ska funka måste din domän redan vara kopplad till Cloudflare CDN.

Automatiskt konfigurationsskript

1
2
3
4
5
6
7
8
# 下载脚本
wget -O ~/.cloudflare-ufw.sh https://gist.githubusercontent.com/Xm798/12560579ce11f62027ea8da1fae37456/raw/b07ac8cfe09badf02fc70e2d8bc2da68cabbda50/cloudflare-ufw.sh

# 添加执行权限
chmod +x ~/.cloudflare-ufw.sh

# 执行脚本
~/.cloudflare-ufw.sh

Det här skriptet kommer att:

  1. Hämta de senaste IP-undersnäten direkt från Cloudflare
  2. Lägg till UFW-regler så att bara dessa IP-adresser når port 80/443
  3. Ladda om UFW

Sätt upp schemalagd uppdatering

Cloudflares IP-undersnät kan ändras med tiden, så vi ställer in en automatisk uppdatering varje vecka:

1
2
# 添加 cron 任务(每周一凌晨执行)
(crontab -l 2>/dev/null; echo "0 0 * * 1 /root/.cloudflare-ufw.sh > /dev/null 2>&1") | crontab -

3.10 Ställ in tidszon

Standardtidszonen är antagligen UTC. Byt till din egen tidszon så är det mycket lättare att läsa loggarna:

1
2
3
4
5
6
7
8
# 查看当前时区
timedatectl

# 设置为上海时区(中国用户)
sudo timedatectl set-timezone Asia/Shanghai

# 验证
date

设置时区


3.11 [Valfritt] Konfigurera automatiska säkerhetsuppdateringar

Låt systemet sköta installationen av säkerhetspatchar automatiskt, så slipper du göra allt manuellt varje gång:

1
2
3
4
5
# 安装自动更新工具
sudo apt install -y unattended-upgrades

# 配置
sudo dpkg-reconfigure --priority=low unattended-upgrades

Välj “Yes” för att aktivera automatiska uppdateringar.

💡 Den här funktionen installerar säkerhetsuppdateringar automatiskt, men uppgraderar inte till en ny stor version, så det är ganska säkert.


4. Sammanfattning

Checklista för initieringen

När du har ställt in allt ovan, kör igenom den här checklistan för att dubbelkolla:

Kontrollpunkt Kommando Förväntat resultat
Systemet är uppdaterat apt update && apt list --upgradable Inga paket att uppgradera
Vanlig användare kan sudo sudo whoami Skriver ut root
Nyckel-inloggning funkar ssh yourname@ip -p port Logga in utan lösenord
Lösenordsinloggning är avstängd grep PasswordAuth /etc/ssh/sshd_config PasswordAuthentication no
SSH-porten är ändrad grep Port /etc/ssh/sshd_config Porten du valde
Brandväggen är aktiverad ufw status Status: active
BBR är påslaget sysctl net.ipv4.tcp_congestion_control = bbr
fail2ban körs systemctl status fail2ban active (running)
Tidszon är inställd timedatectl Asia/Shanghai eller din egen tidszon
Lokal SSH Config cat ~/.ssh/config Serveralias är konfigurerat

Viktiga filplatsningar

1
2
3
4
/etc/ssh/sshd_config        # SSH 服务端配置
~/.ssh/authorized_keys # 允许登录的公钥
~/.ssh/config # 本地 SSH 客户端配置(在你电脑上)
/etc/fail2ban/jail.local # fail2ban 配置

Säkerhetsbest practices

  1. Uppdatera systemet regelbundet: apt update && apt upgrade
  2. Kolla inloggningsloggar regelbundet: lastb (misslyckade inloggningar), last (lyckade inloggningar)
  3. Håll koll på fail2ban-bannlysningar
  4. Backa viktiga config-filer innan du ändrar dem

5. Felsökningsloggar

Q1: Nyckel-inloggningen misslyckas, du måste ändå knappa in lösenordet?

Möjliga orsaker:

  1. Rättighetsproblem (vanligast)

    1
    2
    3
    # 检查并修复权限
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
  2. Den offentliga nyckeln kopierades fel

    1
    2
    3
    # 检查 authorized_keys 内容
    cat ~/.ssh/authorized_keys
    # 应该是一行完整的公钥,以 ssh-ed25519 或 ssh-rsa 开头
  3. SELinux strular (på CentOS/RHEL-system)

    1
    restorecon -Rv ~/.ssh

Q2: Kan du inte ansluta efter att ha bytt port?

Felsökningssteg:

  1. Dubbekolla att den nya porten är öppen i brandväggen:

    1
    ufw status | grep 你的端口
  2. Bekräfta att SSH-konfigurationen stämmer:

    1
    grep Port /etc/ssh/sshd_config
  3. Kontrollera att SSH-tjänsten körs:

    1
    systemctl status sshd
  4. Om du inte kommer in alls, logga in via din leverantörs VNC/konsol och laga det där.

Q2.5: Portändringen ger överhuvudtaget ingen effekt? (Molnleverantörers lätta servrar)

Symptom: Du ändrade /etc/ssh/sshd_config, men efter att ha startat om tjänsten lyssnar den fortfarande på port 22 och den nya porten fungerar inte.

Diagnosmetod:

bash

1
2
# 查看是谁在监听 22 端口
netstat -lntp | grep :22

Om utdatan ser ut ungefär så här:

1
tcp  0  0.0.0.0:22  0.0.0.0:*  LISTEN  1/init

Betyder det att port 27 lyssnas på av init (PID 1) och inte av sshd-processen.

Varför: Vissa molnleverantörers “lightweight application servers” eller “container instances” har sin SSH proxad på plattformsnivå, så din sshd-konfiguration inuti servern fungerar inte.

Lösning:

Instanstyp Hur du ändrar SSH-porten
Traditionell ECS Ändra i sshd_config ✅
Lightweight-server Måste kanske ändras i molnets kontrollpanel, eller stöds inte alls
Container-instans Stöds oftast inte att ändras

Om din instans inte stöder att byta port är andra säkerhetsåtgärder ännu viktigare:

  • ✅ Skapa en vanlig användare + inaktivera root-inloggning
  • ✅ SSH-nyckelinloggning + inaktivera lösenordsinloggning
  • ✅ fail2ban mot brute force-attacker

Om du får dessa på plats är säkerheten fortfarande hög.

Q3: fail2ban har bannlyst mig själv?

1
2
3
4
5
# 用 VNC 登录后解封
fail2ban-client set sshd unbanip 你的IP

# 把你的 IP 加入白名单,编辑 jail.local
ignoreip = 127.0.0.1/8 ::1 你的IP

Q4: Kan inte nå webbplatsen efter att UFW aktiverats?

1
2
3
4
5
6
# 检查 80/443 是否开放
ufw status

# 如果没有,添加规则
ufw allow 80/tcp
ufw allow 443/tcp

Q5: Kommandot säger att sudo inte hittas?

Debian minimal-installation kanske inte har sudo, installera med root:

1
2
apt install sudo
usermod -aG sudo ittinker

6. One-click initieringsskript (att använda när du känner dig bekväm)

När du är bekant med stegen ovan kan du använda det här skriptet för att snabbt initiera.

⚠️ OBS: Innan du kör skriptet, se till att du redan har din SSH-publiknyckel redo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/bin/bash
# VPS 初始化脚本
# 使用方法:以 root 身份运行

set -e

# === 配置区域(根据你的需求修改)===
NEW_USER="ittinker" # 新用户名
NEW_SSH_PORT="22000" # 新 SSH 端口
TIMEZONE="Asia/Shanghai" # 时区
# =====================================

echo "=== VPS 初始化脚本 ==="
echo ""

# 1. 更新系统
echo "[1/8] 更新系统..."
apt update && apt upgrade -y

# 2. 安装基础工具
echo "[2/8] 安装基础工具..."
apt install -y sudo curl wget git vim htop tree unzip net-tools ufw fail2ban neofetch

# 3. 创建新用户
echo "[3/8] 创建用户 $NEW_USER..."
if id "$NEW_USER" &>/dev/null; then
echo "用户已存在,跳过创建"
else
adduser --gecos "" $NEW_USER
usermod -aG sudo $NEW_USER
fi

# 4. 配置 SSH 目录
echo "[4/8] 配置 SSH 目录..."
mkdir -p /home/$NEW_USER/.ssh
chmod 700 /home/$NEW_USER/.ssh
touch /home/$NEW_USER/.ssh/authorized_keys
chmod 600 /home/$NEW_USER/.ssh/authorized_keys
chown -R $NEW_USER:$NEW_USER /home/$NEW_USER/.ssh

echo ""
echo ">>> 请将你的公钥粘贴到下面(粘贴后按 Ctrl+D 结束):"
cat >> /home/$NEW_USER/.ssh/authorized_keys
echo ""

# 5. 修改 SSH 配置
echo "[5/8] 修改 SSH 配置..."
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sed -i "s/^#*Port .*/Port $NEW_SSH_PORT/" /etc/ssh/sshd_config
sed -i "s/^#*PermitRootLogin .*/PermitRootLogin no/" /etc/ssh/sshd_config
sed -i "s/^#*PasswordAuthentication .*/PasswordAuthentication no/" /etc/ssh/sshd_config
sed -i "s/^#*PermitEmptyPasswords .*/PermitEmptyPasswords no/" /etc/ssh/sshd_config

# 6. 配置防火墙
echo "[6/8] 配置防火墙..."
ufw default deny incoming
ufw default allow outgoing
ufw allow $NEW_SSH_PORT/tcp
ufw allow 80/tcp
ufw allow 443/tcp
echo "y" | ufw enable

# 7. 开启 BBR
echo "[7/8] 开启 BBR..."
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p

# 8. 设置时区
echo "[8/8] 设置时区..."
timedatectl set-timezone $TIMEZONE

# 重启 SSH
systemctl restart sshd

echo ""
echo "=========================================="
echo " ✅ 初始化完成!"
echo "=========================================="
echo ""
echo " 新 SSH 端口: $NEW_SSH_PORT"
echo " 新用户: $NEW_USER"
echo " 时区: $TIMEZONE"
echo ""
echo " 请使用以下命令登录:"
echo " ssh -p $NEW_SSH_PORT $NEW_USER@$(curl -s ifconfig.me 2>/dev/null || echo '你的IP')"
echo ""
echo " ⚠️ 重要:请先测试新配置能否登录,再关闭当前终端!"
echo ""

7. Hur mycket säkrare har din server blivit egentligen?

Steg Vad du gjorde Varför det är viktigt
Uppdatera systemet Installerade de senaste patcharna Lagar kända sårbarheter
Skapa ny användare Slutar använda root direkt Minskar risken för misstag
SSH-nycklar Bytte till nycklar istället för lösenord Går inte att brute-forcea
Ändra port Undviker standardport 22 Minskar chansen att bli skannad
Inaktivera lösenord Tillåter bara inloggning med nyckel Eliminerar lösenordsattacker helt
Inaktivera root Root kan inte logga in direkt Ökar svårigheten för angripare
UFW-brandvägg Öppnar bara nödvändiga portar Minskar angreppsytan
BBR-acceleration Optimerar nätverksprestanda Snabbar upp åtkomsten
fail2ban Bannar automatiskt elaka IP-adresser Förhindrer ihärdiga attacker

När du har kört igenom allt detta har din server redan passerat 90% av alla VPS:ar när det gäller säkerhet.


Smygtitt på nästa del

I nästa avsnitt kör vi en snabbreferens för konfiguration av SSH-nyckel-inloggning, där vi dyker djupare in i:

  • Hur du genererar nycklar på olika operativsystem
  • Hantering av flera nycklar
  • Konfiguration av SSH Agent
  • Inställningar för vanliga SSH-klienter

Senast uppdaterad: januari 2026

Serie om verktygslådan för solo-utvecklare, följ gärna med!