Świeżo kupiony VPS jest jak otwarte na oścież drzwi, w które puka cała armia skrypt-kiddies z całego świata. W tym artykule pokażę Ci, jak założyć solidną kłódkę. Żeby Twój “rak” (openclaw) nie włóczył się, gdzie popadnie.

0. Słowo wstępu

Kupiłeś właśnie VPS-a, z radością wpisujesz IP i hasło roota, a potem?

Większość ludzi robi tak: od razu rzuca się do instalacji softu i deployu projektu.

To fatalny nawyk.

Twój VPS ma publiczny IP, co oznacza, że dosłownie każdy na świecie może spróbować się do niego podłączyć. W domyślnej konfiguracji:

  • otwarty jest port 22
  • nazwa użytkownika to powszechnie znany root
  • chroni Cię już tylko jedno hasło

Codziennie miliony zautomatyzowanych skryptów skanują pule adresów IP, próbując siłowo złamać popularne hasła. Od sekundy, w której Twój serwer pojawia się w sieci, jest już pod ostrzałem.

Dlatego pierwsza rzecz po wdrożeniu VPS-a to nie instalacja oprogramowania, ale security setup.


1. Cel

Celem tego poradnika jest:

  • ✅ Zbuduj bezpieczny dostęp zdalny: logowanie kluczem SSH + zmiana domyślnego portu
  • ✅ Stwórz zwykłego użytkownika: unikaj pracy bezpośrednio na koncie root
  • ✅ Skonfiguruj firewall: otwórz tylko te porty, które są naprawdę potrzebne
  • ✅ Włącz akcelerację sieci: dzięki BBR sieć dostanie skrzydeł
  • ✅ Zablokuj atak brute-force: fail2ban automatycznie banuje złośliwe IP

Gby to ogarniesz, Twój VPS będzie miał solidne fundamenty i z czystym sumieniem będziesz mógł na nim deployować różne usługi.


2. Plan i przemyślenia

Po co to wszystko konfigurować?

Świeżo kupiony VPS jest jak mieszkanie z rynku pierwotnego, dopiero co oddane do remontu:

Stan domyślny Ryzyko Nasze rozwiązanie
Logowanie jako root Zbyt wysokie uprawnienia, błąd może być fatalny Stworzenie zwykłego usera + sudo
Logowanie hasłem Podatność na ataki brute-force Logowanie kluczem SSH
Domyślny port 22 Główny cel skanerów Zmiana na niestandardowy port
Firewall wyłączony Wszystkie porty otwarte na świat UFW – przepuszczamy tylko to, co trzeba
Domyślny network Wysoki packet loss, duże opóźnienia Algorytm kontroli przeciążenia BBR

Ogólny plan działania

VPS初始化流程

Idziemy krok po kroku w takiej kolejności, a przy każdym kroku tłumaczę, dlaczego właśnie tak.

3. Kroki do wykonania

3.1 Pierwsze logowanie i aktualizacja systemu

Zdobądź IP serwera

Po zakupie VPS dostajesz od dostawcy:

  • Adres IP: np. 192.168.1.100
  • Port: zazwyczaj 22 (niektórzy providerzy mogą go zmienić)
  • Nazwa użytkownika: domyślnie root
  • Hasło: wygenerowany losowo ciąg znaków

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

Połączenie przez SSH

Użytkownicy Mac / Linux: odpal terminal i wpisz po prostu:

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

Użytkownicy Windows:

  • Windows 10/11 ma wbudowanego OpenSSH, więc powyższą komendę odpalisz bezpośrednio w PowerShellu lub CMD
  • Ewentualnie zgrabnie sprawdzi się Termius, MobaXterm i tym podobne narzędzia

Przy pierwszym połączeniu wyskoczy zapytanie o potwierdzenie odcisku palca:

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])?

To pytanie brzmi wprost: „Nie znam tej maszyny, na pewno chcesz się połączyć?”

Wpisz yes i walnij Enter. Potem podaj hasło (uwaga: podczas wpisywania nic się nie wyświetli – to normalny mechanizm bezpieczeństwa) i ponownie daj Enter.

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

Jeśli zobaczysz coś w tym stylu, to znak, że jesteś w systemie:

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

💡 Po co w ogóle sprawdzać ten odcisk?

Żeby się uchronić przed atakiem typu man-in-the-middle. Przy pierwszym logowaniu zapisujesz odcisk palca serwera, a jeśli przy kolejnej próbie połączenia nagle się zmieni, to znak, że ktoś może podszywa się pod Twoją maszynę.

登录成功了

Pierwsze spotkanie z serwerem

Jak już się zalogujesz, warto na luzie sprawdzić, z czym w ogóle masz do czynienia:

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

服务器基本信息输出

Zapamiętaj te info — przyda się później, jak przyjdzie coś debugować.

Aktualizacja systemu

Skoro już wiesz, co masz pod maską, pierwszy poważny krok to update systemu. Obraz na nowym serwerze może być sprzed kilku miesięcy, a od tego czasu pewnie spłynęły już jakieś łatki bezpieczeństwa:

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

Co oznaczają te flagi:

  • apt update: odświeża indeks pakietów
  • apt full-upgrade: podbija wersje całego softu, łącznie z kernelem
  • -y: zgadza się automatycznie, nie musisz ręcznie walić “yes”
  • apt autoremove: czyści niepotrzebne zależności
  • apt autoclean: czyści cache pobranych pakietów instalacyjnych

apt update 和 apt upgrade 执行过程

⏱️ Ten krok może zająć kilka minut, zależnie od tego, ile aktualizacji ma w sobie. Czasem w trakcie poprosi o potwierdzenie — po prostu idź za tym, co podpowiada.

Sprawdzenie, czy trzeba zrestartować

Po aktualizacji kernela zazwyczaj trzeba odpalić reboot, żeby zmiany weszły w życie:

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

是否需要重启

Jeśli system krzyczy, że restart jest konieczny:

1
reboot

Po restarcie musisz połączyć się przez SSH od nowa.

Instalacja narzędzi, których używasz na co dzień

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

Do czego służą te narzędzia:

Narzędzie Zastosowanie
sudo Pozwala zwykłym użytkownikom odpalać komendy jako administrator
curl / wget Pobieranie plików
git Kontrola wersji
vim Edytor tekstu
htop Ładniejszy monitor procesów
tree Pokazuje strukturę katalogów jako drzewo
net-tools Narzędzia sieciowe (ifconfig, netstat itd.)
ufw Prosty i przyjazny firewall
fail2ban Ochrona przed atakami brute-force
neofetch Wyświetla info o systemie w ładnej formie
neofetch 显示的系统信息

3.2 Tworzenie użytkownika innego niż root

Dlaczego nie używać po prostu roota?

Uprawnienia konta root są po prostu zbyt szerokie — jedno nieostrożne rm -rf / i wszystkiego możesz się pozbyć. Do codziennej pracy używaj zwykłego konta, a do sudo przełączaj się dopiero wtedy, gdy potrzebujesz uprawnień administratora (czyli wpisujesz sudo).

Rak (openclaw) to istny potwór — no jak w ogóle puszczać go na roota?

Tworzenie użytkownika

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

System poprosi Cię o ustawienie hasła i podanie kilku dodatkowych informacji:

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 创建用户的完整交互过程

Nadawanie uprawnień sudo

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

Sprawdźmy, czy działa:

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

# 测试 sudo 是否生效
sudo whoami

Jeśli zobaczysz w odpowiedzi root, to znaczy, że konfiguracja sudo się udała.
测试sudo

💡 Pro tip

Wpisując exit, wrócisz do konta root. W kolejnych krokach konfigurację będziemy robić dalej jako root, a dopiero na koniec przełączymy się na zwykłego użytkownika.


3.3 Konfiguracja logowania po kluczu SSH

Logowanie kluczem vs logowanie hasłem

SSH密钥认证原理

Logowanie kluczem jest nieporównywalnie bezpieczniejsze od hasła:

  • Hasło da się złamać brute force’em, klucza w praktyce nie
  • Nie musisz wpisywać hasła przy każdym logowaniu — o wiele wygodniej
  • Nawet jeśli hasło wycieknie, bez prywatnego klucza nikt się nie dostanie

Krok 1: Generowanie pary kluczy na lokalnym komputerze

Uruchom to na swoim komputerze (nie na serwerze):

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

Pojawi się taki komunikat:

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

Po prostu wciśnij Enter, żeby użyć domyślnej ścieżki. My tu użyliśmy ./ittinker, co oznacza, że plik o nazwie ittinker zostanie zapisany w bieżącym katalogu.

1
Enter passphrase (empty for no passphrase):

Możesz ustawić hasło do klucza (dodatkowa warstwa ochrony), albo po prostu wcisnąć Enter i zostawić puste.

本地生成 SSH 密钥的过程

Gdy klucz zostanie wygenerowany, w katalogu ~/.ssh/ znajdziesz dwa pliki (to domyślne nazwy, które dostaniesz, jeśli wcześniej wszędzie wciskałeś Enter):

  • id_ed25519: klucz prywatny, absolutnie nie może wyciec!
  • id_ed25519.pub: klucz publiczny, ten musisz wrzucić na serwer

💡 ed25519 czy RSA?

ed25519 to obecnie rekomendowany algorytm, bezpieczniejszy i z krótszym kluczem niż tradycyjne RSA. Jeśli twój system jest zbyt stary i go nie obsługuje, użyj ssh-keygen -t rsa -b 4096.

Mała ciekawostka: klucze wygenerowane przez ed25519 są całkiem małe, a pliki RSA potrafią być spore. Pytałem AI i się okazało, że rozmiar nie ma znaczenia — to po prostu wynika z samego algorytmu.

Krok 2: Wrzucenie klucza publicznego na serwer

Sposób A: Użycie ssh-copy-id (polecam)

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

Po wpisaniu hasła, klucz publiczny zostanie automatycznie skopiowany na serwer.

ssh-copy-id 执行成功

Sposób B: Ręczne kopiowanie

Jeśli ssh-copy-id nie zadziała, możesz to zrobić ręcznie:

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

Skopiuj to, co wypluje komenda (długi ciąg znaków zaczynający się od 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

⚠️ Uprawnienia to podstawa!

SSH jest bardzo restrykcyjne, jeśli chodzi o uprawnienia plików:

  • Katalog .ssh: 700 (dostęp ma tylko właściciel)
  • Plik authorized_keys: 600 (tylko właściciel może czytać i zapisywać)

Jeśli uprawnienia będą złe, SSH po prostu zablokuje logowanie kluczem.

Krok 3: Test logowania kluczem

Otwórz nowe okno terminala (nie zamykaj tego poprzedniego, na wypadek gdybyś coś zepsuł w konfiguracji i potrzebował ratunku) i przetestuj logowanie:

1
ssh ittinker@你的服务器IP

Jeśli zalogujesz się bez podawania hasła, to znaczy, że konfiguracja klucza się udała! 🎉

(Jeśli ustawiłeś passphrase dla swojego klucza prywatnego, system poprosi Cię o jego wpisanie – to zupełnie normalne)
使用密钥成功登录(无需服务器密码)

Dodaliśmy tu parametr -i, ponieważ nasz klucz nie leży w domyślnej ścieżce, ale w obecnym katalogu. Jeśli go nie wskażesz, system spróbuje użyć domyślnego klucza.


3.4 Zabezpieczenie SSH

Skoro logowanie kluczem już działa, zabezpieczmy trochę nasze SSH:

  1. Zmień domyślny port (żebyś nie był łatwym celem dla skanerów)
  2. Wyłącz logowanie hasłem
  3. Zablokuj bezpośrednie logowanie jako root

Edycja pliku konfiguracyjnego SSH

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

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

修改前

Znajdź i zmodyfikuj poniższe ustawienia (niektóre mogą być zakomentowane, więc po prostu usuń znak # z przodu):

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 关键配置

Zapisz zmiany i wyjdź (ctrl + o).

W Nano zapisywanie to ctrl + o – zapyta o nazwę pliku, więc po prostu wciskasz Enter, a żeby wyjść, używasz ctrl + x.

Restart usługi SSH

1
systemctl restart sshd.service

⚠️ Ważna uwaga!

Nie zamykaj obecnego terminala! Najpierw otwórz nowe okno i sprawdź, czy z nową konfiguracją zalogujesz się bez problemu:

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

Jeśli logowanie przebiegło pomyślnie, możesz zamknąć stare okno. Jeśli nie możesz się zalogować, wciąż masz stare okno, w którym możesz naprawić konfigurację.

Jeśli kupiłeś lekki serwer, najprawdopodobniej nie zmienisz tego portu, natomiast tradycyjne ECS pozwala na modyfikację – miej to na uwadze.


3.5 Konfiguracja zapory sieciowej UFW

UFW防火墙规则

UFW (Uncomplicated Firewall) to domyślne narzędzie zapory sieciowej w Ubuntu – proste w konfiguracji, ale z potężnymi możliwościami.

Podstawowa konfiguracja

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'

Włączenie zapory

1
ufw enable

Pojawi się komunikat:

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

Wpisz y, aby potwierdzić.

Sprawdzenie statusu

1
ufw status verbose

ufw status 的输出结果

23022 to moja literówka, po prostu dostosujcie to do własnej sytuacji

Wynik powinien wyglądać mniej więcej tak:

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)

Ściągawka z przydatnych komend

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 Włączamy akcelerację BBR

BBR (Bottleneck Bandwidth and Round-trip propagation time) to algorytm kontroli przeciążenia TCP opracowany przez Google, który potrafi zauważalnie podkręcić wydajność sieciową.

Włączanie jednym kliknięciem

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

Sprawdzamy, czy działa

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

Wynik powinien wyglądać tak:

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

Wynik mniej więcej taki:

1
tcp_bbr    20480  3

💡 Jak działa BBR

Po włączeniu BBR, zwłaszcza przy niestabilnym połączeniu lub dużych opóźnieniach, od razu poczujesz różnicę:

  • Pobieranie idzie szybciej
  • Praca przez SSH jest płynniejsza
  • Strony ładują się szybciej

bbr 开启


3.7 Konfiguracja fail2ban przeciw atakom brute-force

fail2ban monitoruje logi i automatycznie banuje IP, które zbyt często próbują się zalogować bez skutku.

Podstawowa konfiguracja

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

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

Znajdź sekcję [sshd] i upewnij się, że masz takie ustawienia:

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

Uruchamianie usługi

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

# 设置开机自启
systemctl enable fail2ban

Sprawdzanie statusu

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

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

fail2ban-client status sshd 的输出

Wyjście będzie wyglądać mniej więcej tak:

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:

Przydatne komendy

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 [Opcjonalnie] Zarządzanie wieloma serwerami z SSH Config

Jeśli masz kilka serwerów, wpisywanie za każdym razem ssh -p 22000 user@ip bywa mega uciążliwe. Możesz to sobie mocno ułatwić, używając SSH Config.

Plik konfiguracyjny

Na swoim lokalnym komputerze edytuj plik ~/.ssh/config:

1
vim ~/.ssh/config

Dodaj konfigurację:

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

Jak tego używać

Teraz możesz łączyć się bezpośrednio, używając aliasu:

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

# 连接第二台服务器
ssh vps2

Koniec z pamiętaniem adresów IP, portów i nazw użytkowników!


3.9 [Opcjonalnie] Dostęp tylko dla Cloudflare

Jeśli Twoja stroda stoi całkowicie za Cloudflare, możesz skonfigurować dostęp do portów 80/443 tak, by miały go tylko adresy IP Cloudflare. To mocno podbija bezpieczeństwo.

⚠️ Uwaga: ta konfiguracja wymaga, żeby Twoja domena była już podpięta pod Cloudflare CDN.

Skrypt do automatycznej konfiguracji

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

Ten skrypt zrobi:

  1. Pobierz najnowsze zakresy IP prosto z Cloudflare
  2. Dodaj reguły w UFW, żeby dostęp do portów 80/443 miały tylko te IP
  3. Przeładuj UFW

Skonfiguruj automatyczne aktualizacje

Zakresy IP Cloudflare mogą się z czasem zmienić, więc ustawmy cotygodniową automatyczną aktualizację:

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

3.10 Ustaw strefę czasową

Domyślna strefa czasowa to prawdopodobnie UTC. Zmień ją na swoją, żeby łatwiej czytać logi:

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

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

# 验证
date

设置时区


3.11 [Opcjonalnie] Skonfiguruj automatyczne aktualizacje bezpieczeństwa

Niech system sam instaluje łatki bezpieczeństwa — oszczędzisz sobie ręcznej roboty przy każdej aktualizacji:

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

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

Wybierz „Yes”, żeby włączyć automatyczne aktualizacje.

💡 Ta funkcja instaluje tylko aktualizacje bezpieczeństwa — nie uaktualni systemu do nowej dużej wersji, więc jest dość bezpieczna.


4. Podsumowanie

Lista kontrolna po inicjalizacji

Po wykonaniu powyższych kroków przejdź jeszcze raz przez tę listę kontrolną:

Sprawdzana rzecz Polecenie Oczekiwany rezultat
System jest zaktualizowany apt update && apt list --upgradable Brak pakietów do aktualizacji
Zwykły użytkownik ma uprawnienia sudo sudo whoami Zwraca root
Logowanie kluczem działa ssh yourname@ip -p port Logowanie bez hasła
Logowanie hasłem wyłączone grep PasswordAuth /etc/ssh/sshd_config PasswordAuthentication no
Port SSH zmieniony grep Port /etc/ssh/sshd_config Port, który ustawiłeś
Zapora sieciowa (firewall) włączona ufw status Status: active
BBR włączone sysctl net.ipv4.tcp_congestion_control = bbr
fail2ban działa systemctl status fail2ban active (running)
Strefa czasowa ustawiona timedatectl Asia/Shanghai lub Twoja strefa
Lokalny SSH Config cat ~/.ssh/config Skonfigurowany alias serwera

Lokalizacja kluczowych plików

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

Najlepsze praktyki bezpieczeństwa

  1. Regularnie aktualizuj system: apt update && apt upgrade
  2. Sprawdzaj logi logowania: lastb (nieudane próby), last (udane logowania)
  3. Bieżąco monitoruj bany nałożone przez fail2ban
  4. Zawsze rób kopię zapasową ważnych plików konfiguracyjnych przed ich modyfikacją

5. Rejestr problemów

Q1: Logowanie kluczem nie działa i nadal prosi o hasło?

Możliwe przyczyny:

  1. Kwestie uprawnień (najczęstsza sytuacja)

    1
    2
    3
    # 检查并修复权限
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
  2. Klucz publiczny nie został poprawnie skopiowany

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

    1
    restorecon -Rv ~/.ssh

Q2: Po zmianie portu nie możesz się połączyć?

Kroki do sprawdzenia:

  1. Upewnij się, że nowy port jest otwarty na firewallu:

    1
    ufw status | grep 你的端口
  2. Sprawdź, czy konfiguracja SSH jest poprawna:

    1
    grep Port /etc/ssh/sshd_config
  3. Upewnij się, że usługa SSH działa:

    1
    systemctl status sshd
  4. Jeśli nie możesz się w ogóle połączyć, użyj konsoli VNC u dostawcy chmury, żeby się zalogować i to naprawić.

Q2.5: Zmiana portu w ogóle nie działa? (Lekkie serwery chmurowe)

Objaw: Zmieniłeś /etc/ssh/sshd_config, a po restarcie usługi port 22 nadal nasłuchuje, a nowy port nie działa.

Jak to zdiagnozować:

bash

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

Jeśli wynik wygląda mniej więcej tak:

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

Oznacza to, że port 22 jest nasłuchiwany przez init (PID 1), a nie przez proces sshd.

Dlaczego tak się dzieje? W przypadku niektórych dostawców chmurowych SSH w ich „lekkich serwerach aplikacyjnych” czy „instancjach kontenerowych” jest obsługiwane przez warstwę platformy, przez co konfiguracja sshd wewnątrz twojego serwera po prostu nie działa.

Jak to rozwiązać?:

Typ instancji Jak zmienić port SSH
Tradycyjny VPS/ECS Edycja sshd_config ✅
Lekki serwer Może wymagać zmiany w panelu chmury, albo w ogóle nie obsługuje zmiany
Instancja kontenerowa Zazwyczaj nie obsługuje zmiany

Jeśli twoja instancja nie pozwala na zmianę portu, inne zabezpieczenia stają się jeszcze ważniejsze:

  • ✅ Tworzenie zwykłego użytkownika + wyłączenie logowania jako root
  • ✅ Logowanie SSH kluczem + wyłączenie logowania hasłem
  • ✅ fail2ban chroniący przed atakami brute-force

Jeśli ogarniesz te kroki, twoje bezpieczeństwo i tak będzie na wysokim poziomie.

Q3: fail2ban zablokował mnie samego?

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

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

Q4: Po włączeniu UFW nie da się wejść na stronę?

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

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

Q5: Przy wykonywaniu komendy wywala błąd, że nie ma sudo?

Minimalna instalacja Debiana może nie mieć sudo, zainstaluj je z poziomu roota:

1
2
apt install sudo
usermod -aG sudo ittinker

6. Skrypt do jednorazowej inicjalizacji (dla zaawansowanych)

Jeśli masz już w małym palcu powyższe kroki, możesz użyć tego skryptu, żeby błyskawicznie wszystko zainicjować.

⚠️ Uwaga: Zanim odpalisz skrypt, upewnij się, że masz już przygotowany klucz publiczny SSH.

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. Ile zyskujesz na bezpieczeństwie po tych krokach?

Krok Co zrobiliśmy Dlaczego to ważne
Aktualizacja systemu Instalacja najnowszych łatek Łata znane luki
Stworzenie nowego usera Koniec z logowaniem po rootie Zmniejsza ryzyko wpadki
Klucze SSH Logowanie kluczem zamiast hasłem Odporne na brute-force
Zmiana portu Unikamy domyślnego 22 Mniejsze szanse na wykrycie przez skanery
Wyłączenie haseł Logowanie tylko kluczem Całkowity koniec ataków na hasła
Wyłączenie roota Brak bezpośredniego logowania na roota Podnosi poprzeczkę dla atakujących
Firewall UFW Otwarte tylko niezbędne porty Zmniejsza powierzchnię ataku
Akceleracja BBR Optymalizacja wydajności sieci Szybszy dostęp i lepszy ping
fail2ban Automatyczny ban złośliwych IP Chroni przed uporczywymi atakami

Po tym wszystkim Twoja fura jest bezpieczniejsza niż 90% VPS-ów na rynku.


Zapowiedź kolejnego wpisu

W następnym wpisie weźmiemy na warsztat Szybki przewodnik po konfiguracji logowania kluczem SSH i wejdziemy w szczegóły:

  • Generowanie kluczy na różnych systemach
  • Zarządzanie wieloma kluczami
  • Konfiguracja SSH Agent
  • Ustawienia popularnych klientów SSH

Ten wpis ostatnio zaktualizowano: styczeń 2026

Seria: Przybornik niezależnego dewelopera. Bądź na bieżąco i obserwuj!