技术分享
SSH隧道代理
00 分钟
2023-12-26
2024-1-6
type
status
date
slug
summary
tags
category
icon
password

理解清楚SSH端口转发

  • SSH简单的理解就是2台机器之间安全的数据通道,它包括ssh的client和ssh的server2个角色,这样的一条通道也就是ssh隧道(ssh tunneling)
  • SSH 端口转发自然需要 SSH 连接,而 SSH 连接是有方向的,从 SSH Client 到 SSH Server
  • 我们的应用的请求也是有方向的,一般是客户端向服务器端发出请求
  • 一旦这2个方向相同,我们称为ssh的本地转发(-L),不同则为远端转发(-R)
  • 命令一般是跑在ssh client的机器上的

本地转发

ssh本地转发命令
从本地的端口发出请求,通过这台机器作为跳板转发请求到的端口。 是相对而言的,比如是127.0.0.1的话,就是本身。 所以一般如果是127.0.0.1的话,跳板机或者代理服务器就是目标服务器
  1. A是一台在我家的机器macbook air,它可以访问taobao,也就是服务器C
  1. B是一台在公司的机器imac,由于在公司的内网,所以在家的A访问不到B
  1. C是taobao的服务器,公司不让上taobao,所以服务器B访问不了C
现在要想在让B服务器能访问C的80端口,由于防火墙这条路本身是走不通的,但是由于B能访问A,A能访问C,所以能把A作为代理服务器实现这一要求。
在服务器B和服务器A之间建立ssh隧道,在SSH端口转发中,由于服务器B能连接到服务器A,并且请求是从服务器B发出,所以B既是ssh的client,也是请求的客户端 所以此时应该在B上去运行ssh的本地转发命令: ssh -L 8080:HOST_C:80 HOST_A

远端转发

ssh远端转发的命令
由于本身B是可以访问A的,但是A访问不到B,现在要想服务器A访问到B,也就是在家能连上公司的机器。
服务器B能连上A,所以B应该是ssh的client,此时请求是由A发起的,所以A是请求客户端,方向不同,所以是远端转发。 因此在B上运行命令: ssh -R 2222:127.0.0.1:22 HOST_A ,这里127.0.0.1是因为通过A服务器转发的目的服务器就是A本身。 这样在A上的2222端口就映射到了B的22端口。

动态转发

不管是本地转发还是远端转发,都需要一个具体的应用服务器的地址和端口号,要想访问其他机器的内容就得绑定很多条这样的转发命令, 通过动态转发就能省去这一个应用服务器的信息。

当我们在一个不安全的 WiFi 环境下上网,用 SSH 动态转发来保护我们的网页浏览等信息无疑是十分必要的。 比如在本机运行: sh -D 7001 <SSH Server> 这样就相当于通过创建了一个SOCKS代理。
我们可以直接使用localhost:7001 来作为正常的 SOCKS 代理来使用,直接在浏览器上设置即可。 在 SSH Client 端无法访问的网站现在也都可以正常浏览。 而这里需要值得注意的是,此时 SSH 所包护的范围只包括从浏览器端(SSH Client 端)到 SSH Server 端的连接,并不包含从 SSH Server 端 到目标网站的连接。 如果后半截连接的安全不能得到充分的保证的话,这种方式仍不是合适的解决方案。
这个时候还可以在本机将SOCKS代理转成HTTP代理。 比如在本地安装polipo,修改polipo.conf文件,把SOCKS代理填上127.0.0.1:7001,然后 export http_proxy="127.0.0.1:8123" && export https_proxy="127.0.0.1:8123" 就在本地的8123端口起了一个http代理。

参考资料