前言

公司有一台文件服务器(内部使用,无外网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反向隧道,连接内网服务器的更多相关文章

  1. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  2. 使用pycharm、跳板机连接内网服务器

    使用pycharm.跳板机连接内网服务器 接手实验室服务器后,大部分同学在GPU集群上跑程序都是直接在ssh界面上跑,这里想着通过pycharm通过跳板机来连接服务器. 总体就是实验室服务器仅限内网访 ...

  3. Nginx反向代理访问内网服务器

    Nginx反向代理访问内网服务器 问题描述 ​ 公司给配的台式机太垃圾了,不能访问外部网络就算了,还没有maven私服.近期项目不光得使用maven还得使用内网中的数据库之类,台式机太卡只能用自己的笔 ...

  4. ngrok反向隧道--获取内网IP

    ngrok反向隧道 前情提要:小明与小白各有一台主机,两台主机在同一内网,小明想直接通过内网ssh到小白的主机上.但是小白的ip地址会不断的变化,而小明不想每次都要麻烦小白查看ip.于是小明催生了一个 ...

  5. 记<<ssh穿透防火墙连接内网的机器(不用路由端口映射)>>

    场景: 在家连接公司的内网服务器. 需求: 不用设置端口映射在家用putty登录公司内网服务器. 条件: 有一台公网服务器做转发,有开放端口的控制权.(公网服务器可以是阿里云ECS, 腾讯云主机这样的 ...

  6. OpenWRT DNS无法解析WAN连接的内网服务器域名

    系统版本OpenWrt Chaos Calmer 15.05.1,网络连接为:WAN口连接内网10.x.x.x网段,WAN口设置为静态IP.设置L2TP接口,通过L2TP访问外网.问题出现于,所有外网 ...

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

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

  8. 通过ssh tunnel连接内网ECS和RDS

    通过ssh tunnel连接内网ECS和RDS 这里讲了ssh tunnel的原理.很清晰. 此后又给外网访问内网增加了一种思路.感觉特别棒. 拓宽了思路:

  9. 搭建Nginx反向代理做内网域名转发

    由于公司内网有多台服务器的 http 服务要映射到公司外网静态 IP,如果用路由的端口映射来做,就只能一台内网服务器的 80 端口映射到外网 80 端口,其他服务器的 80 端口只能映射到外网的非 8 ...

随机推荐

  1. Windows下用VS2015+MSYS编译OpenH264

    因为项目用到了OpenH264,编译的过程不想做过多研究,搜了下,有网页可以参考,遂记录下来,并在后面做一些补充. 原帖地址:http://blog.csdn.net/dbyoung/article/ ...

  2. R语言-增加图例

    legend()函数 > plot(rain$Tokyo,type="l",col="red", + ylim=c(0,300), + main=&quo ...

  3. c#命名规范(转载)

    出处:脚本之家 链接:http://www.jb51.net/article/57163.htm 注重代码书写的程序员应该是一个比较有修养的人,下面这些命名规则不一定要绝对遵从,但值得参考.在应用规则 ...

  4. Apache无法正常启动(配置多个监听端口)

    Apache监测多个端口配置: 1.conf->extra->httpd-vhosts.conf  检查配置项是否写错 2.http.conf listen端口是否监听正确 3.环境变量中 ...

  5. 100-days: twelve

    Title:   Mark Zuckerberg wants Facebook's to emulate China's WeChat, but can it? emulate v.效仿,模仿 As ...

  6. viewstate?

    用于存放数据,可永久保存,存放在页面的隐藏控件里      支持string,integer,array,boolean,ArrayList,hashtable类型,使用viewstate会增加页面h ...

  7. C++ 实现分数的四则运算

    对分数求加减乘除,以及化简 #include<iostream> #include<math.h> using namespace std; struct Fraction{ ...

  8. 为了应对异常情况,提供最原始的python第三方库的安装方法:手动安装。往往是Windows用户需要用到这种方法。

    进入pypi.python.org,搜索你要安装的库的名字,这时候有3中可能: 第一种是exe文件,这种最方便,下载满足你的电脑系统和python环境的对应的exe,再一路点击next就可以安装. 第 ...

  9. javaweb开发2.新建一个javaweb项目

    1.File → New → Dynamic Web Project 2.创建一个Dynamic Web Project 3.点击“Next”下一步 4.点击“Next”下一步 5.点击“Finish ...

  10. 服务器重新启动,oracle数据库重新连接问题

    最近服务器使用期限到了,用户无法登陆,联系了网络的同事,重新开启了服务器,用户可以重新登陆了,但是在使用oracle数据库的时候,发现报了以下的错误: 很明显是数据库服务没有启动,解决这个问题分两步: ...