前言

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

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

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

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


2. 解决方法:

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

2.1 实现前的准备

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

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

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

反向代理

ssh -fCNR

正向代理

ssh -fCNL

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

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指令来查看:


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指令来查看:

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


5. 展现奇迹的时候到了

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

ssh -p1234 gdut728@123.123.123.123

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


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

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

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

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

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

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

ssh-copy-id root@123.123.123.123

那以后这台内网的A机器ssh登陆我外网的B机器就可以免密码登陆啦~

检验是否已经可以使用免密码登陆可以使用如下指令来检验:

ssh root@123.123.123.123

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机器让他实现重新连接。


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


8. 结言:

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


参考以下网站

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

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

利用ssh反向代理以及autossh实现从外网连接内网服务器的更多相关文章

  1. ssh反向代理

    文章链接:https://www.cnblogs.com/kwongtai/p/6903420.html 前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后 ...

  2. 利用SSH反向隧道,连接内网服务器

    前言 公司有一台文件服务器(内部使用,无外网IP),上面主要安装了SVN服务,用来存储和共享各部门的文档,因为都是内网,直接远程(mstsc)上去就可以方便维护,但最近公司租了新的办公室,部分员工被分 ...

  3. 基于ssh反向代理实现的远程协助

    本文描述了怎么通过ssh反向代理实现远程协助,并提供了相关代码. 可满足web开启远程协助功能后,维护人员能够通过ssh和http登录客户机器(包括在nat环境下) web开启该功能后,ssh才能登录 ...

  4. ssh 反向代理和正向代理的文章

    搜索原因是,我希望访问家里内网的机器 技术要点: ssh 反向代理,正向代理 隧道 文章摘自: https://my.oschina.net/leejun2005/blog/94401 https:/ ...

  5. SSH 反向代理

    SSH反向代理 被控制端没有NAT或者没有静态公网IP,把本端一台服务器映射到外网给远端SSH进来,建立SSH反向隧道. 先映射本端机器到外网  nat server 2222to22 protoco ...

  6. 利用 squid 反向代理提高网站性能(转载)

    本文在介绍 squid 反向代理的工作原理的基础上,指出反向代理技术在提高网站访问速度,增强网站可用性.安全性方面有很好的用途.作者在具体的实验环境下,利用 DNS 轮询和 Squid 反向代理技术, ...

  7. 使用ssh从外网访问内网

    一.场景如下: 各个角色的对应关系如下: 角色 描述 APP 个人笔记本,属于内网IP sshd server 公网 VPS ( 映射端口: port 2222 ),拥有公网IP ssh client ...

  8. 通过ssh管道连接内网数据库(mysql)

    公网连接内网数据库(如云数据库)时,通常需要白名单:如果不是白名单IP,通常需要一个跳板机(类似代理)来连接内网数据库, 下方以mysql为例(其他数据库基本一致): import pymysql a ...

  9. 【渗透实战】记一次艰难的内网漫游第四期_蹭我WIFI?看我如何利用组合拳日进蹭网者内网

    /文章作者:Kali_MG1937 CSDN博客ID:ALDYS4 QQ:3496925334/ 内网漫游系列第三期:[渗透实战]记一次艰难的内网漫游第三期_我是如何利用APT攻击拿到内网最高权限的 ...

随机推荐

  1. cs6安装

    [按下面步骤操作 无需序列号] ·打上补丁 永远无需序列号 (现在网上没什么能用的序列号) ·1双击CS软件安装,选择试用 ·2创建ID 输入自己邮箱和密码,姓名可以随意输入 ·3安装完成后 运行一次 ...

  2. Hybrid App开发之JavaScript基础

    前言: 前面学习了html和css的基本使用,今天开始学习JavaScript的使用. 什么是JavaScript JavaScript是一种基于对象(Object)和事件驱动(Event Drive ...

  3. Javascript加载执行顺序

    本文主要内容 一.不同位置的script标签执行顺序 二.document.ready和window.onload的区别 一.不同位置的script标签执行顺序 整个加载的过程从解析头部开始,比如ht ...

  4. Unity3d: 资源释放时存储空间不足引发的思考和遇到的问题

    手机游戏第一次启动基本上都会做资源释放的操作,这个时候需要考虑存储空间是否足够,但是Unity没有自带获取设备存储空间大小的 接口,需要调用本地方法分别去android或ios获取,这样挺麻烦的.而且 ...

  5. 利用angular给节点添加样式

    <!DOCTYPE html> <html lang="en" ng-app="myapp"> <head> <met ...

  6. Github 开源:高效好用的对象间属性拷贝工具:升讯威 Mapper( Sheng.Mapper)

    Github 地址:https://github.com/iccb1013/Sheng.Mapper 对象属性值映射/拷贝工具.不需要创建映射规则,不要求对象类型一致,适用于简单直接的拷贝操作,可以全 ...

  7. javascript中的window.open()被浏览器拦截

    最近做项目的时候,点击事件的时候遇到了window .open()被浏览器拦截的情况,虽然在自己的开发环境中都能正常使用,但是放在测试环境中window.open()就是不能使用, 后来经过测试,单纯 ...

  8. (cljs/run-at (->JSVM :browser) "语言基础")

    前言  两年多前知道cljs的存在时十分兴奋,但因为工作中根本用不上,国内也没有专门的职位于是搁置了对其的探索.而近一两年来又刮起了函数式编程的风潮,恰逢有幸主理新项目的前端架构,于是引入Ramda. ...

  9. 如何使用 ui-router-extras

    为了使用ui-router创建tabs构架,使用ui-router-extras 使用方法: 0. 安装包 bower install ui-router-extras --save-dev 1. 引 ...

  10. 手把手教你从基础学习JQuery

    JQuery JQuery 语法 1.jQuery("选择器").action();通过选择器调用事件函数 但jQuery中,jQuery可以用$代替,即$("选择器&q ...