一、准备知识
什么是autossh?
假设有两台主机: A主机为外网,B主机为内网
通常来说外网主机A是无法直接连接到内网主机B的,这时如果要实现A主机通过ssh控制B主机,通常来说有
两种方法:
1.端口映射:
将B主机的ssh端口映射到B的外网ip,当然这要通过设置防火墙来实现
2.ssh的反向连接:
B主机通过ssh连接到A主机,并在A主机上打开一个端口进行监听。这时如果A主机连接本机的这个端口就可以实现控制B主机
ssh -NfR 1111:localhost:2222 user1@外网主机A -p 22
2222为A主机在B打开的监听端口,1111为A主机本地的端口,这时访问B主机的2222端口就映射在A主机的1111端口了。这个也叫远程端口映射。
这种反向连接很有用,但是很不稳定,经常断开。每次断开都要重新执行上面的命令,如果想要断开时自动执行这个命令,这就需要Autossh来完成了。
为什么要使用ssh来完成mysql的主从同步?
和上面的情况一样,一台内网主机要和一台外网主机做主从同步
二、实现步骤
2.1 生成密钥
登陆内网主机B上执行下面的命令来生成ssh密钥,一路回车就可以
ssh-keygen -t rsa
2.2 上传密钥
将内网主机B生成的pub文件上传到A主机
ssh-copy-id -i .ssh/id_rsa.pub user@外网主机A
或者将id_rsa.pud文件scp过去,执行
cat id_rsa.pub >> ~/.ssh/authorized_keys
2.3 启用证书
编辑 A主机上的 /etc/ssh/sshd_config,去掉以下三行的注释:
RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
2.4 测试登陆
这时B主机ssh到外网A主机就使用证书登陆了,不用输入密码了
2.5 安装软件
这里就用到了上面的autossh,内网主机B需要安装autossh,A主机不需要
wget http://www.harding.motd.ca/autossh/autossh-1.4c.tgz tar -xf autossh-1.4c.tgz cd autossh-1.4c ./configure make install
2.6 端口映射
在内网主机B上使用autossh将本机的13306端口映射到外网主机A的3306端口
autossh -M 20522 -f -N -L 13306:localhost:3306 user@外网主机A
2.7 mysql同步
这时就可以使用本机的13306端口进行MySQL服务器的同步了
MySQL服务器如何配置主从同步请参见:
http://www.52os.net/mysql-server-replication-config.html
参考文档
http://www.cnblogs.com/eshizhan/archive/2012/07/16/2592902.html
SSH反向连接的使用
1、什么是反向连接?
反向连接是指主机A(受控端)主动连接主机B(控制端),在主机A和主机B之间建立一个远程连接,通过这个连接主机B可以主动的向主机A发送一些请求。
2、为什么需要主机A主动去连接主机B呢?
这是因为主机A在局域网内,如果没有对主机A进行端口映射,对于主机B来说主机A是不可见的,如果在主机B这边向主机A发送连接请求,这个请求是不可达的。而主机B有自己独立的IP,对于主机A来说是可见的,可以直接向主机B请求连接。
3、SSH反向连接的过程
方法就是主机A主动去连接主机B,主机B响应主机A的连接请求,它们之间就建立了一个远程连接。然后主机B在本地再创建一个本地连接,重定向到主机A和主机B刚才建立的远程连接上,之后对这个本地连接的操作都会反馈到远程连接上去。整个过程类似于文件的DUP,这就在主机A和主机B之间建立了连接通道,此时对于主机B来说,主机A已经是可见了。
连接流程如下:
3.1、主机A ssh客户端向主机B sshd服务端发送请求,建立远程连接。
3.2、主机B sshd服务端创建本地连接很远程连接的映射(反向连接通道)。
3.3、主机B ssh客户端向主机B sshd服务端的连接通道发送请求, 建立主机B ssh和主机A sshd的连接。
完成连接后,主机A对于主机B可见的形式就是存在于主机B的那个本地连接。
4、为什么需要在主机B对远程连接映射一个本地连接?
反向连接就是CS架构,不过是受控端主动向控制端请求连接,让它们之间的连接建立。传统的CS方式是可以解决主机A和主机B之间的连接问题,但是那样主机A和主机B的连接方式并不灵活,两者之间能做的事情,只能是CS之际协议规定的事情。在主机B上建立了主机A的连接映射后, 对于主机B来说主机A已经不是局域网内那台不可见的主机,主机A已经是存在主机B的一台可见主机,这样就消除了局域网和广域网的阻碍。 主机A和主机B之间建立的那个远程连接就是主机A和主机B的通道-“网线”。
5、SSH反向连接的使用
使用的过程中碰到一个问题, 就是在主机A上发起请求的时候, 需要输入密码。 如果我在家里, 不可能跑到公司了去输入密码。于是用ssh public key的方法和写一个脚本来解决。脚本如下:
#!/bin/bash while true;do RET=`ps ax | grep "ssh -f -N -R 10000:localhost:22" | grep -v "grep"` if [ "$RET" = "" ]; then echo "restart ssh server" ssh -f -N -R 10000:localhost:22 username@公网IP fi sleep 10 done
脚本的作用就是监控反向连接的服务, 在被异常中断的时候重启, 使用了SSH公钥后, 也不必跑到公司输入密
码了。 :-)
更多参考:
- https://www.52os.net/articles/use-autossh-tunnel-to-auto-reconnect-for-mysql-replication.html
- http://zhangrui90.blog.51cto.com/942051/559647
- http://b.liuctic.com/2013/12/ssh%E6%AD%A3%E5%90%91%E5%8F%8D%E5%90%91%E8%BF%9E%E6%8E%A5%E7%9A%84%E5%BC%BA%E5%A4%A7%E5%8A%9F%E8%83%BD%E4%BB%A5%E5%8F%8Aautossh%E3%80%90%E8%BD%AC%E8%BD%BD%E4%B8%A4%E7%AF%87%E3%80%91/
- http://www.sudops.com/autossh-make-your-ssh-always-connected.html
- http://www.oschina.net/translate/automatically-restart-ssh-sessions-and-tunnels-using-autossh
- http://my.oschina.net/abcfy2/blog/177094
转自:用ssh反向连接访问内网主机 ( 实例使用autossh隧道实现mysql的同步 )
相关推荐
Autossh 是一个用来监控 SSH 链接,并自动进行重连的工具。类似 rstunnel (Reliable SSH Tunnel),采用 C 语言开发,安装简单,特别适合多个主机的连接。
使用autossh+阿里云做反向代理笔记,无需任何第三方软件
ssh服务应用于各种场景,而autossh是ssh的自动模式,安装之后无论开关机还是重启都不会影响ssh的连接,有利于那些使用ssh远程连接服务器的用户。
Autossh Node.js的持久SSH隧道安装使用npm npm i -S autossh用法开始const autossh = require ( 'autossh' ) ;autossh ( { host : '111.22.333.444' , username : 'root' , localPort : 64444 , remotePort : 5432} ...
sed(可选)这个怎么运作在~/.ssh/config要隧道连接的站点:检测到前缀为'autossh-'的Host声明作为隧道站点的候选者,例如: Host autossh-HOSTNAMEHostname HOSTNAMEUser USERRemoteForward 8022 localhost:22...
Bash脚本可轻松设置反向ssh隧道,以便将ssh传递到nat后面的主机 您必须安装sqlite3和autossh Debian / Ubuntu apt安装sqlite3 autossh CentOS yum安装sqlite3 autossh 安装完所有内容后,您将在服务器上运行并...
主要是监控autossh,默认的反向连接会出现掉线的情况,主要的表现是程序没有挂掉,但是无法控制,本程序主要是监控这个autossh用的。
一些条款: LOCALMACHINE:您要连接的计算机REMOTEMACHINE:您要连接的机器REMOTESERVER:第三台世界可访问的机器,用于通过它建立ssh隧道通过REMOTESERVER创建到REMOTEMACHINE的反向隧道: 安装cygwin。...
autossh init.d脚本在Debian / Raspian引导中生成ssh隧道的脚本用法确保您已经安装了autossh $apt-get install autosshAutossh不允许设置密码,因此您必须将rsa密钥上载到远程服务器。 由于我们没有为autossh配置...
autossh 1.4e autossh 是一个用来启动 ssh 并进行监控的程序,可在需要时重启 ssh,例如程序挂掉或者是网络出现问题。
概述jnovack / autossh是一个小型的轻量级映像(约15MB),尝试提供一种安全的方式来建立SSH隧道,而无需在映像本身中包含密钥或链接到主机。 有数千个autossh docker容器,为什么要使用这个容器? 我希望您发现它更...
xxxxx.ipk建造如果您使用其他OpenWRT版本,请自己构建:cd进入根目录,然后 # clone the Makefilegit clone ... 如果需要从公用网络访问它,则需要启用Gatew
ansible-autossh-tunnel-client:在Ubuntu系统(客户端)中设置持久隧道(使用autossh)
码头工人汽车###配置autossh编辑autossh-start.sh脚本 docker run -i -t jessefugitt/docker-autossh /bin/bashvi autossh-start.sh修改反向隧道和连接线: -R *:1234:localhost:8080 \ root@docker-sshd-ip-address...
ansible-autossh-tunnel-server:在类似Debian的系统(服务器端)中建立持久隧道(使用autossh)
centos操作系统下免登录的一键配置工具,使用前先安装expect,并配置机器的IP,账号与密码,一键执行即可。
第一步: 用autossh打通内网控制障碍 树莓派安装autossh,并且生成公钥私钥 sudo apt-get install autossh ssh-keygen ssh-copy-id username@server_ip 新建autossh自启动脚本, chmod a+x autossh 并运行, 脚本的内容...
屯曼 网络设置自动化和监督。...#2:可以通过添加SSH层来加密与外部服务器的连接(例如,通过SSH加密层与外部服务器进行MySQL复制) #3:可以向远程服务器公开本地隐藏服务 #4:可以转发隐藏在Docker容器中的远程
#autossh-openwrtopenwrt 官方的 autossh 有bug,所以我在这里做一个分支。