SSH Port Mapping

Scene

    • 正常来说在服务器部署了一个服务,要访问该服务得用该云服务器 ip + 端口
    • 然后去云服务器商设置开放端口,最后才能访问
    • 但是,我们只是想随手用一下而已,又懒得去开放端口
    • 这种时候可以用 SSH 端口映射

    • 我们想从公网去访问局域网内部的服务
    • 也可以利用 SSH 端口映射 把 云服务器的请求转发到 局域网内部设备里

    • 不同子网之间的访问
    • 内网穿透原理应该也是差不多

Solution

本地端口转发-从本地访问公网内部子网服务

  • 这里的操作视角为 本机 -> 云服务器
  • 这里的用户视角为 本机或处于同一网络下的机器 -> 云服务器
  • ssh root@ip 正常登录服务器
  • ssh -L 2222:localhost:8080 root@ip 这里就相当于把本机的 2222 端口 转发到 云服务器的 8080 端口
    • ssh -L 本机地址:云服务器内网地址 root@ip
    • 2222 其实是 localhost:2222 本机
    • 而 localhost:8080 指的是 服务器内网中该服务器的地址
    • 这个转发会在退出服务器登录时失效
  • ssh -L 192.168.1.200:2222:localhost:8080 root@ip
  • 最后,就可以使得与本机处于同一网段的机器一起使用该地址转发到 云服务器的 8080 端口

远程端口转发-从公网访问与本机不在同一网段的服务

  • 这里的操作视角为 远端子网机器 -> 云服务器
  • 这里的用户视角为 用户机器 -> 云服务器 -> 远端子网机器
  • ssh -R 3333:10.10.10.254:7777 root@ip 这里意思就是将云服务器的端口 转发到 远端子网机器的 3333 端口

    • ssh -R 云服务器内网地址:远端子网机器地址 root@ip
    • 3333 就是 云服务器的 localhost:3000
    • 10.10.10.254:7777 为远端子网机器的地址
    • 执行该命令后可用 netstat -anp | grep 3333 查看是否启用了监听该端口的服务
  • 当然这样还不行,问题在于安全问题,不能随意把远程端口开放了

    • SSH 默认把该操作关闭了
  • 修改配置,开放该操作
  • vim /etc/ssh/sshd_config
    -#GatewayPorts no
    +GatewayPorts yes
    
  • systemctl restart sshd
  • ssh -R 0.0.0.0:3333:10.10.10.254:7777 root@ip
  • netstat -anp | grep 3333 再次查看
  • 当然同时还要在云服务器商设置里把 3333 端口开放
  • 最后,就可以通过 云服务器公网 ip + 端口 访问到 远程子网的机器里的端口服务了

访问不同网络下的设备-两者结合

  • 在前面两个的基础上,远程机器设置转发,本地机器也设置转发
  • 就可以达到,利用处于公网的云服务器作为中介去访问不同网络下的机器
< - あの日途切れてしまった言葉を 繋ぎ留めたいだけ - >