SSH反向连接及Autossh

http://www.cnblogs.com/eshizhan/archive/2012/07/16/2592902.html

SSH反向连接及Autossh

0.接触Linux恐怕对SSH再熟悉不过了,还有scp,sftp各种方便的功能,一般的使用都需要ip:port(如果不是默认22的话),但有些情况比较特殊,就是想连接一台内网主机(比如公司内网,当然你肯定做不了Port Forwarding,除非你想在公司防火墙上拆个洞)。稍懂一点网络的童鞋会明白,Internet上去主动连接一台内网是不可能的,一般的解决方案分两种,一种是端口映射(Port Forwarding),将内网主机的某个端口Open出防火墙,相当于两个外网主机通信;另一种是内网主机主动连接到外网主机,又被称作反向连接(Reverse Connection),这样NAT路由/防火墙就会在内网主机和外网主机之间建立映射,自然可以相互通信了。但是,这种映射是NAT路由自动维持的,不会持续下去,如果连接断开或者网络不稳定都会导致通信失败,这时内网主机需要再次主动连接到外网主机,建立连接。

1.理论的介绍完了,下面实际操作:

A要控制B

A主机:外网,ip:123.123.123.123,sshd端口:2221

B主机:内网,sshd端口:2223

无论是外网主机A,还是内网主机B都需要跑ssh daemon

1.1.首先在B上执行

$ ssh -NfR 1234:localhost:2223 user1@123.123.123.123 -p2221

这句话的意思是将A主机的1234端口和B主机的2223端口绑定,相当于远程端口映射(Remote Port Forwarding)。

这里每次需要输入A主机user1的登陆密码,后面会讲到解决办法。

1.2.这时在A主机上sshd会listen本地1234端口

$ ss -antState      Recv-Q Send-Q        Local Address:Port          Peer Address:Port
LISTEN     0      128               127.0.0.1:1234                     *:*

1.3.像平时一样连接到A主机的1234端口就可以控制内网B主机了

$ ssh localhost -p1234

2.一开始提到,这种反向连接(Reverse Connection)不稳定,可能随时断开,需要内网主机B再次向外网A发起连接,这时需要个“朋友”帮你在内网B主机执行这条命令。它就是Autossh。

在此之前还要解决之前的一个问题,那就是每次内网主机B连接外网主机A时都需要输入密码,这个问题ssh本身是提供另外一种验证方式——通过密钥验证用户身份,实现自动登录。

2.1.在内网B主机上生产公钥和私钥

$ ssh-keygen
...(一直按Enter,最后在~/.ssh/下生成密钥)
$ ls ~/.ssh/
id_rsa id_rsa.pub known_hosts

2.2.复制B主机上生成的id_rsa.pub公钥到外网A主机上,并将内容加入到~/.ssh/authorized_keys中

$ cat id_rsa.pub >> ~/.ssh/authorized_keys

试下,内网B主机连接外网A主机,就不再输入密码验证了

补充:今天了解到ssh-copy-id这个命令,上面这个操作就变的简单了

$ ssh-copy-id user1@123.123.123.123

2.3.再来看看Autossh的用法

$ autossh -M 5678 -NR 1234:localhost:2223 user1@123.123.123.123 -p2221

比之前的命令添加的一个-M 5678参数,负责通过5678端口监视连接状态,连接有问题时就会自动重连,去掉了一个-f参数,因为autossh本身就会在background运行。

3.终极方案:当重启内网B主机,谁来自动Autossh呢,加入daemon吧

以daemon方式执行,相当于root去执行autossh, ssh,这时刚才普通用户目录下的.ssh/authorized_keys文件会不起效。有两种办法解决,一种是用autossh的参数指定.ssh路径;另外一种是以普通用户身份执行daemon,下面是第二种方式。

/bin/su -c '/usr/bin/autossh -M 5678 -NR 1234:localhost:2223 user1@123.123.123.123 -p2221' - user1

autossh还有很多参数,用来设置重连间隔等等。

将上面命令放入下面各启动方式中,根据自己系统自己配置:

SysV:/etc/inid.d/autossh

Upstart: /etc/init/autossh.conf

systemd: /usr/lib/systemd/system/autossh.service

P.S.

1.家里是ADSL的话,用DDNS,解决ip问题

2.外网有路由的可设下端口映射

3.虽然有密钥和密码保护,但还请小心使用

分类: Linux, Network, Tools

SSH反向连接及Autossh相关推荐

  1. [转]SSH反向连接及Autossh

    http://www.cnblogs.com/eshizhan/archive/2012/07/16/2592902.html SSH反向连接及Autossh 0.接触Linux恐怕对SSH再熟悉不过 ...

  2. 用ssh反向连接访问内网主机 ( 实例使用autossh隧道实现mysql的同步 )

    一.准备知识 什么是autossh? 假设有两台主机: A主机为外网,B主机为内网 通常来说外网主机A是无法直接连接到内网主机B的,这时如果要实现A主机通过ssh控制B主机,通常来说有 两种方法: 1 ...

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

    http://www.cnblogs.com/kwongtai/p/6903420.html 转载于:https://www.cnblogs.com/littlehb/p/7598037.html

  4. SSH正向连接和反向连接

    ssh命令是openssh套件中的客户端连接工具,可以给予ssh加密协议实现安全的远程登录服务器. 反向连接是什么? 平时大多数使用ssh命令是控制端主机主动连接受控端主机,通过这个连接控制端主机可以 ...

  5. Linux-SSH反向连接(内网穿透,打洞)

    场景 对于外网来说,公司内部的是内网,中间隔了个防火墙,如果想从外网去访问公司内部网络,正常情况下是不可行的,也无法做到端口转发(除非在公司防火墙上打个洞),一般场景有外网访问公司内网,外网访问学校的 ...

  6. ssh登录显示无法建立连接服务器,SSH无法连接服务器

    服务器版本如下: @kelWEB4:/etc# lsb_release -a LSB Version: :core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd ...

  7. ssh反向主动连接 及脚本加密

    近来,在为公司客户部署相关DNS系统服务,用于资源调度服务,但是客户出口缺少公网ip地址,不能方便的去管理这台服务器,开始想到使用teamviewer做中转,穿透内网,但是在Centos环境下,照te ...

  8. 使用ssh正向连接、反向连接、做socks代理的方法

    文章出处:http://dzmailbox.blog.163.com/blog/static/120534385201232642637847/ 最近才发现ssh有多么的强大! 在网上搜了半天,发现大 ...

  9. linux通过ssh实现反向连接

    1.问题描述: 有时,我们会想在局域网外访问局域网内的机器.这时,我们可以使用SSH的反向连接来实现. 设备A:位于局域网内,可以访问代理服务器B. 假设该设备IP:A.A.A.A,用户名userA ...

最新文章

  1. R语言构建LogisticRegression模型并计算AUC指标
  2. Android中measure过程、WRAP_CONTENT详解以及 xml布局文件解析流程浅析
  3. 《Java和Android开发实战详解》——2.5节良好的Java程序代码编写风格
  4. SQL经典实例(五)元数据查询
  5. fedora 20   无法打开wifi
  6. 十多位全球技术专家,为你献上近十个小时的.Net微服务介绍
  7. react实现路由跳转_react实现hash路由
  8. ligergrid 奇偶行效果_怎么护发才是真的有效果的?
  9. scikit-learn学习之神经网络算法
  10. MonoBehaviour Lifecycle(生命周期/脚本执行顺序)
  11. mysql 锁 行级_全局锁、表级锁、行级锁mysql 极客评论笔记
  12. ipq4019 kernel 报错spi-nand spi0.1: spi transfer failed: -110
  13. 《Java从入门到放弃》JavaSE入门篇:多线程(入门版)
  14. Akka-CQRS(9)- gRPC,实现前端设备与平台系统的高效集成
  15. web开发视频教程,CSS颜色基本样式
  16. ubuntu死机咋办_Ubuntu16.04死机解决方案
  17. Excel:INDEX函数与MATCH函数
  18. java 向路由器发送报文_9.IP选路 - loda0128的个人空间 - OSCHINA - 中文开源技术交流社区...
  19. JAVA【设计模式】工厂方法模式
  20. CocoStudio基础教程(3)在程序中处理cocoStudio导出动画

热门文章

  1. maven项目,提示One or more constraints have not been satisfied
  2. oracle存储技术,oracle存储体系总结
  3. python接口自动化测试框架unittest代码_Python+unittest+requests 接口自动化测试框架搭建教程...
  4. $.ajax 发送请求,JavaScript之Ajax-2 Ajax(使用Ajax发送get请求、使用Ajax发送post请求)
  5. oracle 空间数据字段,Oracle spatial创建空间数据的字段详解
  6. python应用于期货_Python期货量化交易基础教程(17)
  7. 选择在共享模式中运行时使用的采样频率和位深度_【仪器】示波器的使用以及基本原理...
  8. 最全整理!Python 操作 Excel 库 xlrd与xlwt 常用操作详解!
  9. 大写牛逼,用 Python 登录主流 24 个网站
  10. banner特效php,jQuery自适应通栏宽屏banner幻灯片切换特效