- 端口转发两大功能
- 加密SSH Client 端至SSH Server 端之间的通讯数据
- 突破防火墙或内网的限制完成一些之前无法建立的TCP 连接
正向端口转发
L
表示正向转发;-N
表示非不执行命令,只做端口转发;-f
表示在后台运行
ssh -NfL <local port>:<dest addr>:<dest port> <usr@jump addr>
# 举例
client$ ssh -NfL 1080:server:1081 jumpbox
- 把client的1080端口通过跳板机jump转发到server的1081端口
- 在client端建立转发连接
- 数据传递过程
- 首先数据会发送到本机1080端口
- 再在本机开一个随机端口,充当ssh客户端,把数据流量发送到jumpbox22端口的ssh服务端
- jumpbox收到数据以后,解密数据,临时开一个随机端口充当客户端,再把流量发送到server的1081端口
- 本地到 ssh 跳板机这一段,是完全加密的。跳板机到服务器的这一段,依然是明文的
反向端口转发
-R
表示反向转发
ssh -NfR <client port>:<dest addr>:<dest port> <usr@client addr>
# 举例
jump$ ssh -NfR 1080:server:1081 client
-
主要针对内网的情况。本地计算机在外网,ssh 跳板机和目标服务器都在内网,而且本地计算机无法访问内网之中的跳板机,但是跳板机可以访问本机计算机
- 由于本机无法访问跳板机,就无法从外网发起隧道,必须反过来,从跳板机发起隧道
-
把client的1080端口通过跳板机jump转发到server的1081端口
- 在jump端建立转发连接
- 数据传递过程同上
-
跳板机同时也可以是目标服务器,此时实现了外网的用户端访问位于内网的服务器
server$ ssh -NfR 10086:localhost:22 <usr@client addr>
# client访问
client$ ssh root@server -p 10086
- 这里的用户端一般是位于外网的跳板机,这样用户可以通过跳板机访问服务器
- client可以首先登陆到位于外网的机器,然后输入wwt用户在server密码就可以登陆到server,但是这样还是略显麻烦
- 可以把 jump 机的ssh端口开放在 0.0.0.0 而不是默认的127.0.0.1就可以直接在 client 端登陆到server
- 需要修改jump机的
/etc/ssh/sshd_config
文件,添加GatewayPorts yes
。然后重启sshd服务 - 这时候还需要把远程端口转发命令做点小修改
server$ ssh -NfR 0.0.0.0:10086:localhost:22 <usr@junmp addr>
# client访问
# 注意这里的用户是server上的用户,不是jump上的
client$ ssh wwt@jump -p 10086
动态端口转发(socks5代理)
-D
表示动态转发
ssh -NDf 1080 <user@proxy addr>
- 这种转发采用了 SOCKS5 协议,需要支持把 HTTP 请求转成 SOCKS5 协议,才能把本地端口的请求转发出去
- 在浏览器设置代理
socket proxy:127.0.0.1:1080
- 在浏览器设置代理
curl -x socks5://localhost:1080 http://www.example.com
- 前面的代理都是静态代理,也就是建立时就指定好了server地址
- 动态转发要把本地端口绑定到 ssh 跳板机。至于 ssh 跳板机要去访问哪一个网站,完全是动态的,所以叫做动态转发
实战
- 现在有两个位于不同内网的主机A,B;两者无法直接通行;另外有一个跳板机器jumpbox
- 实现要让A主机SSH到B上
B$ ssh -NfR 10086:localhost:22 jumpbox # 把本地22反向转发到jumpbox的10086
A$ ssh -NfL 10001:localhost:10086 jumpbox # 把本地10001转发到jumpbox的10086
# 此时A可以SSH到B了
A$ ssh localhost -p 10001
参考:
来源:CSDN
作者:_萤火
链接:https://blog.csdn.net/winter_wu_1998/article/details/103745072