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 [email protected] -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 [email protected] -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

然后执行

sudo systemctl daemon-reload
sudo systemctl start autossh.service
sudo systemctl enable autossh.service

注意:

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

你可能感兴趣的:(Linux操作笔记,linux,ssh,服务器)