前言

公司有一台文件服务器(内部使用,无外网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. 详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dengqi.blog.51cto.com/5685776/1223132 一:M ...

  2. pyspider示例代码:解析JSON数据

    pyspider示例代码官方网站是http://demo.pyspider.org/.上面的示例代码太多,无从下手.因此本人找出一下比较经典的示例进行简单讲解,希望对新手有一些帮助. 示例说明: py ...

  3. react-native 新手爬坑经历(unable to load script from assets 和could not connect to development server.)

    按照https://reactnative.cn/docs/0.51/getting-started.html教程新建的项目 react-native init AwesomeProject cd A ...

  4. Binary Space Partitioning

    [Binary Space Partitioning] BSP was discovered by John Carmack used BSP trees in Doom and Quake. Alt ...

  5. JQuery的可见性选择器

    1. <div id="test" style="width:400px;height:200; background:#0000ff;display:block; ...

  6. [leetcode]341. Flatten Nested List Iterator展开嵌套列表的迭代器

    Given a nested list of integers, implement an iterator to flatten it. Each element is either an inte ...

  7. node.js中实现http服务器与浏览器之间的内容缓存

    一.缓存的作用 1.减少了数据传输,节约流量. 2.减少服务器压力,提高服务器性能. 3.加快客户端加载页面的速度. 二.缓存的分类 1.强制缓存,如果缓存有效,则不需要与服务器发生交互,直接使用缓存 ...

  8. Django contenttypes 应用

    Django contenttypes 应用 什么是Django ContentTypes? Django ContentTypes是由Django框架提供的一个核心功能,它对当前项目中所有基于Dja ...

  9. JS的事件流的概念(重点)

      09-JS的事件流的概念(重点)   在学习jQuery的事件之前,大家必须要对JS的事件有所了解.看下文 事件的概念 HTML中与javascript交互是通过事件驱动来实现的,例如鼠标点击事件 ...

  10. javaweb开发.eclipse使用小常识

    一.javabean快速生成 1.写好属性,如 package me.lst.domain; import java.io.Serializable;import java.sql.Date; /** ...