SSH隧道与反隧道

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/aryoyo/article/details/85407214

 

1.SSH的端口转发也叫SSH隧道,为主机之间的通信建立了安全的传输数据的通道。  
   SSH隧道还可以实现穿越防火墙等访问限制来访问主机数据。

测试环境,建立3个虚拟机器:
A机器使用bridged模式:hostname是demo,ip地址是 192.168.0.106
B机器2个网卡:hostname是rhel64-64bit,bridged的网卡地址:192.168.0.101
                                                                  host-only的网卡地址:192.168.220.131
c机器使用host-only模式:hostname是yaya,ip地址是192.168.220.130

      

查看B机器地址:
root@rhel64-64bit rules.d]# ip add
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:22:98:4d brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.101/24 brd 192.168.0.255 scope global eth0
    inet6 fe80::20c:29ff:fe22:984d/64 scope link 
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:9a:92:7e brd ff:ff:ff:ff:ff:ff
    inet 192.168.220.131/24 brd 192.168.220.255 scope global eth1

A---->B  A(192.168.0.106)可以ping通B的地址192.168.0.101
B---->C  B(192.168.220.131)可以ping通C的地址192.168.220.130
在没有任何网关,路由的设置下A与C机器是没法通信的,但是如果A想访问C机器上
的某个服务,如tomcat,就可以使用B->C之间的SSH通道实现:

B机器可以ping通C机器:
[root@rhel64-64bit rules.d]# ping 192.168.220.130
PING 192.168.220.130 (192.168.220.130) 56(84) bytes of data.
64 bytes from 192.168.220.130: icmp_seq=1 ttl=64 time=0.282 ms
64 bytes from 192.168.220.130: icmp_seq=2 ttl=64 time=0.439 ms

A机器ping不通C机器:
[root@demo instance]# ping 192.168.220.130
PING 192.168.220.130 (192.168.220.130) 56(84) bytes of data
--- 192.168.220.130 ping statistics ---
48 packets transmitted, 0 received, 100% packet loss, time 
在B机器上创建B->C的SSH隧道:
[root@rhel64-64bit rules.d]# ssh -g -f -N -L 8080:192.168.220.130:8080 root@192.168.220.130
root@192.168.220.130's password: 

[root@rhel64-64bit rules.d]# netstat -tnlp|grep 8080
tcp        0      0 0.0.0.0:8080         0.0.0.0:*        LISTEN      25121/ssh           
tcp        0      0 :::8080              :::*             LISTEN      25121/ssh      
     
[root@rhel64-64bit rules.d]# ps -ef|grep 8080
root     25121     1  0 18:48 ?        00:00:00 ssh -g -f -N -L 8080:192.168.220.130:8080  
                                                root@192.168.220.130
root     24854  9689  0 18:50 pts/1    00:00:00 grep 8080

由上面可以见B机器也在监听8080端口,此时从A机器访问B机器的8080端口,就会被转发到C机器的8080端口了,
此时A访问B的8080端口等于访问C机器的tomcat服务:

此时查看B机器上的连接:
[root@rhel64-64bit rules.d]# netstat -pan|grep 8080
tcp        0   0 0.0.0.0:8080         0.0.0.0:*           LISTEN      25121/ssh           
tcp        0   0 192.168.0.101:8080   192.168.0.106:41122 ESTABLISHED 25121/ssh           
tcp        0   0 192.168.0.101:8080   192.168.0.106:41121 ESTABLISHED 25121/ssh           
tcp        0   0 :::8080              :::*                LISTEN      25121/ssh

2.SSH反隧道

测试环境,建立2个虚拟机器:
B机器2个网卡:hostname是rhel64-64bit,bridged的网卡地址:192.168.0.101                                                             
                                                                  host-only的网卡地址:192.168.220.131
c机器使用host-only模式:hostname是yaya,ip地址是192.168.220.130

          

在C上建立防火墙规则以至于B不能访问C:

B不能访问C机器:
[root@rhel64-64bit rules.d]# ping 192.168.220.130
PING 192.168.220.130 (192.168.220.130) 56(84) bytes of data.
From 192.168.220.130 icmp_seq=1 Destination Port Unreachable
From 192.168.220.130 icmp_seq=2 Destination Port Unreachable

C可以访问B机器:
[root@yaya init.d]# ping 192.168.220.131
PING 192.168.220.131 (192.168.220.131) 56(84) bytes of data.
64 bytes from 192.168.220.131: icmp_seq=1 ttl=64 time=0.341 ms
64 bytes from 192.168.220.131: icmp_seq=2 ttl=64 time=0.707 ms
64 bytes from 192.168.220.131: icmp_seq=3 ttl=64 time=0.241 ms

这时候B访问不了C了,如果还想向上面SSH隧道一样,访问B机器的8080端口
等于访问C机器的tomcat服务(8080端口),能不能实现呢,
可以的。SSH反隧道就能实现

在C机器上创建反隧道:
[root@yaya init.d]# ssh -g -f -N -R 8080:192.168.220.130:8080 root@192.168.220.131
root@192.168.220.131's password: 

[root@yaya init.d]# ps -ef|grep ssh
root      2229     1  0 18:03 ?        00:00:00 /usr/sbin/sshd
root     10153     1  0 20:28 ?        00:00:00 ssh -g -f -N -R 8080:192.168.220.130:8080 
                                       root@192.168.220.131
root     10309  3613  0 20:37 pts/0    00:00:00 grep ssh


在B机器上观察,8080端口也被监听了,但是即使加了-g参数,也是只监听在127.0.0.1地址上:
[root@rhel64-64bit rules.d]# netstat -pan|grep 8080
tcp        0  0 127.0.0.1:8080    0.0.0.0:*          LISTEN      26787/sshd          
tcp        0  0 ::1:8080          :::*               LISTEN      26787/sshd

B上访问127.0.0.1:8080也就访问到了C的tomcat服务了,之前虽然设置防火墙规则阻挡B访问C机器,
SSH反隧道建立后,访问B的8080端口仍旧可以访问C的服务:

B机器上再次查看:
[root@rhel64-64bit rules.d]# netstat -pan|grep 8080
tcp        0      0 127.0.0.1:8080              0.0.0.0:*                   LISTEN      26787/sshd          
tcp        0      0 127.0.0.1:8080              127.0.0.1:41395             ESTABLISHED 26787/sshd          
tcp        0      0 127.0.0.1:8080              127.0.0.1:41394             ESTABLISHED 26787/sshd          
tcp        0      0 127.0.0.1:41393             127.0.0.1:8080              ESTABLISHED 24318/firefox       
tcp        0      0 127.0.0.1:41395             127.0.0.1:8080              ESTABLISHED 24318/firefox       
tcp        0      0 127.0.0.1:8080              127.0.0.1:41393             ESTABLISHED 26787/sshd          
tcp        0      0 127.0.0.1:41394             127.0.0.1:8080              ESTABLISHED 24318/firefox       
tcp        0      0 ::1:8080                    :::*                        LISTEN      26787/sshd       

总结:

SSH隧道:A----->B----->C
A可访问B,B可访问C
A访问不了C
建立B与C的SSH隧道,即可让A通过B来访问到C的对应服务
(感觉些些像DNAT,C机器的网关设置为B机器的192.168.220.131,在B的nat表上添加DNAT规则做端口映射:
iptables -t nat -I PREROUTING -d 192.168.1.101 -p tcp --dport 8080 -j DNAT --to-destination 192.168.220.130:8080)

SSH反隧道:
A----->B<-----C
A可访问B,C可访问B
A访问不了C,B也访问不了C
建立C与B的SSH反隧道,既可让B访问到C对应服务,也可以让A通过B来访问到C的对应服务
(上面的测试实验有点问题,ssh反隧道建立后B只能在127.0.0.1监听端口,貌似autossh可以...下次试试...)

所以除了建立加密的安全通道外,SSH隧道还可以穿透防火墙内外网等限制
来访问到本来访问不了的主机。

 

展开阅读全文

没有更多推荐了,返回首页