最近公司项目上线,由于需要先跑一遍脚本去处理线上的旧数据,但是线上的库只有在线上服务器才可以连接,本地是直接连不通的,所以想到了使用ssh端口转发来通过线上的服务器当做跳板机远程连接到线上的数据库。同理在外网想连接内网的机器也是行得通的

ssh端口转发

  1. sshd_config里要打开AllowTcpForwarding选项,否则-R远程端口转发会失败。
  2. 默认转发到远程主机上的端口绑定的是127.0.0.1,如要绑定0.0.0.0需要打开sshd_config里的GatewayPorts选项。这个选项如果由于权限没法打开也有办法,可配合ssh -L将端口绑定到0.0.0.0,聪明的你应该能想到办法
-f 后台执行ssh指令
-C 允许压缩数据
-N 不执行远程指令
-R 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
-L 本地端口转发
-D 动态端口转发

本地转发

ssh -NL [端口]:[目标IP]:[目标端口] [跳板机用户名]@[跳板机IP]
ssh -NL 13306:aliyuncs.com:3306 root@39.23.80.6
# 访问 127.0.0.1:13306     ->  aliyuncs.com:3306

本地转发是将 目标ip:目标端口 映射到 127.0.0.1:端口
即: 访问127.0.0.1:端口等于访问目标ip:目标端口

远端转发

ssh -NR [端口]:[目标IP]:[目标端口] [跳板机用户名]@[跳板机IP]
ssh -NR 8080:47.104.164.235:80 root@8.136.136.247
# 访问8.136.136.247:8080    -> 47.104.164.235:80

ssh -NR 8000:8.136.136.247:80 root@47.104.164.235
# 访问47.104.164.235:8000   ->   8.136.136.247:80

远端转发是将 目标ip:目标端口 映射到 跳板机的ip:端口
即: 访问跳板机的ip:端口等于访问 目标ip:目标端口

动态转发(相当于代理服务器)

ssh -ND [本地socke代理端口] [跳板机用户名]@[跳板机IP]
ssh -ND 2000 root@47.104.164.235

# 在浏览器或系统设置中将socke代理改成本地  127.0.0.1:2000 
# 然后本地所有的上网出口全部通过47.104.164.235进行转发。百度ip会发现本机ip是47.104.164.235

动态端口转发则只是绑定了一个本地端口,而目标地址:目标端口则是不固定的

目标地址:目标端口是由本地发起的请求决定的

比如访问baidu.com 则相当于把这个请求首先发送到了47.104.164.235,然后由47.104.164.235进行访问后将数据转发回至本地

即: 访问百度流程变成 本地 -> 47.104.164.235 -> 百度

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐