Yeni aldığın VPS, kilitlenmemiş bir kapı gibi; dünyadaki tüm script kiddie’ler kapını çalıyor. Bu yazıda o kapıyı nasıl sağlamca kilitleyeceğimizi konuşacağız. Böylece senin "openclaw"ın (yani senin projen) çöp olup dağılmasının önüne geçeceğiz.

0. Başlamadan Önce

Yeni bir VPS aldın, heyecanla IP ve root şifreni kuşandın, peki sonra?

Çok kişinin yaptığı şey şu: dalıp direkt yazılım kurmaya, projeyi deploy etmeye başlamak.

Bu tehlikeli bir alışkanlıktır.

VPS’inin genel bir IP’si var, bu da dünyadaki herkesin ona bağlanmayı deneyebileceği anlamına gelir. Üstelik varsayılan ayarlarda:

  • Port herkese açık 22
  • Kullanıcı adı herkesin bildiği root
  • Geriye seni koruyan tek şey bir şifre kalıyor

Her gün sayısız otomatik script IP bloklarını tarıyor ve yaygın şifrelerle kaba kuvvet (brute-force) saldırıları deniyor. Sunucun yayına girdiği ilk andan itibaren zaten saldırı altında demektir.

O yüzden, VPS’i aldıktan sonra yapman gereken ilk iş yazılım kurmak değil, güvenlik ayarlarını yapmaktır.


1. Hedefimiz

Bu yazının amacı şu:

  • Güvenli uzaktan erişimi kur: SSH anahtarı ile giriş + varsayılan port dışı bir port kullan
  • Standart bir kullanıcı oluştur: root olarak direkt kullanmaktan kaçın
  • Güvenlik duvarını ayarla: Sadece gerekli portları aç
  • Ağ hızlandırmasını aktifleştir: BBR ile ağ bağlantını turbo moda geçir
  • Brute-force saldırılarına karşı önlem al: fail2ban ile kötü niyetli IP’leri otomatik banla

Bunları hallettikten sonra VPS’in sağlam bir temele kavuşur; artık gönül rahatlığıyla istediğin servisi deploy edebilirsin.


2. Planlama ve Düşünme

Neden bu ayarları yapıyoruz?

Yeni aldığın bir VPS, tıpkı anahtar teslimi verilen sıfır bir daire gibidir:

Varsayılan Durum Risk Çözümümüz
root ile doğrudan giriş Yetki çok geniş, kazara zarar verir Normal kullanıcı + sudo
Şifreyle giriş Brute-force saldırısına açık SSH anahtarıyla giriş
Varsayılan 22 portu Tarayıcıların gözdesi Standart dışı porta geç
Güvenlik duvarı kapalı Tüm portlar dışa açık UFW ile sadece gerekli portlar
Doğal ağ Yüksek paket kaybı, gecikme BBR sıkışma kontrolü

Genel Akış

VPS初始化流程

Şu sırayla ilerleyeceğiz, her adımda neden böyle yaptığımızı da açıklayacağım.

3、İşlem Adımları

3.1 İlk Giriş ve Sistem Güncelleme

Sunucu IP’sini Alma

VPS satın aldıktan sonra, sağlayıcı sana şunları verecek:

  • IP adresi: Örneğin 192.168.1.100
  • Port: Genellikle 22 (bazı sağlayıcılar farklı bir port kullanabilir)
  • Kullanıcı adı: Genellikle root
  • Şifre: Rastgele oluşturulmuş bir karakter dizisi

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

SSH ile Bağlanma

Mac / Linux kullanıcıları: Terminali açın ve şunu girin:

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

Windows kullanıcıları:

  • Windows 10/11’de OpenSSH yerleşik olarak gelir, PowerShell veya CMD’de yukarıdaki komutu doğrudan kullanabilirsiniz
  • Ya da Termius, MobaXterm gibi araçları kullanabilirsiniz

İlk bağlantıda parmak izi onay istemi göreceksiniz:

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

Bu size şunu soruyor: “Bu makineyi tanımıyorum, bağlanmak istediğinizden emin misiniz?”

yes yazıp Enter’a basın. Ardından şifrenizi girin (dikkat: yazarken hiçbir karakter görünmez, bu normal bir güvenlik tasarımıdır) ve Enter’a basın.

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

Şuna benzer bir istem görürseniz giriş başarılı demektir:

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

💡 Parmak izini neden doğrulamalıyız?

Bunun sebebi “ortadaki adam saldırılarını” (man-in-the-middle) önlemek. İlk bağlantıda sunucunun parmak izini kaydedersin; sonraki bağlantılarda bu parmak izi değişmişse, bil ki birisi sunucunu taklit etmeye çalışıyor olabilir.

登录成功了

Sunucunla Tanış

Giriş yaptıktan sonra, bu makinenin temel durumuna bir göz atalım:

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

服务器基本信息输出

Bu bilgileri aklında tut, ileride bir sorun çözerken mutlaka lazım olacak.

Sistem Güncelleme

Sunucu bilgilerini öğrendikten sonra, yapacağımız ilk ciddi iş sistemi güncellemek. Yeni sunucuların sistem imajı birkaç ay öncesine ait olabilir ve bu süre zarfında yeni güvenlik yamaları yayınlanmış olabilir:

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

Parametrelerin anlamı:

  • apt update: Paket indeksini günceller
  • apt full-upgrade: Çekirdek (kernel) dahil tüm yazılımları yükseltir
  • -y: Otomatik onaylar, elle “yes” yazmana gerek kalmaz
  • apt autoremove: Artık ihtiyaç duyulmayan bağımlılıkları siler
  • apt autoclean: İndirilen kurulum paketlerinin önbelleğini temizler

apt update 和 apt upgrade 执行过程

⏱️ Bu adım güncelleme miktarına bağlı olarak birkaç dakika sürebilir. Arada bir onay istediğinde, ekranda ne diyorsa genelde o yönde ilerlemek yeterli.

⏱️ Bu adım, güncelleme miktarına bağlı olarak birkaç dakika sürebilir. Arada bazen onay isteyebilir, ekranın söylediği gibi ilerlesen yeterli.

Yeniden Başlatma Gerekiyor mu Kontrol Et

Çekirdek (kernel) güncellemesinden sonra genellikle etkili olması için yeniden başlatma gerekir:

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

是否需要重启

Eğer yeniden başlatma gerektiğine dair bir uyarı çıkarsa:

1
reboot

Yeniden başlatma işleminden sonra tekrar SSH ile bağlanman gerekecek.

Sık Kullanılan Araçları Kur

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

Bu araçlar ne işe yarar:

Araç Kullanım amacı
sudo Normal kullanıcıların yönetici komutlarını çalıştırmasını sağlar
curl / wget Dosya indirme
git Sürüm kontrolü
vim Metin editörü
htop Daha şık bir süreç monitörü
tree Dizin yapısını ağaç şeklinde gösterir
net-tools Ağ araçları (ifconfig, netstat vb.)
ufw Basit ve kullanışlı bir güvenlik duvarı
fail2ban Kaba kuvvet saldırılarına karşı koruma
neofetch Sistem bilgilerini şık bir şekilde gösterir
neofetch 显示的系统信息

3.2 root olmayan kullanıcı oluşturma

Neden doğrudan root kullanmıyoruz?

root kullanıcısının yetkileri çok geniştir, bir anlık dalgınlıkla rm -rf / her şeyi çöpe gidebilir. Günlük işlerde normal bir kullanıcıyı kullanmalısın, yönetici yetkisi gerektiğinde ise sudo komutuna başvurursun.

openclaw denen bir canavar, ona root yetkilerini vermeye nasıl cüret edebiliriz ki?

Kullanıcı oluşturma

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

Sistem sana şifre belirlemeni ve birkaç bilgi girmeni isteyecek:

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

sudo yetkisi verme

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

Hemen doğrulayalım:

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

# 测试 sudo 是否生效
sudo whoami

Çıktıda root görüyorsan, sudo ayarları başarıyla tamamlanmış demektir.
测试sudo

💡 Küçük bir ipucu

exit yazarak tekrar root kullanıcısına dönebilirsin. Bundan sonraki adımlarda ayarları root olarak yapmaya devam edeceğiz, kurulum bitince tekrar normal kullanıcımıza geçeceğiz.


3.3 SSH anahtarı ile giriş yapma ayarları

Anahtar doğrulama mı, şifre doğrulama mı?

SSH密钥认证原理

Anahtar doğrulama, şifreye kıyasla çok daha güvenlidir:

  • Şifreler brute-force saldırılarıyla kırılabilir, ama anahtarları kırmak neredeyse imkansızdır.
  • Her seferinde şifre yazma derdinden kurtulur, işini çok kolaylaştırır.
  • Şifren sızsa bile, özel anahtar (private key) olmadan sisteme girişin imkansızdır.

Adım 1: Yerel makinede anahtar çiftini oluştur

Kendi bilgisayarında (sunucuda değil) şu komutu çalıştır:

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

Şöyle bir çıktı göreceksin:

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

Varsayılan yolu kullanmak için direkt Enter’a bas. Biz burada ./ittinker kullandık, yani dosyanın mevcut dizine ittinker adıyla kaydedilmesini istedik.

1
Enter passphrase (empty for no passphrase):

Anahtarına bir parola belirleyebilirsin (bu ekstra bir güvenlik katmanı olur), ya da boş bırakmak için direkt Enter’a basabilirsin.

本地生成 SSH 密钥的过程

İşlem bittikten sonra ~/.ssh/ dizininde iki dosya göreceksin (bunlar varsayılan dosya adlarıdır, az önce direkt Enter’a basarsan böyle olur):

  • id_ed25519: Özel anahtar (private key), asla sızdırmamalısın!
  • id_ed25519.pub: Açık anahtar (public key), bunu sunucuya yüklemen gerekiyor

💡 ed25519 mu, RSA mı?

ed25519 günümüzde önerilen algoritmadır; eski usul RSA’dan daha güvenlidir ve anahtar boyutu daha kısadır. Sistemin çok eskiyse ve desteklemiyorsa ssh-keygen -t rsa -b 4096 kullanabilirsin.

Küçük bir detay: ed25519 ile üretilen anahtar dosyaları oldukça küçük olurken, RSA’nın dosyaları çok büyüyor. Yapay zekaya sorduğumda öğrendim: dosya boyutunun bir önemi yok, önemli olan kullanılan algoritma.

İkinci adım: Açık anahtarı sunucuya yükle

Yöntem A: ssh-copy-id kullan (önerilen)

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

Sunucu parolanı girdikten sonra, açık anahtarın otomatik olarak sunucuya kopyalanır.

ssh-copy-id 执行成功

Yöntem B: Elle kopyala

Eğer ssh-copy-id çalışmazsa, elle de yapabilirsin:

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

Çıktıyı kopyala (ssh-ed25519 ile başlayan o uzun metni).

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

⚠️ İzinler çok önemli!

SSH dosya izinleri konusunda oldukça katıdır:

  • .ssh dizini: 700 (sadece kullanıcının kendisi erişebilir)
  • authorized_keys dosyası: 600 (sadece kullanıcının kendisi okuyup yazabilir)

İzinleri yanlış ayarlarsan SSH, anahtarla girişi reddeder.

Üçüncü adım: Anahtarla girişi test et

Yeni bir terminal penceresi aç (orijinal pencereyi kapatma, bir şeyleri yanlış yaparsan geri dönmen için can simididir) ve anahtarla girişi test et:

1
ssh ittinker@你的服务器IP

Şifre girmeden giriş yapabiliyorsan, anahtar kurulumu başarılı demektir! 🎉

(Eğer özel anahtarın için bir passphrase belirlediysen, senden bu şifreyi istemesi normaldir)
使用密钥成功登录(无需服务器密码)

Buraya bir -i parametresi ekledik çünkü bu anahtarı varsayılan yola değil, mevcut dizine koyduk. Belirtmezsek sistem varsayılan anahtarı kullanır.


3.4 SSH Güvenliğini Sağlamlaştırma

Anahtarla giriş artık çalıştığına göre, SSH bağlantısını biraz daha sağlamlaştıralım:

  1. Varsayılan portu değiştir (tarayıcılardan kaçınmak için)
  2. Şifreyle girişi devre dışı bırak
  3. root kullanıcısının doğrudan giriş yapmasını engelle

SSH yapılandırma dosyasını düzenle

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

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

修改前

Aşağıdaki ayarları bul ve düzenle (bazıları yorum satırı olarak işaretlenmiş olabilir, başlarındaki # işaretini kaldır):

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

Kaydet ve çık (ctrl + o).

Nano’da kaydetmek için ctrl + o tuşlarına bas, sana dosya adını soracak, direkt Enter’a basıp geç, çıkmak için ise ctrl + x yapıyorsun.

SSH servisini yeniden başlat

1
systemctl restart sshd.service

⚠️ Önemli Uyarı!

Mevcut terminali kapatma! Önce yeni bir pencerede açıp yeni ayarlarla sorunsuz giriş yapabildiğini test et:

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

Giriş yapabiliyorsan eski pencereyi kapatabilirsin. Giriş yapamıyorsan, eski pencerede ayarları düzeltme şansın hâlâ var.

Eğer hafif sunucu (lightweight) aldıysan, büyük ihtimalle bu portu değiştiremezsin; geleneksel ECS’lerde ise bu değişiklik yapılabilir, buna dikkat et.


3.5 UFW güvenlik duvarını yapılandır

UFW防火墙规则

UFW (Uncomplicated Firewall), Ubuntu’nun varsayılan güvenlik duvarı aracıdır; ayarı basittir ama işlevi güçlüdür.

Temel yapılandırma

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'

Güvenlik duvarını etkinleştir

1
ufw enable

Şu uyarıyı göreceksin:

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

Onaylamak için y yaz.

Durumu kontrol et

1
ufw status verbose

ufw status 的输出结果

23022 kısmını yanlış yazmışım, siz kendi durumunuza göre ayarlarsınız, takılmayın buna

Çıktı şu şekilde olmalı:

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)

Sık kullanılan komutlar hızlı rehber

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 BBR hızlandırmasını açma

BBR (Bottleneck Bandwidth and Round-trip propagation time), Google tarafından geliştirilmiş bir TCP tıkanıklık kontrol algoritmasıdır ve ağ performansını ciddi şekilde artırır.

Tek tıkla aç

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

Açılıp açılmadığını doğrulama

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

Çıktı şu olmalı:

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

Çıktı şu şekilde:

1
tcp_bbr    20480  3

💡 BBR’nin etkisi

BBR’yi açtıktan sonra, özellikle ağın dengesiz olduğu veya gecikmenin yüksek olduğu durumlarda şunu net hissedeceksin:

  • İndirme hızı daha hızlı
  • SSH işlemleri daha akıcı
  • Web sayfaları daha hızlı yüklenir

bbr 开启


3.7 fail2ban ile kaba kuvvet saldırılarına karşı koruma

fail2ban logları izler ve birden fazla kez giriş yapamayan IP’leri otomatik olarak banlar.

Temel yapılandırma

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

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

[sshd] kısmını bul ve şu ayarlardan emin ol:

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

Servisleri başlatma

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

# 设置开机自启
systemctl enable fail2ban

Durumu kontrol etme

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

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

fail2ban-client status sshd 的输出

Çıktı şu şekilde görünü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:

Sık kullanılan komutlar

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 [İsteğe bağlı] SSH Config ile birden fazla sunucu yönetimi

Eğer birden fazla sunucun varsa, her seferinde ssh -p 22000 user@ip yazmak oldukça yorucu olabilir. SSH Config kullanarak bu süreci basitleştirebilirsin.

Yapılandırma dosyası

Kendi bilgisayarında ~/.ssh/config dosyasını düzenle:

1
vim ~/.ssh/config

Yapılandırmayı ekle:

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

Kullanımı

Artık doğrudan alias ile bağlanabilirsin:

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

# 连接第二台服务器
ssh vps2

IP, port ve kullanıcı adını ezberleme derdi tamamen bitti!


3.9 [İsteğe bağlı] Sadece Cloudflare erişimine izin verme

Siten tamamen Cloudflare arkasındaysa, güvenliği artırmak için 80/443 portlarına yalnızca Cloudflare IP’lerinin erişmesine izin verecek şekilde ayarlayabilirsin.

⚠️ Dikkat: Bu yapılandırma için alan adının önceden Cloudflare CDN’e bağlanmış olması gerekir.

Otomatik yapılandırma betiği

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

Bu betik şu işlemleri yapar:

  1. Cloudflare’ın resmi sayfasından en güncel IP bloklarını al
  2. UFW kuralı ekle, 80/443 portlarına yalnızca bu IP’lerden erişime izin ver
  3. UFW’yi yeniden yükle

Otomatik güncellemeyi zamanla

Cloudflare’ın IP blokları zamanla değişebilir, bu yüzden haftalık otomatik güncelleme ayarlayalım:

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

3.10 Saat dilimini ayarla

Varsayılan saat dilimi muhtemelen UTC’dir; logları daha kolay okuyabilmen için bulunduğun saat dilimine değiştir:

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

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

# 验证
date

设置时区


3.11 [İsteğe bağlı] Otomatik güvenlik güncellemelerini yapılandır

Sistemin güvenlik yamalarını otomatik kurmasını sağla, böylece her seferinde elle uğraşmak zorunda kalmazsın:

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

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

Otomatik güncellemeleri etkinleştirmek için “Yes” seçeneğini işaretle.

💡 Bu özellik yalnızca güvenlik güncellemelerini otomatik kurar; sistemi yeni bir ana sürüme yükseltmez, yani oldukça güvenli bir yöntemdir.


4. Özet

Başlatma kontrol listesi

Yukarıdaki yapılandırmaları tamamladıktan sonra, her şeyin yerinde olduğundan emin olmak için şu listeyi bir gözden geçir:

Kontrol Adımı Komut Beklenen Sonuç
Sistem güncel apt update && apt list --upgradable Yükseltilecek paket yok
Sudo yetkisi çalışıyor sudo whoami root çıktısı
Anahtar girişi çalışıyor ssh yourname@ip -p port Şifresiz giriş
Şifre girişi devre dışı grep PasswordAuth /etc/ssh/sshd_config PasswordAuthentication no
SSH portu değiştirildi grep Port /etc/ssh/sshd_config Ayarladığın port
Güvenlik duvarı aktif ufw status Status: active
BBR etkin sysctl net.ipv4.tcp_congestion_control = bbr
fail2ban çalışıyor systemctl status fail2ban active (running)
Zaman dilimi ayarlandı timedatectl Asia/Shanghai veya senin zaman dilimin
Yerel SSH Config cat ~/.ssh/config Sunucu takma adı yapılandırıldı

Önemli Dosya Konumları

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

Güvenlik İçin En İyi Pratikler

  1. Sistemi düzenli güncelle: apt update && apt upgrade
  2. Giriş loglarını düzenli kontrol et: lastb (başarısız girişler), last (başarılı girişler)
  3. fail2ban ban durumunu takip et
  4. Önemli yapılandırma dosyalarını değiştirmeden önce yedek al

5. Sorun Giderme

S1: Anahtar girişi başarısız, hâlâ şifre mi istiyor?

Olası nedenler:

  1. Yetki sorunu (en yaygını)

    1
    2
    3
    # 检查并修复权限
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
  2. Public key doğru kopyalanmamış

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

    1
    restorecon -Rv ~/.ssh

Q2: Portu değiştirince bağlanamıyor musun?

Çözüm adımları:

  1. Yeni portun güvenlik duvarında (firewall) açıldığından emin ol:

    1
    ufw status | grep 你的端口
  2. SSH ayarlarının doğru olduğundan emin ol:

    1
    grep Port /etc/ssh/sshd_config
  3. SSH servisinin çalıştığından emin ol:

    1
    systemctl status sshd
  4. Hala bağlanamıyorsan, bulut sağlayıcısının VNC/konsolu üzerinden giriş yapıp düzelt.

Q2.5: Port değişikliği hiç mi işe yaramadı? (Bulut sağlayıcılarının hafif sunucuları)

Belirti: /etc/ssh/sshd_config değiştirdin, servisi yeniden başlattın ama 22 portu hâlâ açık, yeni port devreye girmedi.

Teşhis yöntemi:

bash

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

Çıktı şu tarzdaysa:

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

22 portunun init (PID 1) tarafından dinlendiğini, yani sshd sürecinin değil, anlamına gelir.

Nedeni: Bazı bulut sağlayıcılarının “hafif uygulama sunucuları” veya “konteyner örnekleri” SSH bağlantılarını platform katmanında proxy üzerinden yönetir. Yani sunucunun içindeki sshd ayarlarını değiştirmenin hiçbir etkisi olmaz.

Çözüm:

Örnek Türü SSH Portunu Değiştirme Yöntemi
Geleneksel ECS sshd_config dosyasını düzenle ✅
Hafif Sunucu Bulut kontrol panelinden değiştirmen gerekebilir ya da hiç desteklenmeyebilir
Konteyner Örneği Genellikle değiştirilemez

Eğer instance’ında portu değiştiremiyorsan, diğer güvenlik önlemleri çok daha kritik hale gelir:

  • ✅ Standart bir kullanıcı oluştur + root girişini kapat
  • ✅ SSH anahtarı ile giriş yap + şifreli girişi devre dışı bırak
  • ✅ Brute-force saldırılarına karşı fail2ban kullan

Bunları eksiksiz yaparsan, güvenlik seviyen yine de oldukça yüksek olur.

Q3: fail2ban beni kendi IP’mden mi banladı?

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

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

Q4: UFW’yi açtıktan sonra siteye erişemiyor musun?

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

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

Q5: Komut çalıştırınca sudo bulunamadı hatası mı alıyorsun?

Debian minimal kurulumlarda sudo yüklü gelmeyebilir. root olarak giriş yapıp şunu yükleyebilirsin:

1
2
apt install sudo
usermod -aG sudo ittinker

6. Tek tıkla başlatma betiği (Alıştıktan sonra kullan)

Eğer yukarıdaki adımlara artık iyice alıştıysan, bu betiği kullanarak sunucunu hızlıca baştan kurabilirsin.

⚠️ Dikkat: Betiği çalıştırmadan önce SSH public key’inin hazır olduğundan emin ol.

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. Bunları yaptıktan sonra güvenlik ne kadar arttı?

Adım Ne yaptık? Neden önemli?
Sistem güncelleme En son yamaları kurduk Bilinen açıkları kapattık
Yeni kullanıcı oluşturma Artık root’u doğrudan kullanmıyoruz Yanlışlıkla yapılacak işlemlerin riskini azaltır
SSH anahtarı Şifre yerine anahtarla girişe geçtik Brute-force ile kırılamaz
Port değiştirme Varsayılan 22 portundan uzaklaştık Taranıp bulunma olasılığını düşürür
Şifre girişini devre dışı bırakma Sadece anahtarla girişe izin verdik Şifre saldırılarını tamamen ortadan kaldırır
Root girişini devre dışı bırakma root artık doğrudan giriş yapamıyor Saldırı zorluğunu artırır
UFW güvenlik duvarı Sadece gerekli portları açtık Saldırı yüzeyini daraltır
BBR hızlandırma Ağ performansını optimize ettik Erişim hızını artırır
fail2ban Kötü niyetli IP’leri otomatik banladık Sürekli saldırıları engeller

Bunları hallettikten sonra, sunucunun güvenliği VPS’lerin %90’ını geride bırakıyor demektir.


Sıradaki yazıdan haberler

Sıradaki yazıda SSH anahtarı ile giriş yapılandırması hızlı rehberi konusunu ele alacağız ve şu konuları daha detaylıca inceleyeceğiz:

  • Farklı işletim sistemlerinde anahtar oluşturma yöntemleri
  • Birden fazla anahtarı yönetme
  • SSH Agent yapılandırması
  • Yaygın SSH istemcisi ayarları

Yazının son güncellenme tarihi: Ocak 2026

Bağımsız geliştirici araç kutusu serisi, takipte kal!