SSH 支持多种跨伪 VPN 隧道移动数据的方式。
其中一种方法是端口转发,它在本地计算机和远程计算机之间建立安全连接,通过加密隧道传输数据。
端口转发的类型
有 3 种类型的端口转发可以在 Linux 上执行,即
- 本地的
- 远程的
- 动态的
特点
- 隧道支持 - 用于移动数据的伪 VPN
- 将本地端口隧道连接到远程系统以供本地系统用户使用
- SSHD 绑定到本地端口并提供对远程端口的访问
- 默认端口转发绑定到 IPv4(127.0.0.1) 和 IPv6(::1) 的环回地址
- 能够通过第三台服务器将本地端口转发到目标服务器。
假设我们要保护对 machine1 上的 telnet 守护程序的访问。
由于 telnet 是由 xinetd 控制的,所以我们将强制 telnet 而不是绑定到所有网络接口上的所有 IP 地址,只绑定到本地环回地址。
确保你已经安装了 telnet-server
# rpm -qa | grep telnet-server
如果没有,我们可以使用 yum 安装
# yum -y install telnet-server
接下来让我们将 telnet 绑定到环回地址(在 machine1 上)
# vi /etc/xinetd.d/telnet service telnet { flags = REUSE socket_type = stream wait = no user = root server = /usr/sbin/in.telnetd log_on_failure += USERID disable = no bind = 127.0.0.1 }
[root@machine1 ~]# /etc/init.d/xinetd restart Stopping xinetd: [ OK ] Starting xinetd: [ OK ]
让我们验证我们是否可以在本地 telnet,我们也可以使用 netstat 检查
[root@machine1 ~]# netstat -ntlp | grep 23 tcp 0 0 127.0.0.1:23 0.0.0.0:* LISTEN 3405/xinetd
所以我们应该能够在端口 23 上 telnet 我们的本地主机
# telnet localhost 23 Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. CentOS release 6.5 (Final) Kernel 2.6.32-431.el6.x86_64 on an x86_64 login: jack Password: [Password for jack]
如我们所见,我能够在本地使用系统凭据登录,但是如果我尝试从远程计算机执行相同操作会怎样。
让我们尝试在端口 23 上从机器 2 telnet machine1
[root@machine2 ~]# telnet machine1 23 Trying 192.168.1.11... telnet: connect to address 192.168.1.11: No route to host telnet: Unable to connect to remote host: No route to host
效果不太好,因为我们已将 telnet 请求绑定到环回地址
现在让我们使用 ssh 来加密客户端和服务器之间的隧道
工作原理
ssh_client -> ssh_server 创建加密隧道
我们将绑定到 2323 之类的端口,并通过 ssh 隧道将其转发到远程系统端口 23,所有端口都绑定到环回适配器。
因此,我们在本地连接到本地套接字的 2323,以防万一有木马二进制文件充当网络中的网络嗅探器,那么它将能够获取这些类型的连接,但无法识别进入 VPN 隧道的数据。
local(127.0.0.1:2323) -> SSH_TUNNEL -> Remote(127.0.0.1:23)
语法:
ssh -L ip_address:2222:destination_system:destination_port user@gateway
我们将 ip_address 字段留空,让 ssh 确定自己使用绑定到我们以太网卡的默认 IP 地址,例如:eth0 使用 192.168.1.12 的网关
让我们举个例子。
我们将使用网关在本地将端口 2323 绑定到端口 23,例如:machine2
# ssh -L 2323:127.0.0.1:23 machine2
注意:除非我们要使用的端口需要 root 级别的权限,否则我们不需要是 root 来执行此操作:(< 1024) 也称为众所周知的端口。
[root@machine1 ~]# ssh -L 2323:127.0.0.1:23 machine2 Last login: Fri Oct 3 05:30:26 2014 from machine1 [root@machine2 ~]#
所以我们在 machine2 上。
现在让我们尝试使用来自 machine1 的新端口 2323 连接 telnet 客户端
[root@machine1 ~]# telnet localhost 2323 Trying ::1... Connected to localhost. Escape character is '^]'. CentOS release 5.2 (Final) Kernel 2.6.18-92.el5 on an i686 login: jack Password: Last login: Fri Oct 3 05:31:09 from machine1 [jack@machine2 ~]$
如您所见,我提供了我的用户凭据,即使我尝试登录 localhost,结果连接到的是 machine2 。