NO IMAGE

通常情況下兩個不同的網路之間總會開放某一些特定的埠用於通訊使用,而SSH所使用的22埠通常就在開放之列。基於SSH的埠轉發就是利用SSH作為中間的代理,達到繞過兩個網路之間的限制,順利的進行任意的埠的訪問。

埠轉發可以分為三種,正向埠轉發,反向埠轉發和動態埠轉發。

為了演示這三種埠轉發方式的用法我們先假設存在有2個網域Office和Prod,在網域Office中有兩個主機A和B,在網域Prod中兩個主機C和D,這兩個網域之間除了主機A能夠訪問C的22埠之外,其他所有的訪問都被網路規則所禁止,也就是說A機器無法訪問C的除22之外的所有其他埠,也無法訪問到D主機;而主機C和D根本就無法訪問A或者B中的任意一臺主機。

任務一:正向埠轉發

現在開始我們的第一個任務:假設主機D上面安裝有資料庫服務,監聽的埠是8888,如果我想通過Office域中的主機A直接訪問D主機中的資料庫那該怎麼辦呢?這就要用到SSH的正向埠功能了。在這先要說明一下,在Linux中,所有的埠轉發的操作都可以通過使用自帶的工具ssh來完成。

完成任務一的命令很簡單,如下:

1 ssh -L 8000:host-d.prod.mycompany.com:8888 [email protected] -N

現在解釋一下上面的命令:

引數-L
表示在本地開啟監聽的埠,後面緊跟的引數格式為::,表示將本地的8000埠轉發到遠端主機D的8888埠。
[email protected]
這個引數指定要使用ssh登入的主機以及登入的使用者名稱,這裡使用的主機和前一個引數中的主機必須是在同一個網域當中,並且能相互訪問,當然也可以是同一個機器。
引數-N
不執行遠端的命令。這個引數在這裡是可選的。

現在在主機A上面執行上面的命令之後輸入正確的密碼,然後我們先登入主機A檢視一下當前埠的狀態:

1 [email protected][orcl]:~$ netstat -natp|grep 8000
2 (Not all processes could be identified, non-owned process info
3  will not be shown, you would have to be root to see it all.)
4 tcp        0      0 127.0.0.1:8000              0.0.0.0:*                   LISTEN      3767/ssh
5 tcp        0      0 ::1:8000                    :::*                        LISTEN      3767/ssh

可以看到在主機A上已經存在8000埠準備隨時接受連線了,不過要注意的是這裡監聽的網路是127.0.0.1(::1),也就是說這種連線僅限於本地操作。

接下來就是配置下TNSNAMES了,配置如下:

複製程式碼
 1 orcl=
2  (DESCRIPTION=
3         (ENABLE=BROKEN)
4         (ADDRESS_LIST=
5                 (FAILOVER=ON)
6                 (LOAD_BALANCE=YES)
7                 (ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=8000))
8         )
9         (CONNECT_DATA=
10                 (SID=orcl)
11         )
12   )
複製程式碼

然後tnsping測試一下:

複製程式碼
 1 [email protected][orcl]:~$ tnsping orcl
2  
3 TNS Ping Utility for Linux: Version 11.1.0.7.0 - Production on 05-JUL-2010 09:13:25
4  
5 Copyright (c) 1997, 2008, Oracle.  All rights reserved.
6  
7 Used parameter files:
8  
9 Used TNSNAMES adapter to resolve the alias
10 Attempting to contact (DESCRIPTION= (ENABLE=BROKEN) (ADDRESS_LIST= (FAILOVER=ON) (LOAD_BALANCE=YES) (ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=8000))) (CONNECT_DATA= (SID=orcl)))
11 OK (340 msec)
複製程式碼

大功告成。

任務二:反向埠轉發

因為網域Prod不能以任何的方式訪問網域Office,假設這兩個網域所處的物理位置完全的不同,那當那一天處於網域Prod的時候又想操作處於網域Office中的主機A,那怎麼辦呢?這就是要用到反向埠轉發的時候了。

反向埠轉發的基本思想就是從主機A建立到主機C的ssh連線的同時在主機C上開啟一個埠可以反向連線到主機B上面的某一個埠,當然從主機控制上面來說連線到主機B的22(ssh埠)是最實惠的了,現在要做的就是在主機A上面執行如下的命令:

1 ssh -R 8888:localhosthost-b.office.mycompany.com:22 [email protected] -N

同樣的,先解釋下上面的命令:

引數-R
建立一個反向的埠轉發,後面緊跟的引數格式為 ::,這裡監聽的埠是8888,反向連線要到C主機原來根本無法訪問的主機B的22埠。
[email protected]
這個引數指定要使用ssh登入的主機以及登入的使用者名稱,這裡使用的主機和前一個引數中的主機必須是在同一個網域當中,並且能相互訪問,當然也可以是同一個機器。
引數-N
不執行遠端的命令。這個引數在這裡是可選的。

在主機A上面執行上面的命令成功之後就可以登入到主機C檢查一下效果了,首先是檢查8888埠的開發狀態:

1 [email protected]:~$ netstat -natp |grep 8888
2 (No info could be read for "-p": geteuid()=1001 but you should be root.)
3 tcp        0      0 127.0.0.1:8888          0.0.0.0:*               LISTEN      -
4 tcp6       0      0 ::1:8888                :::*                    LISTEN      -

然後就是測試下這個埠的可用性,執行如下的命令:

複製程式碼
1 [email protected]:~$ ssh -p 8888 [email protected]
2 Password:
3 Last login: Mon Jul  5 02:34:50 2010 from 172.24.43.103
4  
5 [email protected]$ hostname
6 host-b.office.mycompany.com
7 [email protected]$
複製程式碼

至此現在已經成功的使用唯一開放的ssh埠建立了一個本來是完全不可能的連線。這種方法是非常有用的,具體在什麼時候用就靠大家的發揮了。

任務三:動態埠轉發

動態埠轉發實際上是建立一個ssh加密的SOCKS4/5代理通道,任何支援SOCKS4/5協議的程式都可以使用這個加密的通道來進行代理訪問,現在這種方法最常用的地方就是FQ了,使用的方法也很簡單,命令如下:

1 ssh -D 8888 [email protected] -N

命令解釋:

引數-D
建立一個動態的SOCKS4/5的代理通道,緊接著的是本地監聽的埠號。
[email protected]
這個引數指定要使用ssh登入的主機以及登入的使用者名稱,這裡使用的主機和前一個引數中的主機必須是在同一個網域當中,並且能相互訪問,當然也可以是同一個機器。
引數-N
不執行遠端的命令。這個引數在這裡是可選的。

因為這種方法對於辦公方面沒有什麼幫助,所以也就不再多說。