VPS baru beli itu ibarat pintu yang gak dikunci, anak-anak script kiddie dari seluruh dunia lagi nyoba ngetuk. Artikel ini bakal ngajarin kamu buat ngunci pintu itu rapat. Biar “lobak laut” (openclaw) kamu gak kabur ke mana-mana dan nggak ngelakuin hal aneh-aneh.

0. Sekilas Pengantar

Baru aja beli VPS, keburu semangat ngedapetin IP dan password root, terus apa lagi nih?

Kebanyakan orang langsung ngelakuin ini: buru-buru install software, langsung deploy proyek.

Ini kebiasaan yang bahaya.

VPS kamu punya IP publik, artinya siapa aja di seluruh dunia bisa nyoba nyambungin ke situ. Dan dengan konfigurasi default-nya:

  • Port 22-nya kebuka untuk umum
  • Username-nya root yang udah rahasia umum
  • Cuma nyisain satu password buat jadi penjaga

Setiap hari ada banyak banget skrip otomatis yang nyiap-nyiap IP, nyoba brute-force pake password-password umum. Dari detik pertama server kamu online, itu udah pada nyerang.

Jadi, hal pertama yang harus kamu lakuin abis dapet VPS bukan install software, tapi ngelakuin inisialisasi keamanan.


1. Target yang Dicapai

Target dari artikel ini adalah:

  • ✅ Bangun akses remote yang aman: login SSH pakai key + bukan port default
  • ✅ Bikin user biasa: hindari pakai root langsung
  • ✅ Setup firewall: buka port yang perlu aja
  • ✅ Aktifkan akselerasi jaringan: BBR bikin koneksi makin ngebut
  • ✅ Cegah brute force: fail2ban auto-blokir IP jahat

Kalau semua udah beres, VPS kamu punya fondasi yang kuat buat deploy macem-macem service dengan tenang.


2. Rencana & Pemikiran

Kenapa mesti setup gini?

VPS yang baru dibeli itu ibarat rumah kosongan baru diserahin:

Kondisi Default Risiko Solusi Kita
Login langsung root Hak akses kelewat besar, risiko fatal kalau salah klik Bikin user biasa + sudo
Login pakai password Rawan di-brute force Login pakai SSH Key
Port default 22 Jadi incaran scanner Ganti ke port non-standar
Firewall dimatikan Semua port terekspos ke luar UFW: cuma buka port yang dipakai
Jaringan bawaan Packet loss tinggi, latency besar Algoritma kontrol kongesti BBR

Alur Kerja Keseluruhan

VPS初始化流程

Kita ngopreknya ngikut urutan ini, dan di tiap langkah aku jelasin kenapa kita lakuin begini.

3. Langkah-langkah Eksekusi

3.1 Login Pertama Kali & Update Sistem

Dapetin IP Server

Setelah beli VPS, provider bakal ngasih kamu:

  • Alamat IP: contohnya 192.168.1.100
  • Port: biasanya 22 (beberapa provider kadang ubah ke port lain)
  • Username: umumnya root
  • Password: deretan karakter acak yang sudah di-generate

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

Koneksi SSH

Pengguna Mac / Linux: buka Terminal, langsung ketik:

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

Pengguna Windows:

  • Windows 10/11 udah bawaan OpenSSH, jadi kamu bisa langsung pakai perintah di atas di PowerShell atau CMD
  • Atau pakai tools kayak Termius, MobaXterm, dll.

Saat pertama kali connect, nanti muncul prompt konfirmasi fingerprint kayak gini:

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

Intinya dia nanya: “Aku belum kenal mesin ini, kamu yakin mau connect?”

Ketik yes lalu tekan Enter. Terus masukkan password (catatan: pas ngetik nggak ada karakter yang muncul, ini fitur keamanan normal kok), lalu Enter.

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

Kalau kamu lihat prompt kayak gini, berarti login berhasil:

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

💡 Kenapa harus cek fingerprint?

Ini untuk mencegah “serangan man-in-the-middle”. Saat pertama kali connect, catat fingerprint server. Nanti kalau pas connect lagi fingerprint-nya berubah, berarti ada kemungkinan orang lain menyamar sebagai server kamu.

登录成功了

Kenalan dengan server kamu

Setelah login, cek dulu kondisi dasar mesin ini:

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

服务器基本信息输出

Catat info-info ini, nanti berguna banget buat nge-trouble shooting kalau ada masalah.

Update sistem

Sudah ngerti kondisi servernya? Langkah pertama yang paling penting adalah update sistem. Image sistem di server baru mungkin masih versi dari beberapa bulan lalu, dan bisa jadi sudah ada patch keamanan yang rilis sejak itu:

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

Penjelasan parameter:

  • apt update: Update indeks paket software
  • apt full-upgrade: Upgrade semua software, termasuk kernel
  • -y: Auto-confirm, jadi nggak perlu ketik “yes” manual
  • apt autoremove: Hapus dependency yang udah nggak kepakai
  • apt autoclean: Bersihin cache installer yang udah di-download

apt update 和 apt upgrade 执行过程

⏱️ Langkah ini mungkin butuh beberapa menit, tergantung seberapa banyak update-nya. Kadang di tengah-tengah ada konfirmasi, tinggal ikutin aja arahannya.

Cek apakah perlu reboot

Setelah update kernel, biasanya butuh reboot biar perubahannya berlaku:

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

是否需要重启

Kalau ada notifikasi untuk reboot:

1
reboot

Setelah reboot, kamu perlu connect SSH lagi.

Install tools yang sering dipakai

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

Fungsi tools ini buat apa sih:

Tool Fungsi
sudo Bikin user biasa jalanin command admin
curl / wget Download file
git Version control
vim Text editor
htop Process monitor yang lebih cakep
tree Tampilin struktur direktori pohon
net-tools Network tools (ifconfig, netstat, dll)
ufw Firewall simpel dan gampang dipakai
fail2ban Anti brute-force
neofetch Tampilin info sistem dengan cakep
neofetch 显示的系统信息

3.2 Membuat user non-root

Kenapa nggak langsung pakai root?

Izin user root itu terlalu luas, sedikit salah klik rm -rf / semua bisa hilang seketika. Untuk operasi sehari-hari, mendingan pakai user biasa. Kalau butuh izin admin, baru gunakan sudo.

Lobster (openclaw) itu ibarat monster, masa sih berani kasih akses root ke dia?

Membuat user

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

Sistem bakal minta kamu buat set password dan ngisi beberapa 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 创建用户的完整交互过程

Ngasih izin sudo

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

Coba dicek dulu:

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

# 测试 sudo 是否生效
sudo whoami

Kalau output-nya root, berarti konfigurasi sudo-nya udah berhasil.
测试sudo

💡 Tips Kecil

Ketik exit buat balik lagi ke user root. Untuk langkah-langkah selanjutnya, kita tetap pakai root buat konfigurasi, nanti setelah kelar baru balik lagi ke user biasa.


3.3 Setup login SSH pakai SSH Key

Autentikasi Key vs Autentikasi Password

SSH密钥认证原理

Autentikasi pakai key jauh lebih aman dibanding password:

  • Password bisa di-brute force, tapi key nyaris mustahil
  • Nggak perlu input password tiap kali login, jauh lebih praktis
  • Biarpun password bocor, selama nggak punya private key tetep nggak bakal bisa login

Langkah 1: Bikin pasangan key di lokal

Jalankan ini di komputer kamu (bukan di server):

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

Nanti bakal muncul prompt kayak gini:

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

Tinggal tekan Enter aja buat pakai path default. Di sini kita pakai ./ittinker, artinya filenya bakal disimpen di folder saat ini dengan nama ittinker.

1
Enter passphrase (empty for no passphrase):

Kamu bisa set passphrase buat kunci ini (bikin ada lapisan keamanan ekstra), atau langsung tekan Enter buat dikosongin.

本地生成 SSH 密钥的过程

Setelah selesai dibikin, kamu bakal nemu dua file di direktori ~/.ssh/ (ini nama file default-nya kalau tadi kamu tekan Enter):

  • id_ed25519: Private key, jangan sampai bocor ke siapa pun ya!
  • id_ed25519.pub: Public key, ini yang harus di-upload ke server.

💡 ed25519 vs RSA

ed25519 ini algoritma yang paling direkomendasiin sekarang. Dibanding RSA jadul, ini lebih aman dan ukuran kuncinya lebih pendek. Tapi kalau sistem kamu terlalu lawas dan belum mendukung, bisa pakai ssh-keygen -t rsa -b 4096.

Sedikit trivia: kunci yang dibikin ed25519 itu ukurannya kecil, sedangkan file RSA itu gedean banget. Waktu itu aku tanya ke AI baru tau, ternyata ukuran file nggak masalah, itu cuma beda algoritma aja.

Langkah Kedua: Upload Public Key ke Server

Cara A: Pakai ssh-copy-id (Direkomendasiin)

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

Setelah masukin password, public key bakal otomatis tersalin ke server.

ssh-copy-id 执行成功

Cara B: Salin Manual

Kalau ssh-copy-id nggak bisa dipakai, kamu bisa ngelakuinnya secara manual:

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

Copy isi output-nya (teks panjang yang diawali dengan 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

⚠️ Permission itu penting banget!

SSH itu ketat soal permission file:

  • Direktori .ssh: 700 (cuma user sendiri yang bisa akses)
  • File authorized_keys: 600 (cuma user sendiri yang bisa baca dan tulis)

Kalau permission-nya nggak pas, SSH bakal nolak buat login pake kunci.

Langkah Ketiga: Tes Login Pake Kunci

Buka jendela terminal baru (biarin jendela lama tetap kebuka, jangan ditutup, jaga-jaga kalau konfigurasinya salah masih bisa dibenerin), terus coba tes login pake kunci:

1
ssh ittinker@你的服务器IP

Kalau kamu bisa login tanpa dimintain password, berarti konfigurasi kuncinya udah berhasil! 🎉

(Mungkin kamu bakal dimintain password kunci kalau tadi nyetting passphrase buat private key-nya, ini normal kok)
使用密钥成功登录(无需服务器密码)

Di sini kita nambahin parameter -i, soalnya kunci ini bukan disimpen di path default, tapi di path saat ini. Kalau nggak ditentuin, sistem bakal make kunci default.


3.4 Ngerapatkan Keamanan SSH

Sekarang login pake kunci udah jalan, ayo kita keraskan keamanan SSH-nya:

  1. Ubah port default (biarin nggak gampang ke-scan)
  2. Matiin login pake password
  3. Larang root buat login langsung

Edit konfigurasi SSH

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

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

修改前

Cari dan ubah konfigurasi berikut (beberapa mungkin di-comment, jadi hapus tanda # di depannya):

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

Simpan dan keluar (ctrl + o).

Di Nano, cara simpannya tekan ctrl + o, nanti bakal dimintain nama file, langsung tekan Enter aja. Kalau mau keluar, tekan ctrl + x.

Restart service SSH

1
systemctl restart sshd.service

⚠️ Penting!

Jangan tutup terminal yang sekarang! Tes dulu konfigurasi barunya di jendela baru, bisa login normal nggak:

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

Kalau bisa login, baru tutup jendela yang lama. Kalau nggak bisa masuk, kamu masih bisa perbaiki konfigurasinya di jendela lama.

Kalau kamu beli server tipe lightweight, kemungkinan besar port ini nggak bisa diganti. Kalau ECS tradisional biasanya bisa diubah, jadi perhatikan ya.


3.5 Setup Firewall UFW

UFW防火墙规则

UFW (Uncomplicated Firewall) itu tool firewall bawaan Ubuntu, settingnya gampang tapi fiturnya powerful.

Konfigurasi dasar

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'

Aktifkan firewall

1
ufw enable

Nanti muncul prompt kayak gini:

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

Ketik y buat konfirmasi.

Cek status

1
ufw status verbose

ufw status 的输出结果

23022 itu typo saya, kalian sesuaikan saja pakai nilai masing-masing ya

Output-nya kira-kira begini:

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)

Cheat Sheet Perintah yang Sering Dipakai

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 Mengaktifkan BBR untuk Mempercepat Koneksi

BBR (Bottleneck Bandwidth and Round-trip propagation time) itu algoritma kontrol kemacetan TCP buatan Google, bisa ningkatin performa jaringan kamu secara signifikan.

Aktifkan Sekali Klik

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

Cek Apakah Sudah Aktif

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

Output-nya harusnya:

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

Output-nya kira-kira begini:

1
tcp_bbr    20480  3

💡 Efek BBR

Setelah BBR aktif, apalagi kalau jaringannya lagi nggak stabil atau ping-nya tinggi, kamu bakal langsung ngerasain:

  • Kecepatan download makin ngebut
  • Operasi SSH jadi lebih mulus
  • Loading halaman web jadi lebih cepat

bbr 开启


3.7 Setup fail2ban buat Cegah Brute Force

fail2ban ini bakal ngawasin log server kamu, kalau nemu IP yang gagal login berkali-kali, bakal otomatis di-ban.

Konfigurasi Dasar

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

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

Cari bagian [sshd], pastikanin konfigurasinya kayak gini:

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

Menjalankan service

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

# 设置开机自启
systemctl enable fail2ban

Cek status

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

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

fail2ban-client status sshd 的输出

Output-nya kira-kira kayak gini:

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:

Perintah yang sering dipakai

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 [Opsional] Kelola banyak server pakai SSH Config

Kalau kamu punya banyak server, capek banget kan harus ketik ssh -p 22000 user@ip tiap kali mau connect? Kamu bisa sederhanain pakai SSH Config.

File konfigurasi

Edit ~/.ssh/config di komputer lokal kamu:

1
vim ~/.ssh/config

Tambahin konfigurasi ini:

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

Cara pakainya

Sekarang kamu bisa langsung connect pakai alias:

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

# 连接第二台服务器
ssh vps2

Gak perlu lagi pusing hafalin IP, port, atau username!


3.9 [Opsional] Izinin akses cuma dari Cloudflare

Kalau web kamu sepenuhnya ada di belakang Cloudflare, kamu bisa atur biar port 80/443 cuma bisa diakses oleh IP Cloudflare. Ini bakal nambah lapisan keamanan ekstra.

⚠️ Catatan: Konfigurasi ini wajib domain kamu udah diarahin ke Cloudflare CDN dulu.

Script konfigurasi otomatis

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

Script ini bakal:

  1. Ambil rentang IP terbaru langsung dari Cloudflare
  2. Tambahkan aturan UFW, cuma izinin IP ini buat akses port 80/443
  3. Reload UFW

Atur pembaruan otomatis

Rentang IP Cloudflare bisa berubah, jadi atur saja biar auto-update tiap minggu:

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

3.10 Atur zona waktu

Zona waktu default-nya kemungkinan UTC. Ubah ke zona waktu lokalmu biar gampang pas baca log:

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

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

# 验证
date

设置时区


3.11 [Opsional] Atur auto security update

Biar sistem otomatis pasang security patch, repot banget kalau harus manual terus:

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

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

Pilih “Yes” buat aktifin auto-update.

💡 Fitur ini otomatis pasang security update doang, nggak akan otomatis upgrade ke major version yang baru, jadi lumayan aman.


4. Kesimpulan

Checklist inisialisasi

Setelah kelar ngelakuin konfigurasi di atas, cek sekali lagi pakai checklist ini:

Hal yang Dicek Perintah Hasil yang Diharapkan
Sistem sudah di-update apt update && apt list --upgradable Tidak ada paket yang bisa di-upgrade
User biasa bisa sudo sudo whoami Output root
Login pakai SSH key berfungsi ssh yourname@ip -p port Login tanpa perlu password
Login pakai password sudah dimatikan grep PasswordAuth /etc/ssh/sshd_config PasswordAuthentication no
Port SSH sudah diganti grep Port /etc/ssh/sshd_config Port yang kamu set sendiri
Firewall sudah aktif ufw status Status: active
BBR sudah diaktifkan sysctl net.ipv4.tcp_congestion_control = bbr
fail2ban sedang berjalan systemctl status fail2ban active (running)
Zona waktu sudah diatur timedatectl Asia/Shanghai atau zona waktu kamu
SSH Config lokal cat ~/.ssh/config Alias server sudah dikonfigurasi

Lokasi File Penting

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

Praktik Keamanan Terbaik

  1. Update sistem secara rutin: apt update && apt upgrade
  2. Cek log login secara berkala: lastb (login gagal), last (login berhasil)
  3. Pantau status ban dari fail2ban
  4. Backup dulu file konfigurasi penting sebelum diubah

5. Catatan Masalah

Q1: Login SSH key gagal, tetap diminta password?

Kemungkinan penyebabnya:

  1. Masalah izin (paling sering terjadi)

    1
    2
    3
    # 检查并修复权限
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
  2. Public key tidak tersalin dengan benar

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

    1
    restorecon -Rv ~/.ssh

Q2: Setelah ganti port, tiba-tiba nggak bisa konek?

Langkah pengecekan:

  1. Pastikan port baru sudah dibuka di firewall:

    1
    ufw status | grep 你的端口
  2. Pastikan konfigurasi SSH sudah benar:

    1
    grep Port /etc/ssh/sshd_config
  3. Pastikan service SSH sedang berjalan:

    1
    systemctl status sshd
  4. Kalau bener-bener nggak bisa konek sama sekali, gunakan VNC/konsol dari penyedia cloud kamu untuk login dan memperbaikinya.

Q2.5: Ganti port tapi sama sekali nggak berlaku? (Server Lite cloud provider)

Gejala: Udah ubah /etc/ssh/sshd_config, tapi setelah service direstart port 22 masih aktif dan port barunya nggak kunjung berlaku.

Cara diagnosa:

bash

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

Kalau outputnya mirip kayak gini:

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

Berarti port 22 masih didengarkan oleh init (PID 1), bukan oleh proses sshd.

Alasannya: SSH di “Light Application Server” atau “Container Instance” dari sebagian cloud provider di-proksi langsung di tingkat platform, jadi konfigurasi sshd di dalam server kamu nggak akan berefek.

Solusinya:

Tipe Instance Cara Ganti Port SSH
ECS Tradisional Edit sshd_config ✅
Light Server Mungkin harus diubah via console cloud, atau malah nggak didukung sama sekali
Container Instance Biasanya nggak didukung untuk diganti

Kalau instance kamu nggak mendukung ganti port, langkah keamanan lain jauh lebih penting:

  • ✅ Bikin user biasa + matikan login root
  • ✅ Login pakai SSH key + matikan login pakai password
  • ✅ Pakai fail2ban buat nangkal brute force

Kalau langkah-langkah ini udah di-handle dengan bener, keamanan server kamu tetap terjaga kok.

Q3: fail2ban malah nge-blok IP sendiri?

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

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

Q4: Setelah UFW diaktifin, web jadi nggak bisa diakses?

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

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

Q5: Pas ngejalanin command malah ketemu error “sudo not found”?

Debian minimal install kadang nggak include sudo, jadi install dulu pake root:

1
2
apt install sudo
usermod -aG sudo ittinker

6. Script inisialisasi sekali jalan (dipake kalau udah paham)

Kalau kamu udah paham dan terbiasa sama langkah-langkah di atas, tinggal pake script ini buat inisialisasi server dengan cepat.

⚠️ Catatan: Sebelum menjalankan skrip, pastikan kamu sudah siapin SSH public key-nya ya.

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. Setelah ngelakuin semua ini, seberapa aman sih server-nya?

Langkah Apa yang dilakukan Kenapa penting
Update sistem Install patch terbaru Nutup celah keamanan yang udah diketahui
Bikin user baru Ngga langsung pake root lagi Ngurangin risiko salah ketik/klik
SSH Key Ganti password pake kunci Anti di-brute force
Ganti port Ngumpet dari port default 22 Ngurangin peluang ke-scan
Matikan login password Cuma boleh login pake kunci Stop serangan password secara total
Matikan root Root ngga bisa langsung login Bikin penyerang susah masuk
Firewall UFW Buka port yang penting aja Ngurangin titik rawan serangan
BBR Acceleration Optimalkan performa jaringan Bikin akses makin ngebut
fail2ban Auto-banned IP jahat Nangkal serangan yang terus-terusan

Kalau semua langkah di atas udah kamu lakuin, tingkat keamanan server kamu udah ngalahin 90% VPS lain di luar sana.


Sneak Peek Artikel Selanjutnya

Di artikel selanjutnya kita bakal bahas Cepat Setup SSH Key Login, bakal dibahas lebih detail nih:

  • Cara bikin kunci di berbagai sistem operasi
  • Manajemen beberapa kunci sekaligus
  • Setup SSH Agent
  • Settingan SSH client yang sering dipake

Artikel ini terakhir diperbarui: Januari 2026

Seri kotak peralatan indie developer, follow yuk!