前言
有时候由于网络策略的限制,我们无法直接访问目标服务,但有个中间服务器两边互通且可以ssh访问,这时候就可以借助ssh实现端口转发。
ssh端口转发一般有三种:本地端口转发、远程端口转发和动态端口转发
本地端口转发
假设A服务器部署了一个80端口的web服务,但是该服务器只开放了ssh端口22,想要访问web服务的话,可以通过ssh本地端口转发实现。
命令格式:
# 跳板机的ssh端口如果不是默认的22,需要使用 -p 选项指定端口号 ssh -L 本机闲置端口号:目标主机IP:目标主机端口 远程主机用户@远程主机IP
- 示例,本地想访问192.168.1.3的22端口,但只能直连192.168.1.2
# 12345是本机任意未被占用的端口号 ssh -L 12345:192.168.1.3:22 zhangsan@192.168.1.2
- 主机A测试
ssh -p 12345 lisi@localhost
远程端口转发
假设A服务器到B服务器无直连端口,A服务器也没对B服务器开放ssh端口,但是A服务器能通过ssh连接到B服务器。如果B服务器想要访问A服务器的80端口,借助远程端口转发即可实现。
# A服务器执行 ssh -R B服务器闲置端口:A服务器IP:A服务器的80端口 B服务器系统用户@B服务器IP
- 示例,本地(192.168.1.2)想要访问192.168.1.3的80端口,在192.168.1.3先执行:
ssh -R 8001:192.168.1.3:80 zhangsan@192.168.1.2
- 本地访问8001端口测试
注意:
- sshd_config里要打开
AllowTcpForwarding
选项,否则-R
远程端口转发会失败。 - 默认转发到远程主机上的端口绑定的是
127.0.0.1
,如要绑定0.0.0.0
需要打开sshd_config里的GatewayPorts
选项。
动态转发
假设内网环境只开放了A服务器的ssh端口可供连接,想要访问内网所有服务器且不配置多个本地端口转发的话,动态转发就可以实现,该功能也常被用做魔法上梯。动态转发建立的隧道网络协议为socks 5协议。
命令格式:
# 12345是本地任意未被占用的端口号 # 远程主机的ssh端口号默认为22,如果不是,则需要使用 -p 选项指定端口号 ssh -D 本地闲置端口号 远程主机用户@远程主机IP
其它
- 每60秒发送一个keepalive请求,保证连接不会因为超时空闲而断开
ssh -o ServerAliveInterval=60
-L
可同时指定多个代理规则-N
不执行远程命令-C
压缩所有数据-f
放置后台运行-T
不分配tty