SSH 端口映射
工作中經常會遇到一些服務器訪問受限的問題:某些服務器只有私網ip地址,僅能通過內網ip連接,或如mysql服務器或登錄其它機器的ssh。
可以將遠端服務器一個端口remote_port綁定到本地端口port,
一。 linux
首先要記住一件事情就是:
SSH 端口轉發自然需要 SSH 連接,而 SSH 連接是有方向的,從 SSH Client 到 SSH Server 。
而我們所要訪問的應用也是有方向的,應用連接的方向也是從應用的 Client 端連接到應用的 Server 端。比如需要我們要訪問Internet上的Web站點時,Http應用的方向就是從我們自己這台主機(Client)到遠處的Web Server。
如果SSH連接和應用的連接這兩個連接的方向一致,那我們就說它是本地轉發。
ssh -L <local port>:<remote host>:<remote port> <SSH hostname>
如果SSH連接和應用的連接這兩個連接的方向不同,那我們就說它是遠程轉發。
ssh -R <local port>:<remote host>:<remote port> <SSH hostname>
<PIC>
本地轉發:
在本地這台機器上監聽一個端口,然后所有訪問這個端口的數據都會通過ssh 隧道傳輸到遠端的對應端口上,下面是例子。
本地端口轉發綁定的是 lookback 接口,這意味着只有 localhost 或者 127.0.0.1 才能使用本機的端口轉發 , 其他機器發起的連接只會得到“ connection refused. ”。要想讓其他機器也能共享這個隧道來轉發的話需要在配置文件中使用GatewayPorts 關鍵字,或者直接命令行下使用"-g"參數。
另外本地轉發命令中的 <remote host> 和 <SSH hostname> 可以是不同的主機。
<PIC>
遠程轉發與本地轉發正好相反,打開ssh隧道以后,在遠端服務器監聽一個端口,所有訪問遠端服務器指定端口都會通過隧道傳輸到本地的對應端口上,下面是例子。
ssh的三個強大的端口轉發命令:
轉發到遠端:ssh -C -f -N -g -L 本地端口:目標IP:目標端口 用戶名@目標IP
轉發到本地:ssh -C -f -N -g –R 本地端口:目標IP:目標端口 用戶名@目標IP
ssh -C -f -N -g -D listen_port user@Tunnel_Host
其中
-C,是進行數據壓縮。
-f,是后台認證用戶/密碼,通常和-N連用,不用登錄到遠程主機。只有當提示用戶名密碼的時候才轉向前台。
-N,是不執行遠端命令,在只是端口轉發時這條命令很有用處。
-g ,在-L/-R/-D參數中,是允許遠端主機連接本地轉發端口,如果不加這個參數,只允許本地主機建立連接。
-L,則是將本地端口映射到遠端主機端口。本地端口:目標IP:目標端口
將本地機(客戶機)的某個端口轉發到遠端指定機器的指定端口。
工作原理: 本地機器上分配了一個 socket 偵聽 port 端口, 一旦這個端口上有連接, 該連接就經過安全通道轉發出去, 同時遠程主機和 host 的 hostport 端口建立連接. 可以在配置文件中指定端口的轉發。
只有 root 才能轉發特權端口。IPv6 地址用另一種格式說明: port/host/hostport
-R,表明是將遠端主機端口映射到本地端口。本地端口:目標IP:目標端口
將遠程主機(服務器)的某個端口轉發到本地端指定機器的指定端口
工作原理: 遠程主機上分配了一個 socket 偵聽 port 端口, 一旦這個端口上有連接, 該連接就經過安全通道轉向出去, 同時本地主機和 host 的 hostport 端口建立連接. 可以在配置文件中指定端口的轉發.。
只有用 root 登錄遠程主機才能轉發特權端口.。IPv6 地址用另一種格式說明: port/host/hostport
-p :被登錄的ssd服務器的sshd服務端口。
-D port
指定一個本地機器 “動態的'’ 應用程序端口轉發.。
工作原理: 本地機器上分配了一個 socket 偵聽 port 端口, 一旦這個端口上有了連接, 該連接就經過安全通道轉發出去, 根據應用程序的協議可以判斷出遠程主機將和哪里連接.。目前支持 SOCKS4 協議, 將充當 SOCKS4 服務器。
只有 root 才能轉發特權端口,可以在配置文件中指定動態端口的轉發。
應用舉例
1. 將發往本機的80端口訪問轉發到192.168.1.1的8080端口
ssh -C -f -N -g -L 80:192.168.1.1:8080 user@192.168.1.1
2. 將發往192.168.1.1的8080訪問轉發到本機的80端口
ssh -C -f -N -g -R 80:192.168.1.1:8080 user@192.168.1.1
(user為主機192.168.1.1上的用戶)
-N - 不使用Shell窗口,純做轉發的時候用,如果你在映射完成后繼續在服務器上輸入命令,去掉這個參數即可
例子A:我們想遠程管理服務器上的MySQL,那么使用下面命令
ssh -L 3306:127.0.0.1:3306 user@emlog-vps -N
運行這個命令之后,ssh將會自動將服務器的3306映射到本機的3306端口,我們就可以使用任意MySQL客戶端連接 localhost:3306即可訪問到服務器上的MySQL了。
例子B:一次同時映射多個端口
ssh -L 8888:www.host.com:80 -L 110:mail.host.com:110 -L 25:mail.host.com:25 user@host -N
命令將自動把服務器的80,110,25端口分別映射到本機的8888,110和25端口
注:以上命令在ubuntu 9.10 上測試通過...