本文最后更新于 196 天前,其中的信息可能已经有所发展或是发生改变。
实验了解ssh本地端口转发和远程端口转发
背景:办公内网无法被直接访问但是可以通过总部远端服务器访问.
家里的电脑A可以访问总部服务器但是访问不了办公网,
那么问题来了:A想访问自己公司的D怎么办?
此时我们就可以用到ssh的本地转发 作用就是 A能通过B访问D
准备:三台linux主机A(仅主机vnet1)B(仅主机vnet1+nat)D(nat)
ssh本地转发
- 防火墙 ssh http等配置自行去解决
- 开始连接
ssh -L 192.168.100.128:8080:192.168.10.130:80 www@192.168.100.129
# A本地IP和随便一个不用的端口:想要连接的ip和端口 B的转发ip
可以看到A端口监听已经打开 监听的8080
这个时候不要关闭执行-L命令后的窗口 新开一个窗口用于测试
我们访问本地监听的端口8080
可以看到我们并没有开启http服务 但是却访问到了网页内容
说明 所有想要访问我们A机8080端口的流量都会送到D的80端口
本地转发总结:
- 在本地计算机上运行 ssh -L 192.168.100.128:8080:192.168.10.130:80 www@192.168.100.129。
- 本地计算机在 localhost:8080 上监听。
- 当本地应用程序连接到 localhost:8080 时,SSH 客户端通过 SSH 隧道将请求转发到 192.168.100.129
- 129 将请求转发到 192.168.100.130:80。
- 数据库服务器返回的响应通过相同的路径返回到本地计算机 所以curl本地8080端口出现了130的http网页。
相对应的二端口可以自行更改比如 80 改成其他提供服务的端口 再用合适的软件去访问.
拓展:
ssh -CfN -L 本地端口:目标主机:目标主机端口 user@中转服务器IP
# -N 不执行登录shell
# -f 不占用终端窗口
# -C 压缩传输,增加传输效率
ssh远程转发
还是沿用上述实验拓扑 A B D
实验场景:D现在搭建了web服务 但是呢他不想将自己的端口暴漏在公网 所以它通过ssh远程端口转发 让A(客户)通过中转服务器B访问D的web服务
开始连接
- D主机执行
ssh -Nf -R 9990:localhost:80 www@192.168.100.129
- B主机查看是否监听9990
- 测试 这时候你使用A作为客户端 去访问B的9990试一下
curl 192.168.100.129:9990
远程端口转发总结:
- 在D计算机上运行 ssh -Nf -R 9990:localhost:80 www@192.168.100.129
- 中转服务器监听9990。
- 当远程用户A连接到 192.168.100.129;9990 时,SSH 服务器通过 SSH 隧道将请求转发到D上的 localhost:80。
- D计算机返回的响应通过相同的路径返回到远程用户
ssh动态端口转发
SSH 动态转发(SSH Dynamic Port Forwarding)是一种通过 SSH 隧道实现的代理功能,它允许在本地计算机上创建一个 SOCKS 代理服务器,从而使得所有通过这个代理的流量都通过 SSH 隧道加密并转发到远程服务器。与本地转发和远程转发不同,动态转发不需要预先指定目标主机和端口,而是可以动态地决定目的地,这使其更加灵活。
ssh -D 9900 www@192.168.100.129
配置应用代理端口为本地9900
然后A去访问D D此时抓包可以看到 流量是从B来的
ssh动态端口转发总结:
- ssh -ND 9900 www@192.168.100.129
- 在浏览器或系统设置中将设置socks代理: 127.0.0.1:9900
- 然后本地所有的上网出口全部通过192.168.100.129进行转发。
- 动态端口转发则只是绑定了一个本地端口,而目标地址:目标端口则是不固定的
- 目标地址:目标端口是由本地发起的请求决定的
- 比如访问baidu.com 则相当于把这个请求首先发送到了B,然后由B进行访问后将数据转发回至本地 即: 访问百度流程变成 本地 -> B -> 百度