如何在 Linux 中执行本地 ssh 端口转发

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 。

日期:2020-06-02 22:17:02 来源:oir作者:oir