前言

公司有一台文件服务器(内部使用,无外网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. 高性能迷你React框架anujs1.0.5发布

    实现对createFactory的支持,优化scheduler与dispose机制,提供ReactShim文件,跑通公司内部4套测试 npm i anujs 或者使用架手架 https://githu ...

  2. 权限控制框架---shiro入门

    1.shiro控制权限的两种思想:粗粒度url级别,细粒度方法级别 2.shiro执行流程简介 3.案例 3.1shiro控制用户登录实现,登录其实就是shiro中的认证. (1)配置web.xml( ...

  3. python中安装request模块

    使用命令行(cmd)进入到python安装目录下的Scripts文件夹(也可以先进入目标文件夹然后在文件路径上打开cmd回车即可) 在命令行中输入pip install requests,等待安装完成 ...

  4. flume知识点总结

    首先介绍一下在flume中常用的一个数据格式,以及使用该格式的优缺点:  从flume写数据到hdfs中的时候,使用二进制格式相对于使用纯文本来说是一种更好的选择,因为大多数二进制格式都有一些方法指明 ...

  5. nginx实现http www服务的方式

  6. Nginx – rewrite 配置 URL重写及301跳转原理图

    Nginx – rewrite 配置 URL重写 官网:http://nginx.org/en/docs/http/ngx_http_rewrite_module.html 语法:rewrite re ...

  7. poj2115(扩展欧基里德定理)

    题目链接:https://vjudge.net/problem/POJ-2115 题意:模拟for循环for(int i=A;i!=B;i+=C),且数据范围为k位无符号数以内,即0~1<< ...

  8. 查看SQL语句的真实执行计划

    DBMS_XPLAN包中display_cursor函数不同于display函数,display_cursor用于显示SQL语句的真实的执行计划,在大多数情况下,显示真实的执行计划有助于更好的分析SQ ...

  9. jq获取图片并转换为base64

    html代码: <input type="file" id="file1"/> jq代码: $('#file1').change(function( ...

  10. 106. Construct Binary Tree from Inorder and Postorder Traversal根据后中序数组恢复出原来的树

    [抄题]: Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assum ...