利用autossh反向代理进行稳定的内网穿透(端口转发)
客户那边给出2台服务器,只有一台可以外网服务器A,一台是内网服务器B由于放边运维,所以搭建了一个A->B的远程转发成功结果是:可以通过外网服务器A进行ssh连接访问服务器B需要用到内网穿透技术一台公网主机 A,一台 Linux 内网主机 B。下文以 CentOS7 系统为例。第一步:公网服务器配置修改公网主机 A 的 SSH 配置文件/etc/ssh/sshd_config找到 Gatewa
客户那边给出2台服务器,只有一台可以外网服务器A,一台是内网服务器B
由于方便运维,所以搭建了一个A->B的远程转发
成功结果是:可以通过外网服务器A进行ssh连接访问服务器B
需要用到 内网穿透 技术
一台公网主机 A,一台 Linux 内网主机 B。下文以 CentOS7 系统为例。
第一步:公网服务器配置
修改公网主机 A 的 SSH 配置文件/etc/ssh/sshd_config
找到 GatewayPorts将no改为yes
GatewayPorts yes
这样可以把监听的端口绑定到任意 IP 0.0.0.0 上,否则只有本机 127.0.0.1 可以访问。
重启 sshd 服务
systemctl restart sshd
第二步:安装 AutoSSH 服务
在内网主机 B 上,执行以下命令安装 AutoSSH
yum install autossh
第三步:断线免密登录自动重连
ssh 反向链接会因为超时而关闭,如果关闭了那从外网连通内网的通道就无法维持,为此我们需要结合免密码登录及 AutoSSH 来提供稳定的 ssh 反向代理隧道。
1、在内网主机 B 上产生公钥和私钥
ssh-keygen
然后按三次回车执行默认选项生成公钥和私钥。会生成密钥文件和私钥文件 id_rsa,id_rsa.pub 或 id_dsa,id_dsa.pub
2、拷贝秘钥 在内网主机 B 上继续执行如下命令,将内网主机 B上的秘钥文件 copy 到公网主机 A 中。
ssh-copy-id username@ip
其中“username”是公网主机 A 的用户名,ip 为公网主机 A 的 ip,然后按照提示输入公网主机A 的密码就完成了。
第四步:利用 AutoSSH 实现端口转发
在内网主机 B 上,利用 AutoSSH 建立一条 SSH 隧道
autossh -p 22 -M 11222 -fNR 11221:localhost:22 A的用户名@A的IP
or
autossh -p 22 -M 11222 -NR 11221:localhost:22 A的用户名@A的IP &
-p 指定外网服务器的ssh端口(默认22)
-M 在外网服务器中指定一个端口,监听连接的状态,使断开后进行重连,比如这里的11222就是监听端口,监听这个ssh连接是否断开,断开就自动重连
-f 隧道建立成功后在后台运行
-N 不执行远程指令
-L 建立本地SSH隧道,指定本地的某端口转发到远程主机的某端口
-R 建立远程SSH隧道,指定远程主机上的某端口转发到本地的某端口
-NR 11221:localhost:22 可理解为将本地的22端口转发/映射到A的11221端口,即A可通过自己的11221端口,连接到B
第五步:登录A访问B
可以先登录到A,再使用如下命令,登录B(需输入B的密码)
//先登上服务器A,然后输入这句切换到11221端口就能登录到服务器B了
ssh -p11221 root@localhost
//如果是服务器C想登录服务器B的话就下面这句
ssh root@AIP -p 11221
//如果想要断开的话
ps -ef | grep 11221(上面的端口转发)
kill掉进程即可
第六步:开启自启动
配置 AutoSSH 开机自启动,输入:
vi /etc/rc.d/rc.local
添加内容:
autossh -p 22 -M 11222 -fNR 11221:localhost:22 A的用户名@A的IP
chmod +x /etc/rc.d/rc.local
七.可能存在的问题(随时更新)
1.发现了一个问题,大家在公网服务器A里kill掉你通过11221端口转发 的这个11221端口
你会发现继续用ssh -p11221 root@localhost连接不上了,因为没有了11221端口监听了,那怎么办呢?
2.配置完AUTO SSH之后,发现还是无法穿透,解决方法是配置下ssh, 开启 GatewayPorts 参数即可。
#修改配置
[root@localhost ~] vi /etc/ssh/sshd_config
GatewayPorts yes
#重启SSHD
[root@localhost ~] systemctl restart sshd.service 或者 sudo /etc/init.d/ssh restart
GatewayPorts原理:
当请求一个TCP端口的时候,默认情况下,SSH只监听本机地址,这就导致AUTOSSH虽然穿透到阿里云服务器,但是外网还是无法通过映射的端口 访问局域网资源。
更多推荐
所有评论(0)