SSH X11 Forwarding教学,将远程Linux图形程序拉到本地X窗口运行

1. X11 Forwarding有何用?

Linux的圖形環境都是建基於X視窗系統(X11)之上的,有了這套軟體才能跑圖形程式,還有我們熟知的GNOME、KDE桌面環境。

X視窗系統因為具有主從式架構,能有多個X客戶端連線到X伺服端,故能夠自由指定DISPLAY:環境變數,藉由網路透明性(network transparency),在同一網路下的其他電腦顯示圖形程式。

比如,我們可以讓一台headless的A電腦的畫面,顯示在另一台有連接顯示器的B電腦:

# A電腦執行指令,指定使用B電腦的DISPLAY
export DISPLAY=192.168.1.102:0

# A電腦執行指令,在連接顯示器的B電腦顯示xterm程式
xterm

# 你可能還要在B電腦允許其他X客戶端在你的畫面上顯示
xhost +

此時,B電腦就成為了A電腦的X客戶端。執行於X客戶端的圖形程式,渲染工作是由遠端X伺服端負責的,所以依賴OpenGL的程式可以吃到3D加速。

圖片來自getteleport.com

那麼什麼是X11 Forwarding?中文意為X11轉發,將遠端X視窗的畫面轉發到本機顯示。參考下圖,SSH會將遠端X客戶端通過代理傳送到本機。

圖片來自getteleport.com

為什麼X11 Forwarding要搭配SSH使用呢?因為X伺服器與X客戶端之間通訊是沒有加密的,這樣很容易被攔截竄改,所以讓它走SSH加密通道較為保險。於是乎,整個技術就變成了「SSH X11 Forwarding」。

某種程度來說X11 Forwarding可以算是遠端桌面吧,但是它不是VNC那種啟動整個Linux桌面環境的方案,反而比較像是跑單一應用程式視窗用的。還有X11畫面傳輸沒有經過任何壓縮,也因此X11 Forwarding比VNC吃頻寬,不適合網路連線緩慢的情況使用(其實就算是區域網路,X11 Forwarding的效率也是非常差勁,比不上VNC)。

2. X11 Forwarding運作需要的環境#

第一,SSH伺服器和SSH客戶端是必備的。

第二,X11 Forwarding運作條件是客戶端必須執行X伺服器。


理想上遠端和客戶端都是Linux系統比較好操作,因為大部份Linux發行版都有X視窗系統。本文探討的便是Linux對Linux進行X11 Forwarding。

不過X11 Forwarding並無限制一定要用Linux, X11 Forwarding是可以在其他系統運作的。

如果要Linux → Windows,因為Window不是使用X視窗系統,所以要安裝開源的Vcxsrv跑一個X伺服器,讓遠端Linux的視窗在Windows上執行。

Linux → macOS,請裝XQuartz

Linux → Android,請裝Termux X11

Linux → iOS,請裝閉源的Mocha X11或者iSH Shell

3. 如何進行X11 Forwarding操作#

假設遠端伺服器為Debian 12,客戶端為Ubuntu 24.04。

  1. 在要連線的客戶端,也就是Ubuntu,開啟終端機
  2. 使用SSH登入遠端Debian
ssh 使用者名稱@伺服器IP
  1. X11 Forwarding預設是關閉的,所以要編輯sshd設定檔
sudo vim /etc/ssh/sshd_config
  1. 將這裡取消註解,啟用X11 Forwarding
AllowTcpForwarding yes
X11Forwarding yes
X11UseLocalhost yes
  1. 重新啟動SSH服務
sudo systemctl restart sshd
  1. 在本機Ubuntu,開一個新的終端機視窗,ssh指令加上-X選項,後面加上要啟動的程式,例如這裡為xterm:
ssh -X 使用者名稱@伺服器IP xterm

4. ssh -X與ssh -Y的差別#

ssh -X稱作untrusted X11 forwarding,連線時比較安全。

ssh -Y為trusted X11 forwarding,只有在部份程式無法開啟時才使用此選項。

5. Wayland的X11 Forwarding替代品#

隨著Wayland成為主流的顯示協定,X11 Forwarding也逐漸走入歷史了…啊不過有開發者做了概念上類似的WayPipe,能夠把遠端Wayland程式拉到本機Wayland執行。

发表评论