前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SSH反向连接及Autossh

SSH反向连接及Autossh

作者头像
保持热爱奔赴山海
发布2019-09-18 14:50:32
2K0
发布2019-09-18 14:50:32
举报
文章被收录于专栏:饮水机管理员饮水机管理员

最近因为工作需要,要给生产环境的MySQL在云上搞灾备实例【 专有网络的VPC主机,×××专线太贵,走公网又不安全,暂时准备用ssh隧道跑着试试看】

原文地址: https://www.cnblogs.com/weifeng1463/p/6805624.html

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上执行
代码语言:javascript
复制
$ 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端口
代码语言:javascript
复制
$ ss -ant
State      Recv-Q Send-Q        Local Address:Port          Peer Address:Port
LISTEN     0      128               127.0.0.1:1234                     *:*
1.3.像平时一样连接到A主机的1234端口就可以控制内网B主机了
代码语言:javascript
复制
$ ssh localhost -p1234

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

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

2.1.在内网B主机上生产公钥和私钥
代码语言:javascript
复制
$ ssh-keygen
...(一直按Enter,最后在~/.ssh/下生成密钥)
$ ls ~/.ssh/
id_rsa id_rsa.pub known_hosts
2.2.复制B主机上生成的id_rsa.pub公钥到外网A主机上,并将内容加入到~/.ssh/authorized_keys中
代码语言:javascript
复制
$ cat id_rsa.pub >> ~/.ssh/authorized_keys

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

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

代码语言:javascript
复制
$ ssh-copy-id user1@123.123.123.123
2.3.再来看看Autossh的用法
代码语言:javascript
复制
$ 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,下面是第二种方式。

代码语言:javascript
复制
/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

参考文章:http://www.cnblogs.com/eshizhan/archive/2012/07/16/2592902.html

实际操作:

ssh 服务器A          客户端 B

将客户端B 的 公钥i d_rsa.pub内容 拷贝到 ssh服务器 ~/.ssh/authorized_keys 内  

[root@localhost ~]# cat /root/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDA1Il0XVTxsXotDGAhe2DMt8qvDDkmq3i3bA4xgZBlBZCSTe0q7dbaAc3wYlxQUFzhoqZgkz/UwmmbtTky7GDJxVXr942ymTLrWvhnNxF8gi80miqWc+S0qblN1YOYHVeB6TX7Czqp7c7V+OVSSSe1TwzlCnduWscE3yHeGKF7BVFSL2rheEqb9uz2JxLqzZNajSNYPLdkqFVXy4YXSy2+Yef9tkXcQeQE6WFXIFn3zNClcUsnc9tiVydIIV/UlZJoKB+X53wYsscPmZsV4rGauKnVyZqCkn65cl9R0GgsqcpzgDl4df6RPnUwQu8KKmBkyL7Ut/74rknoR3k2I6oZ root@localhost.localdomain

服务器A  上

$ cat ~/.ssh/authorized_keys

sh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDA1Il0XVTxsXotDGAhe2DMt8qvDDkmq3i3bA4xgZBlBZCSTe0q7dbaAc3wYlxQUFzhoqZgkz/UwmmbtTky7GDJxVXr942ymTLrWvhnNxF8gi80miqWc+S0qblN1YOYHVeB6TX7Czqp7c7V+OVSSSe1TwzlCnduWscE3yHeGKF7BVFSL2rheEqb9uz2JxLqzZNajSNYPLdkqFVXy4YXSy2+Yef9tkXcQeQE6WFXIFn3zNClcUsnc9tiVydIIV/UlZJoKB+X53wYsscPmZsV4rGauKnVyZqCkn65cl9R0GgsqcpzgDl4df6RPnUwQu8KKmBkyL7Ut/74rknoR3k2I6oZ root@localhost.localdomain

测试客户端B是否可以免密登录服务器A

[root@localhost ~]# ssh root@*.*.*.*

Last login: Fri Oct 20 14:39:43 2017 from 60.186.216.123

# root @ iZm5e2ln1ze72tyk6xghd4Z in

客户端B 设置:

[root@localhost ~]# cat /root/.ssh/config  StrictHostKeyChecking no

客户端B:

[root@localhost ~]# rpm -qa|grep autossh autossh-1.4e-1.el7.x86_64

[root@localhost ~]# autossh -f -M 30002 -NR 20002:localhost:22 root@*.*.*.* -p22 [root@localhost ~]# ps aux|grep ssh root 19110 0.0 0.0 80356 3564 ? Ss 13:48 0:00 /usr/sbin/sshd -D root 23857 0.0 0.0 6456 448 ? Ss 14:23 0:00 autossh -M 30002 -NR 20002:localhost:22 root@*.*.*.* -p22 root 23858 0.0 0.0 73912 3896 ? S 14:23 0:00 /usr/bin/ssh -L 30002:127.0.0.1:30002 -R 30002:127.0.0.1:30003 -NR 20002:localhost:22 -p22 root@*.*.*.* root 25724 0.0 0.0 143376 5524 ? Ss 14:37 0:00 sshd: root@pts/0 root 27950 0.0 0.0 112660 972 pts/0 S+ 14:53 0:00 grep --color=auto ssh

服务器A:

# root @ iZm5e2ln1ze72tyk6xghd4Z in ~ [14:44:45]  $ ssh root@127.0.0.1 -p 20002 root@127.0.0.1's password:  Last login: Fri Oct 20 14:37:23 2017 from 192.168.4.135 [root@localhost ~]# ifconfig br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.4.4 netmask 255.255.255.0 broadcast 192.168.4.255 inet6 fe80::424:40ff:fe4f:c068 prefixlen 64 scopeid 0x20<link> ether d0:17:c2:8c:4c:ca txqueuelen 0 (Ethernet) RX packets 790553 bytes 185836627 (177.2 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1501288 bytes 2066559368 (1.9 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

enp3s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether d0:17:c2:8c:4c:ca txqueuelen 1000 (Ethernet) RX packets 906083 bytes 216184400 (206.1 MiB) RX errors 0 dropped 51 overruns 0 frame 0 TX packets 1501283 bytes 2066559110 (1.9 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

服务器A可以正常登录客户端B

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-03-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.理论的介绍完了,下面实际操作:
    • 1.1.首先在B上执行
      • 1.2.这时在A主机上sshd会listen本地1234端口
        • 1.3.像平时一样连接到A主机的1234端口就可以控制内网B主机了
          • 2.一开始提到,这种反向连接(Reverse Connection)不稳定,可能随时断开,需要内网主机B再次向外网A发起连接,这时需要个“朋友”帮你在内网B主机执行这条命令。它就是Autossh。
            • 2.1.在内网B主机上生产公钥和私钥
            • 2.2.复制B主机上生成的id_rsa.pub公钥到外网A主机上,并将内容加入到~/.ssh/authorized_keys中
            • 2.3.再来看看Autossh的用法
        • 3.终极方案:当重启内网B主机,谁来自动Autossh呢,加入daemon吧
        相关产品与服务
        云数据库 MySQL
        腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档