WG Panel Bilgi bankası

Bilgi bankası / Yönetici Paneli

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).

OlayAnlamı
host_key_mismatchCiddi. Sunucunun kimliği değişti ve oturum reddedildi. Sunucu yeniden kurulduysa beklenen bir durumdur; değilse araştırılmalıdır.
auth_failedBilet reddedildi. Yanlış yapılandırma ya da saldırı işareti.
close_report_failedPanel 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

Benzer makaleler