2010/01/25

Port Forwarding(SSH tunneling)

  • 透過 ssh and sshd 能夠轉移 TCP 通訊的傳輸
  • 但是需要先瞭解難以理解且愚蠢的語法
  • -L clientport:host:hostport 

SSH tunneling (-L)

  • 使用 telnet 作測試,先在 server 端安裝授限制的 telnet server
# 安裝 telnet server
[root@sc220469 ~]# yum install telnet-server -y
# 開啟 telnet 從 xinetd 的設定內
[root@sc220469 ~]# chkconfig telnet on
# 重新啟動 telnet
[root@sc220469 ~]# /etc/init.d/xinetd restart
# 檢查 port 23 有沒有開
[root@sc220469 ~]# netstat -tnulp | grep 23
tcp    0   0 0.0.0.0:23          0.0.0.0:*    LISTEN   10008/xinetd        
# 本機連線測試
[root@sc220469 ~]# telnet localhost
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
Red Hat Enterprise Linux Server release 5.4 (Tikanga)
Kernel 2.6.18-164.el5 on an i686
login: 
Login incorrect
# 限制對外的網卡不能連線,只有(163.112.69.13)的可以連線
[root@sc220469 ~]# vim /etc/hosts.allow 
in.telnetd:163.112.69.13:allow
in.telnetd:ALL:deny
  • SSH tunnel 連線示意圖

  • 從 163.112.69.183 機器設定指令,指定以 163.112.69.13 當跳板建立一個 tcp port 23 的 ssh tunnel 到 163.112.69.204 主機的 tcp 23 port ,在本機(163.112.69.183)則會產生一個 port 6023 連入到 163.112.69.204 的 port 23
mtchang@mtchang-work:~$ ssh -2 -N -f -L 6023:163.112.69.204:23 mtchang@163.112.69.13
# -2 這迫使ssh 使用2.0 版的協定。
# -N 不指出命令,而只有通道。如果忽略了 ssh 將初始化一個普通的連線會話。
# -f 使ssh在背景運行ssh。
# -L 以 localport:localhost:remoteport 的初始化一個本地通道。
  • 在這個例子中,在163.112.69.183上的埠6023被指向遠端機器(163.112.69.13)的埠23。由於23 是用於 telnet 的,所以這將通過SSH 通道創建一個安全的 telnet 會話,並且指定這個連線會連到 163.112.69.204 port 23 。這可以用來隱藏許多不安全的TCP 協議如smtp, pop3, ftp 等。
  • 檢查程序 ssh 應該會在背景被執行,如需刪除只能使用 kill PID 刪除
mtchang@mtchang-work:~$ ps auxw | grep 6023
mtchang   2440  0.0  0.0   5284   636 ?        Ss   00:03   0:00 
ssh -2 -N -f -L 6023:163.112.69.204:23 mtchang@163.112.69.13
  • 檢查 163.112.69.183 是否產生 6023 的 tcp port
mtchang@mtchang-work:~$ netstat -tnulp | grep 23
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 127.0.0.1:6023          0.0.0.0:*               LISTEN      2309/ssh        
tcp6       0      0 ::1:6023                :::*                    LISTEN      2309/ssh   


  • 使用 telnet 連接本地的 locahost port 6023 做 ssh tunnel 測試
mtchang@mtchang-work:~$ telnet localhost 6023
Trying ::1...
Connected to localhost.
Escape character is '^]'.
Red Hat Enterprise Linux Server release 5.4 (Tikanga)
Kernel 2.6.18-164.el5 on an i686
?in: mtchang
Password: 
Last login: Mon Jan 25 07:53:35 from sc21369
[mtchang@sc220469 ~]$ 
  • 在 163.112.69.204 的機器上可以看見如下的連線
[root@sc220469 ~]# netstat -tnula | grep 23
tcp    0   0 163.112.69.204:23    163.112.69.13:41151   ESTABLISHED 10395/in.telnetd: s 
  • 在跳板機器 163.112.69.13 可以看到如下的連線
[mtchang@code ~]$ netstat -tnula | grep 23
tcp        0      0 163.112.69.13:41151         163.112.69.204:23           ESTABLISHED 
  • 從 163.112.69.183 刪除 ssh tunnel
mtchang@mtchang-work:~$ ps axuw | grep ssh
mtchang   2440  0.0  0.0   5400  1032 ?        Ss   00:03   0:00 
ssh -2 -N -f -L 6023:163.112.69.204:23 mtchang@163.112.69.13
mtchang   2468  0.0  0.0   3056   788 pts/1    S+   00:13   0:00 grep ssh
mtchang@mtchang-work:~$ kill 2440
張貼留言

like