用ssh反向隧道访问内网机器,在这里我使用了B机

作者: 操作系统  发布:2019-11-21

8. 结言:

总算配置好了,目前不清楚会不会断线,明天看看什么情况再进行更新吧。如有不对之处,请大家指正提出~


参考以下网站

从外网 SSH 进局域网,反向代理+正向代理解决方案

使用SSH反向隧道进行内网穿透

今天我看到ssh有一个有趣的功能,可以在不设置端口影射的情况下直接建立一个隧道,允许从外部访问内网的机器。

1. 描述一下目前的机器状况,梳理梳理:

机器 IP 用户名 备注
A 10.21.32.106 gdut728 目标服务器,处于内网
B 123.123.123.123 root 外网服务器,相当于桥梁的作用

PS:123.123.123.123只是我随意起的,大家请别攻击别人的服务器啊啊啊


2.3.再来看看Autossh的用法

2.2 介绍一下使用到的ssh参数:

因为之前dest到src的ssh反向隧道建立之后,src上的本地19999端口就被转发到dest的22端口了,所以上面这个ssh命令就建立了从src到dest:22的连接。

6. 这种反向代理的方式是不稳定的

不幸的是这种ssh反向链接会因为超时而关闭,如果关闭了那从外网连通内网的通道就无法维持了,为此我们需要另外的方法来提供稳定的ssh反向代理隧道。

4、为什么需要在主机B对远程连接映射一个本地连接?

2.1 实现前的准备

假设我们有两台机器,一台在内网中,IP是192.168.1.2,命名为dest;另一台在公网上,地址是pub.server.net,命名为src。我们需要从pub.server.net去访问内网那台192.168.1.2.

2. 解决方法:

通俗地说:就是在机器A上做到B机器的反向代理;然后在B机器上做正向的代理实现本地端口的转发

其中第一步可以加上-fN参数,这样就可以把ssh进程放到后台运行,且无需打开服务器端的shell。

7. 最后配置在Linux上配置开机自动启动autossh,免去了重启Linux后要自己启动的autossh的麻烦

输入:

vi /etc/rc.d/rc.local

添加内容:

autossh -M 7281 -fCNR 7280:localhost:22 root@123.123.123.123

因为centos7之后,原来直接修改/etc/rc.d/rc.local启动脚本自动生效的功能因为修改了需要重新赋予可执行权限

再输入 chmod +x /etc/rc.d/rc.local


在private上执行: ssh -NfR2222:localhost:22 root@public

正向代理

ssh -fCNL

-f 后台执行ssh指令
-C 允许压缩数据
-N 不执行远程指令
-R 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
-L 将本地机(客户机)的某个端口转发到远端指定机器的指定端口
-p 指定远程主机的端口

******************区分大小写啊各位亲******************

早就听说过ssh反向隧道,却一直没有尝试过,今日偶得之,简单做个记录。

6.1 ssh每次重连都需要键入密码,故在此首先设置免密码登陆到内网

在内网的机器A上面执行:

ssh-copy-id 外网用户名@外网IP 

按照之前我设定的端口,这个指令就是如下

ssh-copy-id root@123.123.123.123

图片 1

那以后这台内网的A机器ssh登陆我外网的B机器就可以免密码登陆啦~
检验是否已经可以使用免密码登陆可以使用如下指令来检验:

ssh root@123.123.123.123

图片 2

-f:后台执行

5. 展现奇迹的时候到了

至此我们都配置好了AB机器,那么我们就可以从一部外网的电脑登陆到内网里面去啦。鉴于我目前的电脑在内网,而服务器都是外网的(也就是配置的B机器),所以可以通过B机器连接到我内网的A中,具体指令为:

ssh -p1234 gdut728@123.123.123.123 

在此-p参数为指定登陆的IP,我们在上面指定了1234端口为转发端口,故用1234端口登陆,然后gdut728是内网A机器的用户名,123.123.123.123为外网B机器的IP地址。

图片 3


连接流程如下:

4. 接着在B上面操作:

建立B机器的正向代理,用来做转发,具体指令为

ssh -fCNL [A机器IP或省略]:[A机器端口]:[B机器的IP]:[B机器端口] [登陆B机器的用户名@B机器的IP]

按照第3那里输入的指令,这里的B机器的端口和上面的B机器的端口是一致的,端口1234的也是B机器的。

ssh -fCNL *:1234:localhost:7280 localhost

检验是否已经启动了可以使用ps aux | grep ssh指令来查看:

图片 4

在此1234端口为本地转发端口,负责和外网进行通信,并将数据转发的7280这个端口,实现了可以从其他机器访问的功能。同时,*号表示可以接受任何IP的访问。


为了简单明白,下面示例如何使用:

6.2 用autossh建立稳定隧道

centos7上没有默认安装autossh的,所以使用一下命令安装

yum install autossh

来看看具体的autossh的指令为

autossh -M 7281 -fCNR 7280:localhost:22 root@123.123.123.123 

autossh的参数与ssh的参数是一致的,但是不同的是,在隧道断开的时候,autossh会自动重新连接而ssh不会。另外不同的是我们需要指出的-M参数,这个参数指定一个端口,这个端口是外网的B机器用来接收内网A机器的信息,如果隧道不正常而返回给A机器让他实现重新连接。

图片 5


3.2、主机B sshd服务端创建本地连接很远程连接的映射(反向连接通道)。

每台都要安装ssh的客户端。

在这里我使用的是centos7,都自带ssh。如果是使用其他版本Linux,请手动Google一下咯。

2.2.复制B主机上生成的id_rsa.pub公钥到外网A主机上,并将内容加入到~/.ssh/authorized_keys中

前言

最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛。但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使用外网的小土豪就没有办法进入内网。这时能不能有一个办法可以使得通过外网连接到内网的服务器呢?答案是有的,不过这里就需要以下条件:一台在外网能访问到的服务器。

2.一开始提到,这种反向连接(Reverse Connection)不稳定,可能随时断开,需要内网主机B再次向外网A发起连接,这时需要个“朋友”帮你在内网B主机执行这条命令。它就是Autossh。

3. 首先在A上面操作:

建立A机器到B机器的反向代理,具体指令为

ssh -fCNR [B机器IP或省略]:[B机器端口]:[A机器的IP]:[A机器端口] [登陆B机器的用户名@服务器IP]

在这里我使用了B机器的7280端口,以及A机器的22端口,按照上面的指令就是这样子的操作

ssh -fCNR 7280:localhost:22 root@123.123.123.123

检验是否已经启动了可以使用ps aux | grep ssh指令来查看:

图片 6


ssh localhost -p 19999

反向代理

ssh -fCNR

P.S.

以daemon方式执行,相当于root去执行autossh, ssh,这时刚才普通用户目录下的.ssh/authorized_keys文件会不起效。有两种办法解决,一种是用autossh的参数指定.ssh路径;另外一种是以普通用户身份执行daemon,下面是第二种方式。

又,这种隧道一般而言需要长期保持,而ssh连接会超时断开,所以需要用autossh来保持隧道可用。

将上面命令放入下面各启动方式中,根据自己系统自己配置:

即将本地9999端口映射到本地2222端口,2222端口在之前已经映射到了private,那么,hahaha

systemd: /usr/lib/systemd/system/autossh.service

在public上登陆private:root@public:~# ssh root@127.0.0.1 -p 2222

$ssh-keygen...(一直按Enter,最后在~/.ssh/下生成密钥)

公网有台机器叫public,内网有台机器叫private,现在要实现从public到内网的访问,一条命令即可搞定。

SysV:/etc/inid.d/autossh

2.外网有路由的可设下端口映射

解释ssh参数:

为方便计,又可将以上命令作为一个upstart服务,令其自动加载。当别撰一文详述upstart服务设置方法。

用ssh反向隧道访问内网机器

在公司外任何一台机器上执行:

3.虽然有密钥和密码保护,但还请小心使用

完成连接后,主机A对于主机B可见的形式就是存在于主机B的那个本地连接。

反向连接就是CS架构,不过是受控端主动向控制端请求连接,让它们之间的连接建立。传统的CS方式是可以解决主机A和主机B之间的连接问题,但是那样主机A和主机B的连接方式并不灵活,两者之间能做的事情,只能是CS之际协议规定的事情。在主机B上建立了主机A的连接映射后, 对于主机B来说主机A已经不是局域网内那台不可见的主机,主机A已经是存在主机B的一台可见主机,这样就消除了局域网和广域网的阻碍。 主机A和主机B之间建立的那个远程连接就是主机A和主机B的通道-“网线”。

ssh root@public -p 9099输入private机器的密码即可登陆到private这台机器上。

ssh -R 19999:localhost:22 user@pub.server.net

3.3、主机B ssh客户端向主机B sshd服务端的连接通道发送请求, 建立主机B ssh和主机A sshd的连接。

2、为什么需要主机A主动去连接主机B呢?

进一步简化操作:

tcp        0      0 127.0.0.1:2222          0.0.0.0:*               LISTEN

有时候我们需要从公网访问内网的机器。现在一般家里都会有个路由器,路由器一般都会带防火墙,所以从墙外要访问内部的机器,都需要设置防火墙,做端口映射。

3.1、主机A ssh客户端向主机B sshd服务端发送请求,建立远程连接。

autossh -M 5678 -NR 19999:localhost:22 user@pub.server.net

补充:今天了解到ssh-copy-id这个命令,上面这个操作就变的简单了

还有个autossh工具,它可以帮助断线后自动重连,需要的时候可以研究研究

比之前的命令添加的一个-M 5678参数,负责通过5678端口监视连接状态,连接有问题时就会自动重连,去掉了一个-f参数,因为autossh本身就会在background运行。

Upstart: /etc/init/autossh.conf

/bin/su-c'/usr/bin/autossh-M5678-NR1234:localhost:2223user1@123.123.123.123-p2221'- user1

二、从src发起ssh连接

这是因为主机A在局域网内,如果没有对主机A进行端口映射,对于主机B来说主机A是不可见的,如果在主机B这边向主机A发送连接请求,这个请求是不可达的。而主机B有自己独立的IP,对于主机A来说是可见的,可以直接向主机B请求连接。

2.1.在内网B主机上生产公钥和私钥

上面不方便的地方是,每次要在外面登陆内网,都需要先登陆到public上,再从public上登陆内网,如果可以类似网页代理,我在任何地方都可以直接登陆内网那不就完美了,别急,还真可以。

SSH反向连接的使用

3、SSH反向连接的过程

提醒:easeway告诫我说,ssh的-R、-D用法有很多安全漏洞。所以提醒大家,不要在公司内网玩这个东东,否则等于是給公司的防火墙上掏了个洞,很危险的。

1.家里是ADSL的话,用DDNS,解决ip问题

一、从dest发起ssh连接到pub.server.net,建立一个反向隧道

比如在公司内部都是局域网,但是我想从公司外访问公司内的机器,该怎么办呢?当然了,vpn肯定没问题,但更快捷的方式就是ssh反向隧道。

ssh反向隧道可以解决这样的场景:

1、什么是反向连接?

root@public:~# ssh -g -L 9099:localhost:2222 localhost

-R:建立reverse tunnel

3.终极方案:当重启内网B主机,谁来自动Autossh呢,加入daemon吧

autossh还有很多参数,用来设置重连间隔等等。

在public上执行下面的命令:

$autossh-M5678-NR1234:localhost:2223user1@123.123.123.123-p2221

-N:不执行何指令

在此之前还要解决之前的一个问题,那就是每次内网主机B连接外网主机A时都需要输入密码,这个问题ssh本身是提供另外一种验证方式——通过密钥验证用户身份,实现自动登录。

$ls~/.ssh/id_rsa id_rsa.pub known_hosts

$ssh-copy-iduser1@123.123.123.123

试下,内网B主机连接外网A主机,就不再输入密码验证了

方法就是主机A主动去连接主机B,主机B响应主机A的连接请求,它们之间就建立了一个远程连接。然后主机B在本地再创建一个本地连接,重定向到主机A和主机B刚才建立的远程连接上,之后对这个本地连接的操作都会反馈到远程连接上去。整个过程类似于文件的DUP,这就在主机A和主机B之间建立了连接通道,此时对于主机B来说,主机A已经是可见了。

在public上确认:root@public:~# netstat -tnl| grep 2222

$catid_rsa.pub >> ~/.ssh/authorized_keys

方法如下:

反向连接是指主机A(受控端)主动连接主机B(控制端),在主机A和主机B之间建立一个远程连接,通过这个连接主机B可以主动的向主机A发送一些请求。

本文由9159.com发布于操作系统,转载请注明出处:用ssh反向隧道访问内网机器,在这里我使用了B机

关键词: