Portál AbcLinuxu, 20. listopadu 2025 17:11
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 vncclientovi 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 vncclienta. 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.