一、SSH端口转发简介
SSH
能够将其他TCP
端口的网络数据通SSH
链接进行转发,且自动提供相应的加密及解密服务。因为相当于提供了一个安全通道,所以这一过程被叫做"隧道"(tunneling
)。例如,Telnet
,SMTP
,LDAP
这些TCP
应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果在工作环境中,被防火墙限制了一些网络端口的使用,但是允许SSH
的连接,也能够将通过ssh
端口转发来进行通讯。
1.1 SSH端口转发的两大功能
- 加密SSH Client端至SSH Server端之间的通讯数据。
- 突破防火墙的限制完成一些之前无法建立的TCP连接。
二、本地转发
命令:
ssh -L localport:remotehost:remotehostport sshserver
说明:
localport 本机开启的端口号
remotehost 最终连接机器的IP地址
remotehostport 最终连接机器的端口号
sshserver 转发机器的IP地址
选项:
-f 后台启用
-N 不打开远程shell,处于等待状态(不加-N则直接登录进去)
-g 启用网关功能
实验一:实现SSH端口转发——本地转发
- 背景:企业内部服务器C(123)不允许外部直接访问,服务器B(122)是一个ssh服务器,有一个用户A(121)需要从外部连接到企业内部的C服务器。
- 原理:用户A通过ssh协议连接到B机器上,再通过B机器做跳板,连接至C机器。
图示如下:
- 实验步骤:
1)模拟服务器C不允许A用户连接,在服务器C上输入以下口令:
[root@123 ~]# iptables -A INPUT -s 192.168.75.121 -j REJECT
此时,从A(121)用ssh命令连接服务器C是拒绝的:
[root@121 ~]# ssh 192.168.75.123
ssh: connect to host 192.168.75.123 port 22: Connection refused
2)开启端口转发:
首先,我们在机器A上确认已经开启的端口有哪些:
[root@121 ~]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1019/master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 940/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1019/master
tcp6 0 0 :::22 :::* LISTEN 940/sshd
从上图中我们已经看出,2222端口没有被占用,所以我们可以选择使用2222端口:
接着我们建立本地转发的隧道(A上输入以下命令):
[root@121 ~]# ssh -L 2222:192.168.75.123:22 -fN 192.168.75.122
3)在服务器A(121)上输入以下命令,顺利连接到服务器C:
[root@121 ~]# ssh 127.0.0.1 -p 2222
The authenticity of host '[127.0.0.1]:2222 ([127.0.0.1]:2222)' can't be established.
ECDSA key fingerprint is SHA256:p/44EpAOMkSa+lWcrqY6sPhex4UJcnSqSybKOliS+5U.
ECDSA key fingerprint is MD5:e1:eb:77:a9:5a:d5:b5:08:db:3e:d5:6d:bf:0b:d7:9c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[127.0.0.1]:2222' (ECDSA) to the list of known hosts.
小心!谨慎!Then enjoy your work!
Last login: Sat Feb 19 11:16:28 2022 from 192.168.75.121
[root@123 ~]#
[root@123 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:59:81:50 brd ff:ff:ff:ff:ff:ff
inet 192.168.75.123/24 brd 192.168.75.255 scope global noprefixroute ens32
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe59:8150/64 scope link
valid_lft forever preferred_lft forever
此时,我们可以查看一下服务器B的连接情况:
至此,我们已经实现了A用户在公司外部远程连接C机器的需求。
如果我们想要停止这个隧道,直接把后台的隧道进程杀死就可以了,命令如下:
# 获取ssh的进程:
[root@121 ~]# ps -ef | grep ssh
root 940 1 0 09:50 ? 00:00:00 /usr/sbin/sshd -D
root 1184 940 0 09:50 ? 00:00:00 sshd: root@pts/0
root 2922 1 0 14:53 ? 00:00:00 ssh -L 2222:192.168.75.123:22 -fN 192.168.75.122
root 2954 2877 0 15:06 pts/0 00:00:00 grep --color=auto ssh
# 关闭进程:
[root@121 ~]# kill -9 2922
本地端口转发的特点是:ssh
执行命令是在客户端(被限制的服务器)上执行的。
三、远程转发
在我们实验一的场景下,首先要满足的是防火墙上必须打开22端口或者其他端口。但是在现实生活中,企业出于安全考虑,只允许主动连接别人,不允许别人连接自己。所以,当防火墙的端口没有打开的时候,这时就要用到远程转发了。
命令:
ssh -R sshserverport:rhost:rport sshserver
说明:
sshserverport 被转发机器开启的端口号
rhost 最终连接机器的IP地址
rport 最终连接机器的端口号
sshserver 被转发机器的IP地址
选项:
-f 后台启用
-N 不打开远程shell,处于等待状态(不加-N则直接登录进去)
-g 启用网关功能
实验二、实现SSH端口转发——远程转发
- 背景:企业内部服务器C只允许
ssh
连接访问,不允许外部直接访问,服务器B是一个ssh
服务器,有一个用户A需要从外部连接到企业内部的C服务器。 - 原理:B机器访问A用户,给A用户转发
图示如下:
- 实验步骤:
1)模拟服务器C不允许A用户连接,在服务器C上输入以下口令:
[root@123 ~]# iptables -A INPUT -s 192.168.75.121 -j REJECT
此时,从A(121)用ssh命令连接服务器C是拒绝的:
[root@121 ~]# ssh 192.168.75.123
ssh: connect to host 192.168.75.123 port 22: Connection refused
2)开启隧道转发
这一次,由于防火墙完全关闭,外部的设备连接不进来,所以我们要通过服务器B去连接服务器A,因此,我们的开启隧道命令要在服务器B(122)上运行:
首先,我们要确定一下服务器B(122)上开启了哪些端口:
[root@122 ~]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 920/master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 844/sshd
tcp6 0 0 ::1:25 :::* LISTEN 920/master
tcp6 0 0 :::22 :::* LISTEN 844/sshd
然后,我们选择一个没有被开启的端口开启隧道,进行实验:
[root@122 ~]# ssh -R 2222:192.168.75.123:22 -fN 192.168.75.121
查看服务器A(121)的端口:
[root@121 ~]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1019/master
tcp 0 0 127.0.0.1:2222 0.0.0.0:* LISTEN 2992/sshd: root
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 940/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1019/master
tcp6 0 0 ::1:2222 :::* LISTEN 2992/sshd: root
tcp6 0 0 :::22 :::* LISTEN 940/sshd
3)在服务器A(121)上输入以下命令:
[root@121 ~]# ssh 127.0.0.1 -p 2222
小心!谨慎!Then enjoy your work!
Last login: Sat Feb 19 14:54:22 2022 from 192.168.75.122
[root@123 ~]#
此时,我们可以查看一下服务器B(122)的连接情况:
远程端口转发的特点是:ssh
执行命令是在中间跳转服务器上执行的。
至此,我们已经实现了A用户在公司外部远程连接C机器的需求。
对了,你们一直想要的Linux命令大全查询网站已经上线了,欢迎使用。