SSH是远程终端登录协议,并逐渐取代telnet(基于TCP 32号端口),而ssh是基于TCP的22号端口;
SSH端口转发技术:
在SSH加密的通道上传输其他协议数据,即其他协议的数据通过SSH端口进行转发,SSH链接作为其他协议传输的通道(隧道),这种方式叫做SSH端口转发,或SSH隧道
SSH端口转发技术的作用
加密数据传输:可以让一些本来没有加密的应用层协议在加密的通道中安全的传输
突破防火墙限制:怎么理解?
SSH端口转发的分类:
本地转发(local forwarding)
-f :在后台执行,不占用终端
本地转发中的本地是指将本地的某个端口转发其他主机的某个端口,这样当我们的程序链接本地的这个端口时,其实间接连接上了其他主机的某个端口,当我们发数据包到这个端口时数据包就自动转发到了那个远程端口上;
因为http协议本身并不是加密的,
-Nf:在后台执行
-L:执行一个本地转发
10.10.10.1:7788:10.10.10.2:80 :在本机10.10.10.1开启7788端口访问10.10.10.2 上80端口的资源
10.10.10.2:跟谁建立通道呢?跟10.10.10.2这台主机建立一个通道,前提时10.10.10.2这个主机能够访问10.10.10.2:80上的资源(也就是本地想要访问的资源)
[root@router~]#elinks --dump 10.10.10.2
this is 10.10.10.2 web
在服务器端:
[root@server2 ~]tail /var/log/httpd/access_log
10.10.10.1 - - [29/Mar/2014:15:39:57 +0800] "GET / HTTP/1.1' 200 23 "-" "Elinks/0/11/1 (textmode; Linux; -)"
[root@router ~]ssh -Nf -L 10.10.10.1:7788:10.10.10.2:80 10.10.10.3
root@10.10.10.3's password:
[root@router ~] 可以发现此时并没有
[root@router ~]netstat -nt
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 10.10.10.1:49048 10.10.10.3:22 ESTABLISHED
tcp 0 132 ::ffff:10.10.10.1:32 :ffff:10.10.10.249:59944 ESTABLISHED
[root@router ~]netstat -ntpl | grep 7788
tcp 0 0 10.10.10.1:7788 0.0.0.0:* LISTEN 10222/ssh
如果在输入命令的时候省略了10.10.10.1:7788则会在这里显示127.0.0.1
[root@router ~]elinks --dump 10.10.10.1:7788 此时访问的时本机的7788端口
this is 10.10.10.2 web
[route@server2~]tail /var/log/httpd/access_log
10.10.10.3 - - [29/Mar/2014:15:42:39 +0800] "GET / HTTP/1.1" 200 23 "-" "Elinks/0.11.1 (textmode;Linux; -)"
这里要说明一点:其实在.1访问.2这个网站的时候,只有一段是数据安全的,就是.1和.3之间的SSH通道是数据加密的,但是.3去访问.2的时候,两者之间的数据并没有加密
做完实验之后如何杀死进程?
[root@router~]#ps aux | grep ssh
[root@router~]#kill -g 10222
检查一下:
[root@router~]#netstat -ntpl | grep 7788
SSH 本地端口转发:实现绕过防火墙限制
C不允许A访问,但是允许B访问,通过SSH本地转发实现A访问C
[root@server3~]elinks --dump 10.10.10.3
this is 10.10.10.3 web
[root@server2~]elinks --dump 10.10.10.3
this is 10.10.10.3 web
然后现在在server3上面做访问限制:
[root@server3~]iptables -A INPUT -s 10.10.10.1 -j REJECT
[root@router~]elinks --dump 10.10.10.3
Elinks:拒绝链接
然后再.1和.2之间建立号一个通道
[root@router~]#ssh -Nf -L :7788:10.10.10.3:80 10.10.10.2
[root@router~]#netstat -nt
tcp 0 0 10.10.10.1:40891 10.10.10.2:22 ESTABLISHED
[root@router~]#netstat -ntpl | grep 7788
tcp 0 0 127.0.0.1 :7788
[root@router~]# elinks --dump 127.0.0.1 :7788
this is 10.10.10.3 web
[root@server3~]#tail /var/log/httpd/access_log
10.10.10.2
远程转发(remote forwarding)
远程转发和本地转发本质上是一样的,主要区别在于需要转发的端口是在远程主机还是在本地主机上
SSH远程端口转发:实现访问内网的资源
内网通过SNAT可以访问外网,外网无法直接访问内网,内网主机通过SSH远程转发实现外网主机访问内网资源
ssh -Nf -R 192.168.1.150:7788:10.10.10.2:80 192.168.1.150
ssh服务器监听7788端口
[root@router~]# iptables -nL -t nat
如何去除限制
[root@server3~]#iptables -D INPUT 1
[root@server3~]#iptables -nL
我再来梳理一下:
在内网[root@server3~]# ssh -Nf -R 192.168.1.150:7788:10.10.10.2:80 192.168.1.150
在外网[root@localhost~]#elinks --dump 127.0.0.1:7788
在内网[root@server2~]#tail /var/log/httpd/access_log
动态转发(dynamic forwarding)
如果我们想用一个本地端口访问不同的外部服务,那就要将ssh作为socks代理服务,socks也是一种网络协议,它用于客户端和服务器之间数据传输的代理服务
这种动态转发很类似于一种代理服务器的效果;
防火墙允许内网主机A访问外网,禁止主机B访问外网,在内网主机B上通过SSH动态转发实现主机A访问外网
ssh -Nf -D 10.10.10.3:7788 10.10.10.2
[root@router~]#iptables -A FORWARD -s 10.10.10.3 -p tcp -dport 80 -j REJECT