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: 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: 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 [email protected]
[email protected]'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
[email protected]
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 [email protected]
[email protected]'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
[email protected]
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隧道还可以穿透防火墙内外网等限制
来访问到本来访问不了的主机。