SSH geçidi kurulumu (tarayıcı terminali)
Geçit nedir, neden ayrı çalışır
Tarayıcı terminali, panelden ayrı bir servis üzerinden çalışır. Sebebi mimaridir: PHP istek/yanıt modelidir, SSH ise saatlerce açık kalan çift yönlü bir akıştır. Terminali panelin içinde tutmak, her açık oturum için bir PHP işçisini rehin almak demekti; birkaç müşteri terminal açtığında panelin kendisi yanıt veremez hâle gelirdi.
Geçit yapılandırılmadıkça terminal özelliği kapalıdır ve müşterilere düğme hiç gösterilmez. Yarım kurulumda çalışmayan bir düğme göstermemek için bilinçli olarak böyledir.
Kurulum
Geçit dosyaları panel dizinindeki gateway/ klasöründedir.
Ayrı bir sunucuya kopyalanması önerilir.
cd gateway
npm install --omit=dev
cp .env.example .env
İki sır üretin (birbirinden farklı olmalı):
php -r "echo bin2hex(random_bytes(32)), PHP_EOL;"
Panelin .env dosyasına:
SSH_GATEWAY_URL=wss://terminal.ornek.com
SSH_GATEWAY_SECRET=<birinci sir>
SSH_GATEWAY_TOKEN=<ikinci sir>
SSH_GATEWAY_ALLOWED_IPS=203.0.113.10
Geçidin .env dosyasına:
PANEL_URL=https://panel.ornek.com
GATEWAY_TOKEN=<ikinci sir — panelinkiyle AYNI>
Ardından php artisan config:cache çalıştırın.
İki sır neden ayrı
- SSH_GATEWAY_SECRET müşteriye verilen bileti imzalar.
- SSH_GATEWAY_TOKEN geçidin panele kimliğini kanıtlar.
Tek sır olsaydı, tarayıcıda görünen bileti ele geçiren biri doğrudan panelin bilet bozdurma ucuna gidip sunucunun özel anahtarını alabilirdi. İkisi ayrı olduğu için bilet, tek başına hiçbir işe yaramaz.
APP_KEY bilinçli olarak kullanılmaz: geçit ayrı bir makinede
çalışır ve ona verilen sır, panelin bütün şifreli verilerini açan anahtar
olmamalıdır.
Ters vekil ayarı
Geçit yalnızca 127.0.0.1 dinler; TLS'i nginx bitirir. Terminal
oturumları saatlerce sessiz kalabildiği için zaman aşımlarını uzatın:
proxy_read_timeout 4h;
proxy_send_timeout 4h;
Varsayılan 60 saniyelik değer, açık ama sessiz oturumları koparır.
Host anahtarı doğrulaması — bugünkü durum
Hedeflenen davranış, sunucunun kimliğinin kurulum sırasında kaydedilip her bağlantıda doğrulanmasıydı. O kanal henüz kurulu değil. Bugün uygulanan davranış:
- İlk bağlantıda görülen kimlik panele yazılır (sabitleme).
- Sonraki her bağlantıda birebir doğrulanır; uymazsa oturum açılmaz.
- Sabitlenmiş bir kimliğin üzerine yazılamaz.
Açık pencere yalnızca ilk bağlantıdır. Tamamen kapatmak için geçidin
.env dosyasında GATEWAY_HOST_KEY_POLICY=strict
kullanılabilir; bu durumda kimliği önceden kayıtlı olmayan hiçbir sunucuya
bağlanılamaz.
İzlenmesi gereken günlük kayıtları
Geçit her satırı tek bir JSON nesnesi olarak yazar
(journalctl -u wg-panel-ssh-gateway).
| Olay | Anlamı |
|---|---|
host_key_mismatch | Ciddi. Sunucunun kimliği değişti ve oturum reddedildi. Sunucu yeniden kurulduysa beklenen bir durumdur; değilse araştırılmalıdır. |
auth_failed | Bilet reddedildi. Yanlış yapılandırma ya da saldırı işareti. |
close_report_failed | Panel oturum kapanışını alamadı. Kayıt zamanlanmış görevle toparlanır. |
Oturum kayıtları
Her terminal oturumu için tutulanlar: hizmet, müşteri, bağlanan IP, başlangıç/bitiş zamanı ve aktarılan veri miktarı. Komut içerikleri kaydedilmez.
Geçit çökerse bazı oturumlar kapanmadan kalabilir;
wgpanel:ssh:prune zamanlanmış görevi bunları beş dakikada bir
toparlar. Bu görevin çalışması için sunucuda Laravel zamanlayıcısının kurulu
olması gerekir:
* * * * * cd /panel/dizini && php artisan schedule:run >> /dev/null 2>&1