步驟:
1. 假設宿舍機器的IP爲aaa.bbb.ccc.ddd(外部IP),並開啓了sshd。在實驗室機器上運行:
ssh -R 22222:localhost:22 aaa.bbb.ccc.ddd
這條命令的作用是遠程登錄宿舍機器上,並將所有發往宿舍機器22222端口的消息(通過這條ssh隧道)轉發到實驗室機器的22端口上。
2. 只要保持這條ssh連接,以後在宿舍機器上就可以通過下面這條命令來登錄到實驗室機器上。:
ssh localhost -p 22222
如果實驗室機器裝了RealVNC server,甚至可以利用x0vncserver來訪問實驗室機器當前的圖形界面。步驟如下:
1. 首先得保證已經進入了X界面
2. 在實驗室機器設置vncserver的密碼:
vncpasswd
密碼保存在~/.vnc/passwd中
3. 在實驗室機器上啓動x0vncserver:
x0vncserver PasswordFile=~/.vnc/passwd
記下x0vncserver的端口號(默認5998)
4. 在實驗室機器上遠程登陸宿舍機器,建立ssh隧道:
ssh -R 22223:localhost:5998 aaa.bbb.ccc.ddd
5. 回到宿舍後,打開vncviewer,連接localhost:22223,就可以見到實驗室機器的畫面了。
SSH原理與運用(二):遠程操作與端口轉發
作者:阮一峯
(Image credit: Tony Narlock)
七、遠程操作
SSH不僅可以用於遠程主機登錄,還可以直接在遠程主機上執行操作。
上一節的操作,就是一個例子:
$ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
單引號中間的部分,表示在遠程主機上執行的操作;後面的輸入重定向,表示數據通過SSH傳向遠程主機。
這就是說,SSH可以在用戶和遠程主機之間,建立命令和數據的傳輸通道,因此很多事情都可以通過SSH來完成。
下面看幾個例子。
【例1】
將$HOME/src/目錄下面的所有文件,複製到遠程主機的$HOME/src/目錄。
$ cd && tar czv src | ssh user@host 'tar xz'
【例2】
將遠程主機$HOME/src/目錄下面的所有文件,複製到用戶的當前目錄。
$ ssh user@host 'tar cz src' | tar xzv
【例3】
查看遠程主機是否運行進程httpd。
$ ssh user@host 'ps ax | grep [h]ttpd'
八、綁定本地端口
既然SSH可以傳送數據,那麼我們可以讓那些不加密的網絡連接,全部改走SSH連接,從而提高安全性。
假定我們要讓8080端口的數據,都通過SSH傳向遠程主機,命令就這樣寫:
$ ssh -D 8080 user@host
SSH會建立一個socket,去監聽本地的8080端口。一旦有數據傳向那個端口,就自動把它轉移到SSH連接上面,發往遠程主機。可以想象,如果8080端口原來是一個不加密端口,現在將變成一個加密端口。
九、本地端口轉發
有時,綁定本地端口還不夠,還必須指定數據傳送的目標主機,從而形成點對點的"端口轉發"。爲了區別後文的"遠程端口轉發",我們把這種情況稱爲"本地端口轉發"(Local forwarding)。
假定host1是本地主機,host2是遠程主機。由於種種原因,這兩臺主機之間無法連通。但是,另外還有一臺host3,可以同時連通前面兩臺主機。因此,很自然的想法就是,通過host3,將host1連上host2。
我們在host1執行下面的命令:
$ ssh -L 2121:host2:21 host3
命令中的L參數一共接受三個值,分別是"本地端口:目標主機:目標主機端口",它們之間用冒號分隔。這條命令的意思,就是指定SSH綁定本地端口2121,然後指定host3將所有的數據,轉發到目標主機host2的21端口(假定host2運行FTP,默認端口爲21)。
這樣一來,我們只要連接host1的2121端口,就等於連上了host2的21端口。
$ ftp localhost:2121
"本地端口轉發"使得host1和host3之間彷彿形成一個數據傳輸的祕密隧道,因此又被稱爲"SSH隧道"。
十、遠程端口轉發
既然"本地端口轉發"是指綁定本地端口的轉發,那麼"遠程端口轉發"(remote forwarding)當然是指綁定遠程端口的轉發。
還是接着看上面那個例子,host1與host2之間無法連通,必須藉助host3轉發。但是,特殊情況出現了,host3是一臺內網機器,它可以連接外網的host1,但是反過來就不行,外網的host1連不上內網的host3。這時,"本地端口轉發"就不能用了,怎麼辦?
解決辦法是,既然host3可以連host1,那麼就從host3上建立與host1的SSH連接,然後在host1上使用這條連接就可以了。
我們在host3執行下面的命令:
$ ssh -R 2121:host2:21 host1
R參數也是接受三個值,分別是"遠程主機端口:目標主機:目標主機端口"。這條命令的意思,就是讓host1監聽它自己的2121端口,然後將所有數據經由host3,轉發到host2的21端口。由於對於host3來說,host1是遠程主機,所以這種情況就被稱爲"遠程端口綁定"。
綁定之後,我們在host1就可以連接host2了:
$ ftp localhost:2121
這裏必須指出,"遠程端口轉發"的前提條件是,host1和host3兩臺主機都有sshD和ssh客戶端。
十一、SSH的其他參數
SSH還有一些別的參數,也值得介紹。
N參數,表示只連接遠程主機,不打開遠程shell;T參數,表示不爲這個連接分配TTY。這個兩個參數可以放在一起用,代表這個SSH連接只用來傳數據,不執行遠程操作。
$ ssh -NT -D 8080 host
f參數,表示SSH連接成功後,轉入後臺運行。這樣一來,你就可以在不中斷SSH連接的情況下,在本地shell中執行其他操作。
$ ssh -f -D 8080 host
要關閉這個後臺連接,就只有用kill命令去殺掉進程。
十二、參考文獻
* SSH, The Secure Shell: The Definitive Guide: 2.4. Authentication by Cryptographic Key, O'reilly
* SSH, The Secure Shell: The Definitive Guide: 9.2. Port Forwarding, O'reilly
* Shebang: Tips for Remote Unix Work (SSH, screen, and VNC)
* brihatch: SSH Host Key Protection
* brihatch: SSH User Identities
* IBM developerWorks: 實戰 SSH 端口轉發
* Jianing YANG:ssh隧道技術簡介
* WikiBooks: Internet Technologies/SSH
(完)
http://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.html
SSH協議中有X轉發協議。在SSH的客戶端putty中只要選中Enable X11 forwarding(在命令行下輸入 –X 選項)就可以把遠程的窗口帶到本地,很方便。
其實明白了X轉發的原理後就知道,ssh的X轉發功能(-X選項)完全可以用端口轉發功能來實現。而SSH的端口轉發功能可以分爲本地端口轉發(-L選項)和遠程端口轉發(-R選項)。
這兩種轉發方式很困惑人,而有一種方法比較容易記:在本地機上利用SSH連接遠程主機,在這個過程中,我們可以很容易分清楚SSH client端和SSH server端。同時使能ssh的端口轉發功能,按照數據流的流向,又可以分爲一個Client端和一個Server端,如果這兩個server端是在同一端的機器上就是本地端口轉發,反之,就是遠程端口轉發。
可以做一個實驗
本地環境:Windows xp + ssh client + X-win32. IP 192.168.135.250
遠程環境:Linux + ssh server. IP 192.168.135.3
打開X server(X-win32)
利用X轉發選項實現X轉發
DOS環境下,輸入
ssh –X 192.168.135.3
輸入用戶名和密碼。輸入
xclock &
顯示效果
點擊是,顯示
利用SSH的端口轉發功能實現X轉發功能
DOS環境下輸入
ssh –R 6011:127.0.0.1:6000 192.168.135.3
(爲什麼是-R遠程端口轉發,根據數據流判斷,還得仔細理解X server和X client的區別)(6011:127.0.0.1:6000,可理解爲 源端口:遠程主機:遠程主機端口)(轉發135.3主機的6011端口,需設置DISPLAY變量)
輸入用戶名和密碼,登錄。輸入
export DISPLAY=127.0.0.1:11.0
輸入
xclock &
顯示效果
windows下配置putty做上述實驗
確保不要選中Enable X11 forwarding
設置ssh Tunnels(ssh 隧道)
Source port:6011
Destination:192.168.135.250:6000
Remote
Auto
點擊Add
其它選項根據習慣自行設置。
輸入用戶名和密碼,登錄,設置DISPLAY變量,與上部分類似
export DISPLAY=127.0.0.1:11.0
xclock &
顯示效果