grdpwasm - web tabanlı RDP istemcisi
(github.com/nakagami)- Yalnızca tarayıcıyla Windows uzak masaüstüne bağlanabilen web tabanlı bir RDP istemcisidir ve eklenti olmadan çalışır
- Tarayıcıdaki Go WebAssembly ile sunucu tarafındaki WebSocket-to-TCP proxy yapısını ayırarak, tarayıcının doğrudan açamadığı RDP TCP bağlantısını onun yerine işler
- Bağlantı
Browser -> WebSocket -> proxy -> TCP -> RDP Serverakışıyla ilerler; bağlandıktan sonra uzak ekran canvas üzerinde gösterilir ve klavye/fare girdileri aktarılır - Girdi aygıtları, RDP scan codes tabanlı klavye ile hareket, tıklama ve tekerlek desteği olan fareyi destekler; uzak ses ise RDPSND ile alınıp Web Audio API üzerinden oynatılır
- Proxy yapısı tüm origin'lere izin verdiğinden, yalnızca güvenilir bir ağda çalıştırılmalı ya da dışa açmadan önce HTTPS/WSS ve kimlik doğrulama katmanı birlikte eklenmelidir
Proje genel bakışı
- Tarayıcıda eklenti olmadan Windows uzak masaüstüne bağlanan web tabanlı bir RDP istemcisi olarak çalışır
- Uygulama, Go WebAssembly ile grdp birleşimiyle hazırlanmıştır; tarayıcıda çalışan kısım ile proxy ara katmanı birbirinden ayrılmıştır
- Tarayıcı doğrudan raw TCP soketi açamadığı için, WebSocket bağlantısını RDP sunucusunun TCP portuna bağlayan hafif bir Go proxy'si de gereklidir
Mimari ve çalışma şekli
- Genel akış
Browser (WASM) -> WebSocket -> proxy (Go) -> TCP -> RDP Serversırasını izler - Tarayıcıda WASM binary çalışır; proxy ise hem WebSocket-to-TCP köprüsü hem de statik dosya sunucusu görevini üstlenir
make allçıktıları, tarayıcıda çalışanstatic/main.wasm, Go çalışma zamanı destek dosyasıstatic/wasm_exec.jsve proxy sunucusuproxy/proxyolarak ayrılır- Bu yapı sayesinde tarayıcı tarafı bağlantıyı standart web teknolojileriyle yönetirken, RDP sunucusuyla gerçek TCP iletişimini proxy üstlenir
Kullanım akışı ve kullanıcı arayüzü
- Tarayıcıda
http://localhost:8080açılır, bağlantı formuna Host, Port, Domain, User, Password, Width, Height değerleri girilir ve Connect'e basıldığında oturum başlar - Port için varsayılan değer
3389'dur; Domain, yerel hesap kullanıldığında boş bırakılabilir - Bağlantı tamamlandığında uzak masaüstü canvas üzerinde gösterilir ve klavye girdisi almak için canvas'a tıklanması gerekir
- Disconnect'e basıldığında oturum sona erer
Girdi aygıtları ve ses desteği
- Tüm standart klavye girdileri RDP scan codes üzerinden uzak masaüstüne iletilir
- Fare; hareket, düğme tıklamaları ve kaydırma tekerleğini destekler
- Klavye olaylarının iletilmesi için tarayıcı sekmesinin odakta olması gerekir; tuş girdisi durursa canvas alanına yeniden tıklanmalıdır
- Uzak ses, RDPSND üzerinden akış halinde gelir ve tarayıcıda Web Audio API ile oynatılır
- Ses biçimi PCM 44100 Hz, stereo, 16-bit signed little-endian olarak belirtilmiştir
Çalışma koşulları ve güvenlik uyarıları
- Gereksinimler Go 1.24 veya üzeri ile erişilebilir bir RDP sunucusudur; hedef sunucu Windows ya da RDP uyumlu bir ana makine olabilir
- Proxy tüm origin'lerden gelen bağlantılara izin verdiği için yalnızca güvenilir bir ağda çalıştırılmalı veya internete açılmadan önce bir kimlik doğrulama katmanı eklenmelidir
- Kimlik bilgileri tarayıcıdan proxy'ye WebSocket üzerinden iletildiğinden, güvenilmeyen ağlarda HTTPS/WSS kullanılması gerekir
- README ayrıca TLS sonlandırmalı bir reverse proxy olarak nginx veya Caddy kullanımından da bahseder
Çalıştırma biçimi ve ek bilgiler
- Çalıştırma
make serveveya./proxy/proxy -listen :8080 -static staticbiçiminde yapılabilir - Proxy seçeneklerinde
-listendinleme adresi ve portunu,-staticise statik dosya dizinini belirtir - Geliştirme hedefleri; yalnızca WASM'ı yeniden derleyen
make wasm, yalnızca proxy'yi yeniden derleyenmake proxy,wasm_exec.jsdosyasını güncelleyenmake wasm_execve çıktıları temizleyenmake cleanolarak ayrılır - Lisans GPLv3'tür ve birlikte grdp LICENSE referansı da yer alır
2 yorum
Ama gerçekten ne avantajı var, anlamıyorum.
Sonuçta sadece bir istemci; bu yüzden sunucu tarafında herhangi bir gereksinimi zorunlu kılamazsınız.
Üstelik yalnızca saf bir tarayıcıyla da erişilemiyor.
Hacker News yorumları
Oldukça hoş görünüyor. Oturum kaydı ve SSO kimlik doğrulama desteği de eklenirse doğrudan bir RDP jump host olarak kullanılabilir gibi duruyor
Bunu Azure Bastion ile benzer şekilde denemiştim; tenant için yapılandırılmış kimlik doğrulama yöntemiyle Azure portalında oturum açtıktan sonra tarayıcıdan VM'e RDP ile bağlanabiliyor, ardından VM tarafındaki yerel hesapla giriş yapabiliyorsunuz. Dosya ve pano işlemleri de oldukça iyi çalışıyor ve tarayıcı içinde konsol oturumu desteği de var
Windows/RDP tarafını kullanmadığım için orada da çalışıp çalışmadığını bilmiyorum ama GCP'nin tarayıcı üzerinden SSH'i şimdiye kadar gördüklerim arasında en iyi yapılmış olanlardan biriydi
Linux'ta da bazen xrdp'nin diğer alternatiflerden daha iyi olduğunu düşündüm
Bunun çözdüğü en büyük değerlerden biri, VM/sunucunun yönetim arayüzünü ayırmak. Web sunucusunun yönetim hizmetinin HTTP hizmetiyle aynı IP/domain/arayüz üzerinde olmaması bile güvenliği ciddi biçimde artırıyor
Tarayıcı tabanlı RDP'de pano sinsi bir kâbus. Wire protocol pazarlığı kendi başına iyi çalışıyor ama tarayıcı tarafındaki Clipboard API, izinler ve kullanıcı etkileşimi gerekliliklerine bağlı
Okuma tarafında çoğu tarayıcı neredeyse her seferinde kullanıcı onayı istiyor. Bu yüzden ya sayfa içinde ayrı bir pano tamponu oluşturmanız gerekiyor ya da RDP'nin içine yapıştırma sorunsuz oluyor ama RDP'nin dışına kopyalama yaparken her seferinde tıklamayı göze almanız gerekiyor
Hiçbiri insanların web RDP istemcisinden beklediği davranışa tam olarak uymuyor. Bunu native mstsc ile aynı seviyede saymadan önce Chrome ve Firefox'ta nasıl farklı davrandığını mutlaka kontrol etmek gerekir
HP Anyware / Teradici / PCoIP'yi bırakınca alternatif arayan epey kişi oldu. Özellikle yüksek çözünürlüklü çoklu monitör, 60fps, yüksek bit derinliğinde oynatma, Wacom tablet desteği ve üç işletim sisteminin tamamını destekleyen çözümlere ihtiyaç var
Ücretli tarafta Parsec ve DCV var; açık kaynak denemelerini görmek sevindirici. rustdesk, kyber, teraguchi gibi projeler var ve topluluğun yüksek performanslı açık kaynak seçeneklere gerçekten ihtiyacı var gibi görünüyor
https://github.com/rustdesk/rustdesk
https://github.com/thedepartmentofexternalservices/teraguchi
https://kyber.tech/
İlgi çekici görünüyor ama en kritik özelliğin anılmamış olması şaşırtıcı. Pano paylaşımının pratikte ne kadar iyi çalıştığını merak ediyorum
Pano paylaşımı ve paylaşılan sürücüler üzerinden yükleme/indirme, FreeRDP özelliği olduğu için nispeten doğrudan kullanılabiliyor
Ve oturum kaydı, PAM ortamlarında vazgeçilmez
[1] https://adaptive.live
Masaüstü ölçeklendirme, çoklu monitör desteği, dosya aktarımı, sürücü yönlendirme ve çevre birimi yönlendirme de önemli
Bunun, CyberArk PAM'den alınan RDP dosyalarını açarken de çalışıp çalışmadığını merak ediyorum
Tarayıcı sekmesi içinde Alt-Tab'ı RDP istemcisinin yakalayıp yakalayamayacağını da merak ediyorum
Geçmişte Guacamole'un tarayıcı tabanlı RDP'sindeki en büyük sorun buydu
Teknik olarak ilgi çekici ama neredeyse her platformda zaten bir native RDP istemcisi var; o yüzden neden buna ihtiyaç duyulsun pek emin değilim
https://guacamole.apache.org/