2012年9月9日 星期日

以範例說明 SSH 的連線、通道(Tunnel)使用

Linux 系統可以開啟許多網路服務,而「防火牆」又是電腦的必備防護機制之一,為了讓網路上的使用者能夠直接連線使用這些網路服務,就需在「防火牆」上開啟這些埠。就如在圍牆上打個洞一樣,總有一些人從這些小洞窺視,網路上常有人在掃描這些開放的埠。
    當然,可以再加些防護措施,但是愈多的防護,就是愈多的網路封包檢查,CPU 的運算就點點滴滴地花費在這些地方。除非必要,開放的埠愈少,被窺視、刺探的機會就愈少。把防護的網路封包檢查,集中在少數幾個埠,可以節省 CPU 的運算資源,特別是這些網路服務僅限系統使用者使用者。
    SSH 是網路公認相當安全的「遠端終端機」協定,除了簡單連線外,也有許多強化功能,方便網路連線使用。網路上常見將這些強化功能,用在穿透網路管制之用,但是,在網路世界裏,凡做過必留下痕跡,要查出用 SSH 穿透網路管制也不是難事。建議,還是少做為妙。
    本文接下來的介紹,以正當用途的使用為範圍,對於 非建議的用途 就不多著墨。畢竟,SSH 的連線是被授權的「使用者」才能使用,就像偵探小說一樣,都是從有限的『嫌疑犯』中去找犯人,要找出來太容易了。

一、說明範例的網路架構

為方便說明以下的使用方式,本文用下圖的網路架構說明:
其中,PC-A, PC-B 和 PC-C 是分別位於「防火牆」兩側的三部電腦或伺服器,至於何者為內外側,會依防火牆設定位置與連線方式而不同,將在範例中說明之。三台電腦 SSH 的埠分別為:220, 221, 222,網路位址分別為:10.10.10.10, 10.10.20.11, 10.10.20.12。
    為方便以下例子的理解,命令列中以 PC-A, PC-B 和 PC-C 表示其網址,若你的系統中未設定「域名服務」,就需改成 IP 網址。
注意:本文中所述的「網路位址」、「埠號」皆為說明而定,非任何電腦、服務使用,請依實際使用狀況修改之。

二、連線、登入

只考慮 PC-A 及 PC-B 兩部電腦,而「防火牆」架在 PC-B 中。以 SSH 由 PC-A 連線到 PC-B 的命令為
[SiB@PC-A ~]$ ssh PC-B -p 221 -l SiB
[SiB@PC-B ~]$
其中, ssh 的參數 -p 指定連線端的埠號。 -l 指定登入的帳號名稱,若登入的帳號名稱與本機使用者同名,則可省略。

三、重導「圖形化介面」程式的畫面

只考慮 PC-A 及 PC-B 兩部電腦,而「防火牆」架在 PC-B 中。以 SSH 由 PC-A 連線到 PC-B ,並將 PC-B 執行之「圖形化介面」的程式畫面重導回 PC-A 的命令為
[SiB@PC-A ~]$ ssh PC-B -p 221 -l SiB -X
[SiB@PC-B ~]$
使用時機及詳細說明,請參考 "透過 SSH 連線,開啟遠端之「圖形化介面」的程式" 一文。

四、重導「本地電腦」的埠到「遠端電腦」

只考慮 PC-A 及 PC-B 兩部電腦,而「防火牆」架在 PC-B 中。以 SSH 由 PC-A 連線到 PC-B 的命令為
[SiB@PC-A ~]$ ssh PC-B -p 221 -l SiB -L 333:127.0.0.1:444
[SiB@PC-B ~]$
其中, ssh 的參數 -L 為設定重導埠號的參數, 333 為將重導的「本地電腦」的埠號,444 為重導末端的「遠端電腦」的埠號。而 127.0.0.1 則是指重導末端的 444 埠號位於「遠端電腦」中。
    當「遠端電腦」的某些服務並未直接開放外部電腦連線,此項功能可讓這些服務僅限被授權的使用者可用。如 PC-A 端的使用者,可使用 localhost:333 或 127.0.0.1:333 將網路連線重導至 PC-B 的 444 埠,而外界電腦永遠掃描不到 PC-B 的 444 埠。例:假設 444 埠是 PC-B 的「網頁伺服器」的埠號,則 PC-A 上的瀏覽器中所下的連線網址為:
http://localhost:333
    另外,若使用者自行開發網路程式,當要自行測試時,此項功能非常方便。不用驚擾系統管理者,不用在「防火牆」上打洞,安全又方便。
注意:在 Fedora 中,因 SELinux 的安全機制,某些埠號仍會被管制使用。

五、重導「本地電腦」的埠到「其它」電腦

考慮 PC-A, PC-B 及 PC-C 三部電腦,而「防火牆」設定為允許 PC-A 直接連線至 PC-B,但不能直接連線到 PC-C(此例中。以 SSH 由 PC-A 經 PC-B 連線到 PC-C 的命令為
[SiB@PC-A ~]$ ssh PC-B -p 221 -l SiB -L 333:PC-C:444
[SiB@PC-B ~]$
其中, ssh 的參數 -L 為設定重導埠號的參數, 333 為將重導的「本地電腦」的埠號,444 為重導末端的「其它」電腦的埠號。而 PC-C 則是指重導末端的 444 埠號位於「其它」電腦中。
    上例中,「遠端終端機」顯示為 PC-B ,但是「本地電腦」的 333 埠會被重導至 PC-C 的 444 埠(即 10.10.20.12:444)。若 PC-C 的 444 不能由外界直接連線(包含 PC-B),則上述命令仍不能正常重導,要做兩階段的重導。
[SiB@PC-A ~]$ ssh PC-B -p 221 -l SiB -L 333:127.0.0.1:555
[SiB@PC-B ~]$ ssh PC-C -p 222 -l SiB -L 555:127.0.0.1:444
[SiB@PC-C ~]$
這個例子是由 PC-A 中執行的 ssh 將 PC-A 中的 333 埠重導至 PC-B 的 555 埠,另一個在 PC-B 中執行的 ssh 將 PC-B 的 555 埠重導至 PC-C 的 444 埠。這些電腦的「防火牆」都只需打開一個給 SSH 的埠即可,安全性相當高。
注意一:在 Fedora 中,因 SELinux 的安全機制,某些埠號仍會被管制使用。
注意二:此項重導功能,是最常被用於非正當用途,使用前請慎重考慮。

六、重導「遠端電腦」的埠到「本地電腦」

在以下例子中,我們將連線方向改一下,使其較符合一般使用情況。考慮 PC-A, PC-B 及 PC-C 三部電腦,而「防火牆」設在「IP 分享器」上,PC-A 為外界電腦,PC-B 及 PC-C 網址為私有網址(需透過「NAT, 網路位址轉換」與外界連線),且 PC-B 及 PC-C 間的 SSH 埠可以直接連線。以下面兩個例子,說明兩種不同的用法:
    由 PC-B 連線到 PC-A ,但將 PC-A 的 333 埠重導回 PC-B 的 444 埠的命令為,
[SiB@PC-B ~]$ ssh PC-A -p 220 -l SiB -R 333:127.0.0.1:444
[SiB@PC-A ~]$
由 PC-B 連線到 PC-A ,但將 PC-A 的 333 埠重導回 PC-C 的 222 埠的命令為,
[SiB@PC-B ~]$ ssh PC-A -p 220 -l SiB -R 333:PC-C:222
[SiB@PC-A ~]$ ssh localhost -p 333 -l SiB
[SiB@PC-C ~]$
這兩個例子在一般家庭或 SOHO 的網路使用者中,用「IP 分享器」分享網路,內部電腦透過「NAT, 網路位址轉換」與外界連線的情況下,相當好用。
    當「遠端電腦」需要連線到「IP 分享器」的內部電腦時,利用這兩個例子的命令,可以將內部電腦的埠,好像搬移到「遠端電腦」的本地埠一樣方便。

七、延伸說明

有些使用小經驗,順便在這裏提一下:
  • 同一個 ssh 命令列中,可以同時下好幾個「通道(tunnel)」參數。
  • 已經連線後,想再加個通道,就再下一次 ssh 命令,只要通道不衝突,就不會錯誤。

已測試版本:

  • Fedora: 14, 17

沒有留言:

張貼留言

感謝你耐心看完本文,歡迎留下任何指正、建議,筆者會儘快回應。(English is also welcome.)