起因

最近碰到一件事:B同学在他电脑的Ubuntu虚拟机中学习搭建服务器碰到了问题,要我帮他看下。我总不能一个QQ远程桌面连过去,那样操作会卡到崩溃。ssh过去是最好的方法,不过他的电脑跟我不在一个局域网,又是虚拟机,要怎么连过去呢?

怎么解决?

有两种方法:

  1. 通过一台公网服务器,通过ssh命令建立反向隧道
  2. 通过第三方的ngrok服务建立tcp反向隧道

它们的原理都是使用了反向隧道,原理见下图:

正向与反向的区别在于正向连接是使用者通过自己的客户端操作服务器资源;反向连接是使用者通过服务器操作客户端资源。结合上图理解:

  • 客户端1ssh连接公网服务器时,所有的操作都在服务器上,所以称为正向隧道;
  • 客户端2ssh连接公网服务器的2244端口时,公网服务器全部转发客户端1,使用者通过公网服务器操作客户端1,所以公网服务器到客户端1的连接称为反向隧道

第一种方法

客户端1执行一条命令即可建立反向隧道:

$ssh -N -f -R *:2244:localhost:22 106.10.10.xxx

其中-N表示不执行命令,只转发;-f表示后台运行;-R表示反向隧道;*:2244:localhost:22表示监听服务器的2244端口,所有包转发到本地的22端口;106.10.10.xxx为服务器IP

我只要在客户端2执行ssh -p 2244 xxx@106.10.10.xxx就能连接客户端1的电脑了。

实际使用中会发现,该通道会经常自动断开,这是正常现象。可通过autossh实现断开重连。使用autossh之前,必须确保该客户端与服务器连接使用了无密码的密钥对登陆

$autossh -M 5678 -N -f -R *:2244:localhost:22 106.10.10.xxx

其中-M 5678表示通过5678端口监听连接状态,有问题就重连。

第二种

使用ngrok(1.x版本)就简单多了,一条命令搞定,也不需要知道服务器的密码或传公钥,适合第三方服务器提供跳板服务。

$ngrok -proto=tcp 22
ngrok (Ctrl+C to quit) Tunnel Status online
Version 1.7/1.7
Forwarding tcp://106.10.10.xxx:2244 -> 127.0.0.1:22
Web Interface 127.0.0.1:4040
# Conn 0
Avg Conn Time 0.00ms

根据上面的输出,我只要在客户端2执行ssh -p 2244 xxx@106.10.10.xxx就能连接客户端1的电脑了。

默认情况下,ngrok的转发端口是随机的,如果要固定,编辑~/.ngrok,按如下添加通道:

server_addr: 106.10.10.xxx:4443
trust_host_root_certs: false
tunnels:
ssh:
proto:
tcp: "22"
remote_port: 2244

然后通过以下命令启动:

ngrok start ssh

How系列-公网如何ssh到内网的Linux系统中?的更多相关文章

  1. nat123外网SSH访问内网LINUX的N种方法

    一,动态公网IP环境 1,环境描述: 路由器分配的是动态公网IP,且有路由管理权限,LINUX主机部署在路由内网.如何实现外网SSH访问内网LINUX主机? 2,解决方案: 使用nat123动态域名解 ...

  2. 外网SSH访问内网LINUX的N种方法

    外网SSH访问内网LINUX的N种方法 http://www.nat123.com/Pages_8_260.jsp 一,动态公网IP环境 1,环境描述: 路由器分配的是动态公网IP,且有路由管理权限, ...

  3. 使用Holer外网SSH访问内网(局域网)Linux系统

    1. Holer工具简介 Holer exposes local servers behind NATs and firewalls to the public internet over secur ...

  4. SSH的内网穿透

    SSH的内网穿透 1.内网:     ssh -N -f -R 2222:127.0.0.1:22 lienzh@我的PC的IP2.外网:     ssh -p 2222 root@localhost ...

  5. 没固定公网 IP 的公司内网实现动态域名解析( 阿里云万网解析 )

    情景说明 前段时间应公司需求,需要将内网的服务映射到公网.由于公司使用的是类似家庭宽带的线路,没有固定的公网 IP 地址,所以决定使用域名来完成. 当时有几种方案: 1.花生壳:但是目前需要乱七八糟的 ...

  6. win10开启 linux Bash命令(win10内置了linux系统支持)

    win10开启 Ubuntu linux Bash命令(win10内置了linux系统支持) 第一步: 先在设置→更新和安全→针对开发人员中选择"开发人员模式",点击后会下载&qu ...

  7. 使用Linux系统中的SSH服务

    使用Linux系统中的SSH服务 1.SSH服务应用场景 ① 可以实现对文件的上传与下载 ② 实现远程管理Linux 2.安装SSH服务器 服 务:sshd 位 置:光盘2 软 件:openssh-s ...

  8. 用SSH访问内网主机的方法

    如今的互联网公司通常不会直接自己直接配主机搭建服务器了,而是采用了类似阿里云的这种云主机,当应用变得越来越大了之后,就不可避免地增加主机,而出于成本考虑,不可能给每一台主机都分配公网带宽,所以实际的情 ...

  9. 内网客户 通过 公网域名/ip 访问内网web服务器 出错

    在一内部局域网中, client  内网地址为 10.0.0.2     web  服务器内网地址为 10.0.0.1    外网地址为  211.6.15.1    域名为  xx.love.com ...

随机推荐

  1. Unity/C#基础复习(3) 之 String与StringBuilder的关系

    参考资料 [1] @毛星云[<Effective C#>提炼总结] https://zhuanlan.zhihu.com/p/24553860 [2] <C# 捷径教程> [3 ...

  2. winform中控件的简单数据绑定

    是因为在学习组件开发过程中有个Bindable的属性,不明白意义,然后才接触到winform的数据绑定,想着先把数据绑定这块看一下,然后去测试下是否Bindable属性设为false,就不能绑定该属性 ...

  3. Openlayers地图量算功能

    http://openlayers.org/en/latest/examples/measure.html?q=measure   按官网的例子来就行,新建对象时注意加上命名空间   var vect ...

  4. jzoj5843

    给定 n 个正整数序列 ,每个序列长度为m. 选择至少 1 个序列,在每个被选择的序列中选择一个元素,求出所有被选择的元素的 gcd. 求所有方案的结果之和,答案对 1e9+7 取模.两种方案不同,当 ...

  5. 欢迎使用CSDN-markdown编辑器a

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...

  6. 一,memcached的基本概念

    1,memcached的基本概念 memcached是一个高效的分布式内存对象缓存系统,它可以支持把各种php的数据(array,对象,基本数据类型)放入到它管理的内存中.简单的说,memcached ...

  7. Flask从入门到精通之Jinja2模板引擎

    我们使用一个简单的例子切入到Jinja2模板引擎,形式最简单的Jinja2模板引擎就是一个包含响应文本的文件,实例如下: <h1>Hello World!</h1> 最简单的包 ...

  8. python实战——网络爬虫

    学习网络爬虫的目的: 1,可以私人定制一个搜索引擎,可以深层次的了解搜索引擎的工作原理. 2,大数据时代,要进行数据分析,首先要有数据源,学习爬虫,可以让我们获取更多的数据. 3,从业人员可以可好的利 ...

  9. 《JAVA与模式》之合成模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述合成(Composite)模式的: 合成模式属于对象的结构模式,有时又叫做“部分——整体”模式.合成模式将对象组织到树结构中,可以用来描述 ...

  10. 多线程学习:Volatile与Synchronized的区别、什么是重排序

    java线程的内存模型 java的线程内存模型中定义了每个线程都有一份自己的共享变量副本(本地内存),里面存放自己私有的数据,其他线程不能直接访问,而一些共享变量则存在主内存中,供所有线程访问. 上图 ...