Portál AbcLinuxu, 8. května 2025 01:12
Snažím se na svém PC rozchodit vzdálenou plochu přes VNC, se zabezpečením, aby to bylo bezpečné i při použití přes internet a současně abych se vyhnul použití rovnáku na ohýbák v podobě SSH tunelu. Nainstaloval jsem si tigervnc
, nastavil podle návodu a spustil takto:
vncserver -SecurityTypes X509Vnc -X509Key /home/paul/.vnc/orange_vnc.pem -X509Cert /home/paul/.vnc/orange_vnc.crt -geometry 1920x1080Certifikáty jsem si vygeneroval sám. VNC server se spustí, jenže z aplikace Remmina se nejsem schopen připojit - chce to po mě certifikát klienta. Ani z jiných klientů co jsem zkusil se mi připojit nedařilo. Zajímavé je že z Androidu pomocí aplikace bVNC se připojím, stačilo napoprvé certifikát ručně potvrdit (ale to je jediná aplikace, která funguje).
Pokud však VNC spustím bez zabezpečení:
vncserver -SecurityTypes VncAuth -geometry 1920x1080tak to funguje. Tak kde je problém? V nastavení serveru nebo v klientech?
Řešení dotazu:
<off_topic>Předně doporučuji místo VNC použít Spice (například pomocí x11spice
). To je o galaxii nebo dvě modernější protokol. Navíc nemá tolik problémů a nekompatibilit kolem SSL. Klient je třeba spicy
a server je (pro připojení k existujícímu X11) třeba x11spice --allow-control --display :0 --hide --generate-password 'localhost:5900'
. Samozřejmě je i spousta možností, jak vytvářet vzdálené virtuální desktopy bez „fyzického“ X-serveru, stejně jako u VNC.</off_topic>
Zpět k VNC:
Já bych se na to … a prostě bych se připojil přes rovnák na ohýbák, tedy SSH. Nastavil bych si tunel (ssh -f -C -N -L '[::1]:<port na klientovi>:[::1]:<port na serveru>' můj.server.kdovíkde
) a basta. Tohle vyřeší (tedy, obejde) všechny možné problémy s nastavením VNC zabezpečení na serverech i klientech. Další plus: Server lze pak jednoduše omezit na localhost
a nemít otevřený VNC port externě.
Aby se to spojení nemuselo navazovat manuálně a aby se automaticky obnovovalo při změně síťového připojení, jako systemd
unit to může vypadat třeba takto:
[Unit] Description=VNC SSH Tunnel ConditionPathExists=|/home/vncclient/.ssh/id_rsa After=network.target [Servicev] User=vncclient ExecStart=/usr/bin/ssh -C -N -T \ -o ServerAliveInterval=10 \ -o ServerAliveCountMax=3 \ -o ExitOnForwardFailure=yes \ -o ConnectTimeout=15 \ -i /home/vncclient/.ssh/id_rsa \ -L [::1]:5900:[::1]:5900 \ vncserver@můj.server.kdovíkde RestartSec=3 Restart=always [Install] WantedBy=multi-user.target
Jakmile jsou náležitě nakonfigurované uživatelské účty, stačí to^^^ už jenom dát třeba do /etc/systemd/system/vnc-tunnel.service
a pak spustit systemctl daemon-reload
a systemctl enable --now vnc-tunnel
.
Uživatel vncserver
na serveru samozřejmě musí mít náležitý veřejný klíč ve svém ~/.ssh/authorized_keys
a je dobré takového speciálního uživatele všemožně omezit, aby skoro nic nesměl. Drobné mínus je, že vncclient
na klientovi musí mít soukromý SSH klíč v plaintextu, pokud člověk nechce moc kouzlit se SSH_ASKPASS
a/nebo spouštět vncclient
ovi jeho vlastní ssh-agent
. No ale co už; od toho jsou přístupová práva + šifrované disky, aby to tolik nevadilo.
Případně se dá na klientovi použít přímo vlastní uživatelský účet místo toho dedikovaného vncclient
a. V takovém případě se dá unit třeba do ~/.config/systemd/user/vnc-tunnel.service
a pak stačí jenom systemctl daemon-reload
a systemctl --user enable --now vnc-tunnel
.
Celkem triviálně se dá taky zařídit, aby server poskytoval (kromě přístupu ke svému vlastnímu VNC) taky jakýsi hub pro přístup na spoustu jiných strojů přes VNC — třeba v případě, že jsou ty stroje ně nějakých zastaralých IPv4 sítích a nedá se na ně přímo dostat.
... ExecStart=/usr/bin/ssh -C -N -T \ -o ServerAliveInterval=15 \ -o ServerAliveCountMax=4 \ -o ExitOnForwardFailure=yes \ -o ConnectTimeout=15 \ -i /home/vncclient/.ssh/id_rsa \ -L [::1]:5900:[::1]:5900 \ -R [::1]:5923:[::1]:5901 \ vncserver@můj.server.kdovíkde ...
Tady^^^ je -L [::1]:5900:[::1]:5900
tunel z klienta na server a -R [::1]:5923:[::1]:5901
je tunel ze serveru na klienta.
Pro Spice bude fungovat stejná konfigurace — kdyby náhodou byl i tam problém s přímou podporou SSL. (Dokonce má Spice taky obvykle port 5900.)
doporučuji místo VNC použít Spice (například pomocí x11spice
). To je o galaxii nebo dvě modernější protokol.
no tak sem to tedy zkusil, sice presun oken je z obsahem a ne jen drat jako u VNC, ale zase to nechava duchy, lame se prekresleni, zobrazuji se artefakty, je to mnohem pomalejsi, napr prehravani 720p videa pres mpv s x11vnc (+ patricne parametry pro lepsi chovani) je plynule, s x11spice je to tak 5fps A není v té síti úsek, kde se to převádí z ethernetu do psaníček pro holuby a pak zase u protějšího holubníku zpátky?
Stejně jako VNC, i Spice má na spoustu různých kodeků (pro statický obraz i video) a parametrů. Nikdy jsem se jimi příliš nezabýval, protože mi vzdálený přístup připadal obstojný a video jsem neřešil. Ve FAQ je položka Spice has poor video performance — tak třeba by něco z toho mohlo pomoct.
Taky jde o to, jestli to je „nativní“ virtuální stroj s QXL driverem nebo x11spice
připojený k existujícímu X-serveru. S tím QXL driverem mi šly záležitosti typu glxgears
přes celou obrazovku většinou rozumně plynule. (Ale měl jsem na VM malé rozlišení, obvykle FullHD nebo tak.) U x11spice
netuším, jak dobře to má zvládat video.
Teď jsem zkusil full-screen video na 4k přes VNC s x11vnc a dává mi to asi tak 0,5 fps. Spice totéž. Tak nevím.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.