利用SSH反向隧道,连接内网服务器
前言
公司有一台文件服务器(内部使用,无外网IP),上面主要安装了SVN服务,用来存储和共享各部门的文档,因为都是内网,直接远程(mstsc)上去就可以方便维护,但最近公司租了新的办公室,部分员工被分配到这边办公,毫无疑问,无法远程和使用SVN了。
要解决有很多方法,比如路由器端口映射、VPN,我们只说一种最简单,也最奇妙的,SSH反向隧道
公司在云上有一台公网Linux服务器(假设是 52.199.166.132),我用它来端口转发
| 机器 | IP地址 | 用户名 | 端口 |
| A(内网) | 10.3.174.94 | administrator | 3389(远程连接) 443(SVN) |
| B(公网) | 52.199.166.132 | root | 23389(远程连接) 10443(SVN) |
通俗的说我们要实现:
跳板机:远程桌面连接 52.199.166.132:23389 实际连的内网的 10.3.174.94:3389
服务转发:SVN连接 https://52.199.166.132:10443 实际连接的是内网的 https://10.3.174.94
开放端口
在B机器,执行以下命令,防火墙中开放端口10443和23389,并重启防火墙(B机器的系统是CentOS 7)
firewall-cmd --zone=public --add-port=23389/tcp --permanent
firewall-cmd --zone=public --add-port=10443/tcp --permanent
firewall-cmd --reload
打开 /etc/ssh/sshd_config,将GatewayPorts参数设为yes,然后重启sshd服务:
systemctl restart sshd.service
建立反向隧道
原理:内网的A通过SSH连接公网的B,并且两者建立一个通信隧道,通常防火墙只限制入站不限制出站,所以SSH可以穿透防火墙
1. 保证B服务器已安装和开启SSH(现在SSH是Linux标配)
2. 因为A是一台Windows,需要单独安装一个SSH客户端,比如 OpenSSH(Win10 已内置,可在 PowerShell 中使用)、Putty、SecureCRT 等,
我使用的Cygwin,这是一个Windows平台上运行的模拟UNIX环境,安装Cygwin时记得选择OpenSSH包 【Cygwin安装教程(图文)】
如果用其它SSH客户端工具,注意 -i 后面的密钥路径格式
在终端中,执行两条命令:
ssh -i "/cygdrive/d/id_rsa/test_centos_secret_key.pem" -fNR :localhost: root@52.199.166.132 -p
ssh -i "/cygdrive/d/id_rsa/test_centos_secret_key.pem" -fNR :localhost: root@52.199.166.132 -p
执行成功,则SSH反向隧道建立
查看监听端口
登录机器B,通过 netstat 命令查看监听端口,有23389 10443端口

然后在本地通过 telnet 查看23389和10443端口是否通
telnet 52.199.166.132
telnet 52.199.166.132
如果都通了,就大功告成了!
遇到的问题
1. 如果在A机器上执行SSH连接B失败,提示:Warning: remote port forwarding failed for listen port
或者B上面监听端口的IP地址不是0.0.0.0,而是127.0.0.1,可以在B上面把这两个端口对应的进程 kill 掉,然后A重新连接
2. SSH超时会断开(虽然我的一天都没断开过),不会重连,解决办法是用 autossh,那在安装 Cygwin 时一并安装 autossh 包,A上的命令这样写:
autossh -i "/cygdrive/d/id_rsa/test_centos_secret_key.pem" -M 7777 -NR :localhost: root@52.199.166.132 -p
autossh -i "/cygdrive/d/id_rsa/test_centos_secret_key.pem" -M 7777 -NR :localhost: root@52.199.166.132 -p
其中端口 7777 是负责监听连接状态,一旦连接不正常,通知A重连
参数说明
-p 22 远程主机SSH端口,默认是22,也可以省略
-i "*.pem" 基于密钥认证,如果基于口令认证,忽略
-f 表示后台执行,autossh 本来就在后台执行,所以不需要
-o ServerAliveInterval=180 保持连接Alive间隔180秒,可以调小
-N 表示不执行任何命令
-R 建立反向隧道
-L 建立正向代理
-M 监听隧道状态的端口,如果隧道不正常,告诉内网机器重连
-C 允许压缩数据
利用SSH反向隧道,连接内网服务器的更多相关文章
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 使用pycharm、跳板机连接内网服务器
使用pycharm.跳板机连接内网服务器 接手实验室服务器后,大部分同学在GPU集群上跑程序都是直接在ssh界面上跑,这里想着通过pycharm通过跳板机来连接服务器. 总体就是实验室服务器仅限内网访 ...
- Nginx反向代理访问内网服务器
Nginx反向代理访问内网服务器 问题描述 公司给配的台式机太垃圾了,不能访问外部网络就算了,还没有maven私服.近期项目不光得使用maven还得使用内网中的数据库之类,台式机太卡只能用自己的笔 ...
- ngrok反向隧道--获取内网IP
ngrok反向隧道 前情提要:小明与小白各有一台主机,两台主机在同一内网,小明想直接通过内网ssh到小白的主机上.但是小白的ip地址会不断的变化,而小明不想每次都要麻烦小白查看ip.于是小明催生了一个 ...
- 记<<ssh穿透防火墙连接内网的机器(不用路由端口映射)>>
场景: 在家连接公司的内网服务器. 需求: 不用设置端口映射在家用putty登录公司内网服务器. 条件: 有一台公网服务器做转发,有开放端口的控制权.(公网服务器可以是阿里云ECS, 腾讯云主机这样的 ...
- OpenWRT DNS无法解析WAN连接的内网服务器域名
系统版本OpenWrt Chaos Calmer 15.05.1,网络连接为:WAN口连接内网10.x.x.x网段,WAN口设置为静态IP.设置L2TP接口,通过L2TP访问外网.问题出现于,所有外网 ...
- 通过ssh管道连接内网数据库(mysql)
公网连接内网数据库(如云数据库)时,通常需要白名单:如果不是白名单IP,通常需要一个跳板机(类似代理)来连接内网数据库, 下方以mysql为例(其他数据库基本一致): import pymysql a ...
- 通过ssh tunnel连接内网ECS和RDS
通过ssh tunnel连接内网ECS和RDS 这里讲了ssh tunnel的原理.很清晰. 此后又给外网访问内网增加了一种思路.感觉特别棒. 拓宽了思路:
- 搭建Nginx反向代理做内网域名转发
由于公司内网有多台服务器的 http 服务要映射到公司外网静态 IP,如果用路由的端口映射来做,就只能一台内网服务器的 80 端口映射到外网 80 端口,其他服务器的 80 端口只能映射到外网的非 8 ...
随机推荐
- Windows下用VS2015+MSYS编译OpenH264
因为项目用到了OpenH264,编译的过程不想做过多研究,搜了下,有网页可以参考,遂记录下来,并在后面做一些补充. 原帖地址:http://blog.csdn.net/dbyoung/article/ ...
- R语言-增加图例
legend()函数 > plot(rain$Tokyo,type="l",col="red", + ylim=c(0,300), + main=&quo ...
- c#命名规范(转载)
出处:脚本之家 链接:http://www.jb51.net/article/57163.htm 注重代码书写的程序员应该是一个比较有修养的人,下面这些命名规则不一定要绝对遵从,但值得参考.在应用规则 ...
- Apache无法正常启动(配置多个监听端口)
Apache监测多个端口配置: 1.conf->extra->httpd-vhosts.conf 检查配置项是否写错 2.http.conf listen端口是否监听正确 3.环境变量中 ...
- 100-days: twelve
Title: Mark Zuckerberg wants Facebook's to emulate China's WeChat, but can it? emulate v.效仿,模仿 As ...
- viewstate?
用于存放数据,可永久保存,存放在页面的隐藏控件里 支持string,integer,array,boolean,ArrayList,hashtable类型,使用viewstate会增加页面h ...
- C++ 实现分数的四则运算
对分数求加减乘除,以及化简 #include<iostream> #include<math.h> using namespace std; struct Fraction{ ...
- 为了应对异常情况,提供最原始的python第三方库的安装方法:手动安装。往往是Windows用户需要用到这种方法。
进入pypi.python.org,搜索你要安装的库的名字,这时候有3中可能: 第一种是exe文件,这种最方便,下载满足你的电脑系统和python环境的对应的exe,再一路点击next就可以安装. 第 ...
- javaweb开发2.新建一个javaweb项目
1.File → New → Dynamic Web Project 2.创建一个Dynamic Web Project 3.点击“Next”下一步 4.点击“Next”下一步 5.点击“Finish ...
- 服务器重新启动,oracle数据库重新连接问题
最近服务器使用期限到了,用户无法登陆,联系了网络的同事,重新开启了服务器,用户可以重新登陆了,但是在使用oracle数据库的时候,发现报了以下的错误: 很明显是数据库服务没有启动,解决这个问题分两步: ...