SSH端口转发

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







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值