遠端編輯器設定 – 透過Port Forwarding

遠端編輯器設定 - 透過Port Forwarding

Jupyter Notebook 是開發Python 時好用的編輯器之一,也是目前研究深度學習時最常使用的平台之一。我先前介紹過怎麼安裝Jupyter Notebook在自己的mac上。現在遠端工作的機會越來越多了,因此也產生了遠端編輯程式碼的需求。以下我將會介紹如何設定遠端編輯器。

為什麼不使用遠端桌面就好?

因為遠端桌面的體驗遠遠比不上遠端編輯器。遠端桌面,例如TeamViewer、AnyDesk,是很便利且萬用沒錯,但是同時他們也佔用許多網路資源。即使什麼都不做,他們也會不斷地使用網路資源更新畫面。修改程式碼時也有明顯的頓挫感,使得人心情浮躁。俗話說:「遊戲不會使人暴力,Lag才會」。遠端編輯器比起遠端桌面,其所需的網路資源非常少,只有編輯中的文件需要被傳輸。再者,使用遠端編輯器的體驗非常的接近本地端,肉體難以察覺差異。所以設置一個遠端編輯器可以大幅提升在家工作的體驗。

遠端編輯器概念圖

在同一個路由器(Router) 底下的所有設備都屬於同一個區域網路,暱稱內網。例如我家的手機跟Macbook Air都是連到同一個Wifi,所以他們屬於同一個區域網路。而路由器以外的網路稱為網際網路,暱稱外網。例如各大公司的官方網站、購物網站對於我的Macbook Air而言就是外網。

圖一:簡易的網路連線關係圖

假設我今天想要從家裡聯絡到公司的電腦,我需要先從家用電腦出發,透過家裡的路由器傳訊息到網際網路,然後再經由公司的路由器送到公司的電腦;公司的電腦也要經過一樣的路徑聯絡家用電腦,但是要反過來走。平常我們上網的時候也是像這樣與其他網站的伺服器交換訊息,只是工程師已經幫你把相關的設定做掉了,所以我們才可以一買回手機連上Wifi就可以直接上網。

但當我們想要遠端控制電腦的時候,就必須自己當起工程師囉。事實上也並不困難,因為我們不需要從頭做起。我們可以利用Secure Shell Protocal (SSH)從一台電腦聯絡到另外一台電腦。

使用SSH連線

考慮到有些朋友可能沒有玩過SSH,我這裡做一個範例。國內最大的BBS站PTT提供了SSH的連線訪問方式。只要打開Terminal(on Mac or Linux) 或是PowerShell(on Windows) 輸入下列指令就可以登入了。

ssh bbsu@ptt.cc

註:Mac 與Linux的SSH Client 不需另外設定即可使用;Windows的SSH Client 設定請參考安裝 OpenSSh

圖二:透過Terminal連線到PTT

很簡單對吧,而且理論上我們可以用這類指令連線到所有的電腦,只要那台電腦公開在網際網路以及我們有相對應的帳號密碼。但是問題來了,從家用電腦訪問網際網路的部分沒有問題,但是我要怎麼把公司的伺服器公開到網際網路呢?在介紹解決方式之前,我們需要先認識電腦上的Port的功能是什麼,以及SSH與Port之間的關係。

什麼是Port

Port是一種只存在在軟體上的定義,功能跟你我家的大門一樣,控制資訊的進出。通常一台家用電腦能夠被定義65535個Port,而每一個應用程式至少需要佔用一個Port,才能實現對外溝通的功能。SSH預設佔用的是第22號Port,所有透過SSH傳遞的資訊都必須經由Port 22才能送到網際網路,也必須要經由Port 22接收資訊。我們也可以令SSH使用其他的Port,但最少需要指派一個Port。

要遠端連上公司的伺服器,必須至少讓伺服器的一個Port公開於網際網路,然後我再透過家用電腦連上那個Port。

將Port 公開在網際網路

我的路由器是ASUS RT-N12D1,他就有設定Port Forwarding的功能。操作方法如下圖三、四。

圖三:從瀏覽器登入路由器。綠色框內的資訊是路由器的外網IP

首先我們從瀏覽器登入路由器,進入外部網路(WAN)。至於要怎麼登入這件事每一家廠商的做法都不同,請詳見各家產品使用說明書。這裡我們需要注意一件事,就是路由器在網際網路及區域網路的IP是不同的兩個。我們要做的事情是將區域網路的伺服器的Port對應到路由器在網際網路的某一個Port,所以這裡我們要記得綠色框的網際網路IP,等等就是從這個IP登入伺服器。

圖四:設定Port Forwarding

接著請在「虛擬伺服器」設定Port forwarding。設定好了之後,我們就可以透過路由器的外網IP(192.168.1.10) 的Port 2222連線到My Server(192.168.50.175) 的Port 22了。架構如下圖五:

圖五:伺服器與路由器的網路關係。其中Another Router也可以是外網,因為我不想公開我家IP,所以放了這台Router。

檢驗Port Forwarding

我在一台家用電腦連上My Router的Wifi,然後透過SSH連上伺服器。分別測試直接SSH 連線與透過Port Forwarding SSH 連線。指令如下、結果如圖六,兩者都成功連上了。

註:伺服器應該要啟用SSH server,才能提供客戶端SSH連線服務。這是Mac的SSH server的啟用方式。

# 透過Port Forwarding SSH 連線
ssh jacob975@192.168.1.10 -p2222

# 直接SSH 連線
# 註:jacob975@qiuyilongdeair = jacob975@192.168.50.175
ssh jacob975@qiuyilongdeair -p22
圖六:在一台Windows電腦測試SSH 連線到我的My Server(MacBook Air)

在Visual Studio Code上使用SSH連線到遠端主機

成功是成功了,但是Terminal、PowerShell、或Command Prompt都不是很親切的編輯器,所以我們還要再下一點功夫。讓我們試試看使用Visual Studio Code(VScode) 透過SSH連線到其他主機做編輯。VScode本身支援非常多種語言的編輯器,當然也包括了Jupyter Notebook。首先在家用電腦下載Visual Studio Code

安裝VScode後啟動它,在左側工具欄選擇「延伸模組(Extensions)」、搜尋「Remote – SSH」並安裝。

圖七:在延伸模組搜尋Remote – SSH並安裝

此時左下角會出現綠色遠端連線方塊,點選該方框然後選擇Connect to Host、輸入SSH的連線設定,稍等一會兒就可以連上遠端伺服器了。

圖八:輸入SSH登入資訊到VScode

看到這個畫面後,就可以像是本地端一樣的遠端編輯伺服器內的文件囉。有時可能會遇到連線失敗的情況,可以像我一樣使用VScode Insider,或是參考這個做法

圖九:成功登入My Server的VScode 畫面

小結

請注意,任意更動路由器的設定可能會導致網路安全相關的問題。這套方法比較適合小型工作室與學生使用,因為路由器的環境相對單純。我本身在這方面也不是非常專業,但是覺得值得分享給大家。因為只要幾個簡單的步驟就可以提高編程的體驗。

所有文章分類

訂閱我吧

不再錯過每一篇新文章

*

Yi-Lung Chiu