• Linux-SSH反向连接(内网穿透,打洞)



    场景


    对于外网来说,公司内部的是内网,中间隔了个防火墙,如果想从外网去访问公司内部网络,正常情况下是不可行的,也无法做到端口转发(除非在公司防火墙上打个洞),一般场景有外网访问公司内网,外网访问学校的内网。

    理论


    外网无法访问到内网,归根结底就是因为内网对于外网不可见,一般要实现外网访问到内网,有两种方法:一种是端口映射,就相当于将内网主机的某个端口在防火墙上开放出来,这样一来就相当于是两台外网主机的通信了;另一种就是SSH反向连接,就是内网是可以访问到外网的,那么内网主机先主动连接外网主机,这样一来就建立了连接,然后外网主机就可以ssh登录到内网主机了,这就是所谓的反向连接。但是这种连接是不稳定的,可能会断掉,但也有方法解决。

    操作


    1. 首先做以下假设,A要连接B
      A-外网服务器172.16.32.11 ssh端口为88
      B-内网主机192.168.137.110 ssh端口为22
    2. B先主动连接A
      ssh -NfR 1234:localhost:22 user1@172.16.32.11 -p 88
      -f 后台执行ssh指令
      -N 不执行远程指令
      -R 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
      -p 指定远程主机的端口
      1234是远程主机A的端口,就是外网服务器A的1234端口与内网B的22端口绑定,相当于是端口映射。
    3. 查看服务器A的1234端口
      执行完步骤2后,这时候可以在远程服务器A上查看端口1234
      ss -ant |grep 1234
      输出为:
      LISTEN 0 128 127.0.0.1:1234 *:*
      这是1234端口已经和22端口绑定了,A上监听着
    4. 在远程服务器A上ssh登录内网主机B
      ssh username@localhost -p 1234
      记得要指定端口为1234,这样子就能访问到内网了,实现了ssh反向连接。

    解决断开连接


    前面说过这种反向连接不稳定,可能随时会断开,这时候又得重复上面步骤去打通,而当你无法登陆上内网主机去操作以上的步骤时候,那就没法玩了。
    这时可以使用autossh来解决这个随时断开的问题。
    具体指令为:
    autossh -M 2000 -NfR 1234:localhost:22 user1@172.16.32.11 -p 88
    解释:

    1. autossh和ssh在指令上的区别就是多了一个-M参数,这个参数指定一个端口,这个端口是外网的A用来接收内网主机B的信息,如果隧道不正常则返回给内网主机B让他实现重新连接
    2. 简单来说就是多指定了一个端口,用于监听ssh反向连接是否断开。

    开机自动启动autossh


    ubuntu下设置autossh开机自动启动

    1. 编写service文件
      vi /lib/systemd/system/autossh.service
      写入以下内容
    [Unit]
    Description=Robust SSH Reverse Tunnel and Port Forward
    After=network.target
    [Service]
    User=ubuntu
    ExecStart=/usr/bin/autossh -M 2000 -fNR 1234:localhost:22 -i /home/ubuntu/.ssh/id_rsa  172.16.32.11
    KillMode=process
    [Install]
    WantedBy=multi-user.target
    Alias=autossh.service
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    然后执行

    sudo systemctl daemon-reload
    sudo systemctl start autossh.service
    sudo systemctl enable autossh.service
    
    • 1
    • 2
    • 3

    注意:

    ssh的配置文件中要把GatewayPorts修改为yes

  • 相关阅读:
    向虚拟机里拖文件,VMtools安装问题
    ElasticSearch(一):介绍、安装、文档分词
    Fiddler - The system proxy was changed. Click to reenable capturing.
    亚马逊、ebay、沃尔玛卖家打造爆款如何利用测评提高转化率?
    现代C++学习指南-类型系统
    说要内推阿里的学长,替我整理好的Java面试题,分享给大家
    R语言ggplot2添加单个文本或多个文本
    Linux常用命令——cd命令
    雷达编程实战之幅度与相位标定
    蓝桥杯历年真题省赛java b组 2016年 第七届 抽签
  • 原文地址:https://blog.csdn.net/chisuisi5702/article/details/126283977