博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用ssh反向代理以及autossh实现从外网连接内网服务器
阅读量:6037 次
发布时间:2019-06-20

本文共 2824 字,大约阅读时间需要 9 分钟。

  1. 描述一下目前的机器状况,梳理梳理:

  
  机器 IP 用户名 备注
  
  A 10.21.32.106 gdut728 目标服务器,处于内网
  
  B 123.123.123.123 root 外网服务器,相当于桥梁的作用
  
  PS:123.123.123.123只是我随意起的,大家请别攻击别人的服务器啊啊啊
  
  2. 解决方法:
  
  通俗地说:就是在机器A上做到B机器的反向代理;然后在B机器上做正向的代理实现本地端口的转发
  
  2.1 实现前的准备
  
  每台都要安装ssh的客户端。
  
  在这里我使用的是centos7,都自带ssh。如果是使用其他版本Linux,请手动Google一下咯。
  
  2.2 介绍一下使用到的ssh参数:
  
  反向代理
  
  ssh -fCNR
  
  正向代理
  
  ssh -fCNL
  
  -f 后台执行ssh指令
  
  -C 允许压缩数据
  
  -N 不执行远程指令
  
  -R 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
  
  -L 将本地机(客户机)的某个端口转发到远端指定机器的指定端口
  
  -p 指定远程主机的端口
  
  ******************区分大小写啊各位亲******************
  
  1
  
  2
  
  3
  
  4
  
  5
  
  6
  
  7
  
  8
  
  9
  
  3. 首先在A上面操作:
  
  建立A机器到B机器的反向代理,具体指令为
  
  ssh -fCNR [B机器IP或省略]:[B机器端口]:[A机器的IP]:[A机器端口] [登陆B机器的用户名@服务器IP]
  
  1
  
  在这里我使用了B机器的7280端口,以及A机器的22端口,按照上面的指令就是这样子的操作
  
  ssh -fCNR 7280:localhost:22 root@123.123.123.123
  
  1
  
  检验是否已经启动了可以使用ps aux | www.dfgj729.com grep ssh指令来查看:
  
  4. 接着在B上面操作:
  
  建立B机器的正向代理,用来做转发,具体指令为
  
  ssh -fCNL [A机器IP或省略]:[A机器端口]:[B机器的IP]:[B机器端口] [登陆B机器的用户名@B机器的IP]
  
  1
  
  按照第3那里输入的指令,这里的B机器的端口和上面的B机器的端口是一致的,端口1234的也是B机器的。
  
  ssh -fCNL *:1234:localhost:7280 localhost
  
  1
  
  检验是否已经启动了可以使用ps aux | grep ssh指令来查看:
  
  在此1234端口为本地转发端口,负责和外网进行通信,并将数据转发的7280这个端口,实现了可以从其他机器访问的功能。同时,*号表示可以接受任何IP的访问。
  
  5. 展现奇迹的时候到了
  
  至此我们都配置好了AB机器,那么我们就可以从一部外网的电脑登陆到内网里面去啦。鉴于我目前的电脑在内网,而服务器都是外网的(也就是配置的B机器),所以可以通过B机器连接到我内网的A中,具体指令为:
  
  ssh -p1234 gdut728@123.123.123.123
  
  1
  
  在此-p参数为指定登陆的IP,我们在上面指定了1234端口为转发端口,故用1234端口登陆,然后gdut728是内网A机器的用户名,123.123.123.123为外网B机器的IP地址。
  
  6. 这种反向代理的方式是不稳定的
  
  不幸的是这种ssh反向链接会因为超时而关闭,如果关闭了那从外网连通内网的通道就无法维持了,为此我们需要另外的方法来提供稳定的ssh反向代理隧道。
  
  6.1 ssh每次重连都需要键入密码,故在此首先设置免密码登陆到内网
  
  在内网的机器A上面执行:
  
  ssh-copy-id 外网用户名@外网ip
  
  1
  
  按照之前我设定的端口,这个指令就是如下
  
  ssh-copy-id root@123.www.tkcyl1.com/ 123.123.123
  
  1
  
  那以后这台内网的A机器ssh登陆我外网的B机器就可以免密码登陆啦~
  
  检验是否已经可以使用免密码登陆可以使用如下指令来检验:
  
  ssh root@123.123.123.123
  
  1
  
  6.2 用autossh建立稳定隧道
  
  centos7上没有默认安装autossh的,所以使用一下命令安装
  
  yum install autossh
  
  1
  
  来看看具体的autossh的指令为
  
  autossh -M 7281 -fCNR 7280:localhost:22 root@123.123.123.123
  
  1
  
  autossh的参数与ssh的参数是一致的,但是不同的是,在隧道断开的时候,autossh会自动重新连接而ssh不会。另外不同的是我们需要指出的-M参数,这个参数指定一个端口,这个端口是外网的B机器用来接收内网A机器的信息,如果隧道不正常而返回给A机器让他实现重新连接。
  
  这里写图片描述
  
  7. 最后配置在Linux上配置开机自动启动autossh,免去了重启Linux后要自己启动的autossh的麻烦
  
  输入:
  
  vi /etc/rc.d/rc.local
  
  添加内容:
  
  autossh -M 7281 -fCNR 7280:localhost:22 root@123.123.123.123
  
  因为centos7之后,原来直接修改/etc/rc.d/rc.local启动脚本自动生效的功能因为修改了需要重新赋予可执行权限
  
  再输入 chmod +x /etc/rc.d/rc.local
  
  8. 结言:
  
  总算配置好了,目前不清楚会不会断线,明天看看什么情况再进行更新吧。如有不对之处,请大家指正提出~
  
  参考以下网站
  
  从外网 SSH 进局域网,反向代理+正向代理解决方案
  
  使用SSH反向隧道进行内网穿透
  
  版权声明:本文为博主kwongtai原创文章,如需转载,请标明出处,谢谢~ http://blog.csdn.net/weixin_36394852/article/details/72725505

你可能感兴趣的文章
基于Dubbo的http自动测试工具分享
查看>>
[linux] C语言Linux系统编程-TCP通信的11种状态
查看>>
{head first} --- networking 3
查看>>
SpringCloud入门之YAML格式文件规范学习
查看>>
深入理解Dalvik虚拟机- 解释器的执行机制
查看>>
android------2018 年初值得关注的 16 个新 Android 库和项目
查看>>
Mac eclipse 连接安卓手机调试 adb
查看>>
国际巨头互联网公司一些运营与管理思路
查看>>
数据库~Mysql里的Explain说明
查看>>
linux arm的存储分布那些事之一【转】
查看>>
跨域详解
查看>>
网卡bonding模式 - bond0、1、4配置
查看>>
<转>LUA语法分析
查看>>
Windows网络接口API函数
查看>>
移除input在type="number"时的上下箭头
查看>>
HBase学习之路 (七)HBase 原理
查看>>
Mac vim“装逼”配置
查看>>
Hbuilder配置识别逍遥安卓模拟器
查看>>
使用jquery.form.js的ajaxsubmit方法提交数据的Bug
查看>>
js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服...
查看>>