How系列-公网如何ssh到内网的Linux系统中?
起因
最近碰到一件事:B同学在他电脑的Ubuntu虚拟机中学习搭建服务器碰到了问题,要我帮他看下。我总不能一个QQ远程桌面连过去,那样操作会卡到崩溃。ssh过去是最好的方法,不过他的电脑跟我不在一个局域网,又是虚拟机,要怎么连过去呢?
怎么解决?
有两种方法:
- 通过一台公网服务器,通过
ssh命令建立反向隧道 - 通过第三方的
ngrok服务建立tcp反向隧道
它们的原理都是使用了反向隧道,原理见下图:

正向与反向的区别在于正向连接是使用者通过自己的客户端操作服务器资源;反向连接是使用者通过服务器操作客户端资源。结合上图理解:
- 客户端1
ssh连接公网服务器时,所有的操作都在服务器上,所以称为正向隧道; - 客户端2
ssh连接公网服务器的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系统中?的更多相关文章
- nat123外网SSH访问内网LINUX的N种方法
一,动态公网IP环境 1,环境描述: 路由器分配的是动态公网IP,且有路由管理权限,LINUX主机部署在路由内网.如何实现外网SSH访问内网LINUX主机? 2,解决方案: 使用nat123动态域名解 ...
- 外网SSH访问内网LINUX的N种方法
外网SSH访问内网LINUX的N种方法 http://www.nat123.com/Pages_8_260.jsp 一,动态公网IP环境 1,环境描述: 路由器分配的是动态公网IP,且有路由管理权限, ...
- 使用Holer外网SSH访问内网(局域网)Linux系统
1. Holer工具简介 Holer exposes local servers behind NATs and firewalls to the public internet over secur ...
- SSH的内网穿透
SSH的内网穿透 1.内网: ssh -N -f -R 2222:127.0.0.1:22 lienzh@我的PC的IP2.外网: ssh -p 2222 root@localhost ...
- 没固定公网 IP 的公司内网实现动态域名解析( 阿里云万网解析 )
情景说明 前段时间应公司需求,需要将内网的服务映射到公网.由于公司使用的是类似家庭宽带的线路,没有固定的公网 IP 地址,所以决定使用域名来完成. 当时有几种方案: 1.花生壳:但是目前需要乱七八糟的 ...
- win10开启 linux Bash命令(win10内置了linux系统支持)
win10开启 Ubuntu linux Bash命令(win10内置了linux系统支持) 第一步: 先在设置→更新和安全→针对开发人员中选择"开发人员模式",点击后会下载&qu ...
- 使用Linux系统中的SSH服务
使用Linux系统中的SSH服务 1.SSH服务应用场景 ① 可以实现对文件的上传与下载 ② 实现远程管理Linux 2.安装SSH服务器 服 务:sshd 位 置:光盘2 软 件:openssh-s ...
- 用SSH访问内网主机的方法
如今的互联网公司通常不会直接自己直接配主机搭建服务器了,而是采用了类似阿里云的这种云主机,当应用变得越来越大了之后,就不可避免地增加主机,而出于成本考虑,不可能给每一台主机都分配公网带宽,所以实际的情 ...
- 内网客户 通过 公网域名/ip 访问内网web服务器 出错
在一内部局域网中, client 内网地址为 10.0.0.2 web 服务器内网地址为 10.0.0.1 外网地址为 211.6.15.1 域名为 xx.love.com ...
随机推荐
- Django:form.save()方法
参考:https://blog.csdn.net/it_yuan/article/details/53580756 背景: 之前的博客是不支持上传文章缩略图的,后来新增了此功能,但是发现修改老的文章时 ...
- C#基础复习(1) 之 Struct与Class的区别
参考资料 [1] 毛星云[<Effective C#>提炼总结] https://zhuanlan.zhihu.com/p/24553860 [2] <C# 捷径教程> [3] ...
- C# autofac配置文件中设置单例
设置instance-scope属性值为SingleInstance
- js图片自适应尺寸居中函数处理
/* | autoSerializePicture.js 自适应格式化图片 | auther : baichaohua/2017-09-21 +---------------------------- ...
- Unity实现一个morpher/blendShape
using UnityEngine; using System.Collections; [RequireComponent (typeof (MeshFilter))] public class B ...
- day103 跨域请求 与频率访问限制.
目录 一.跨域请求 二.频率访问限制 一 .同一个域下的ajax请求访问 url文件 from django.conf.urls import url from django.contrib imp ...
- LiLicense server OR Activation code
JET BRAINS系列工具下载地址: https://www.jetbrains.com/products.html?fromMenu License server 输入下列两个任何一个点击 Act ...
- Qt使用gtest进行C++单元测试-01
环境: win7/win10+qt5.8.0(MinGW), 1.gtest获取: 从:https://www.bogotobogo.com/cplusplus/google_unit_test_gt ...
- Python 面向对象编程的一些特征 及 单例模式的实现, 父类方法的调用(python2/python3)
一.面向对象编程几个特征(封装, 继承,多态) 1.封装:类里面封装函数和变量, 在将类进行实例化成实例对象时进行传参, 从而生成不同的实例对象,增加代码的复用. 2.继承:子类可以继承父类的方法和属 ...
- 【NOIP2018】保卫王国 动态dp
此题场上打了一个正确的$44pts$,接着看错题疯狂$rush$“正确”的$44pts$,后来没$rush$完没将之前的代码$copy$回去,直接变零分了..... 这一题我们显然有一种$O(nm)$ ...