利用autossh反向代理进行稳定的内网穿透(端口转发)

客户那边给出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虽然穿透到阿里云服务器,但是外网还是无法通过映射的端口 访问局域网资源。


 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现autossh的自启动,你可以按照以下步骤进行操作: 1. 创建一个启动脚本:首先,你需要创建一个启动脚本,以便在系统启动时运行autossh。你可以使用任何文本编辑器来创建一个新的脚本文件,比如autossh_start.sh。 2. 编辑启动脚本:在启动脚本中,你需要指定autossh的命令和参数。例如,如果你要使用autossh来建立一个SSH隧道连,可以在启动脚本中添加以下内容: ```bash #!/bin/bash autossh -M 0 -f -N -L <本地端口>:<目标主机>:<目标端口> <SSH用户名>@<目标主机IP> ``` 请将 `<本地端口>`, `<目标主机>`, `<目标端口>`, `<SSH用户名>` 和 `<目标主机IP>` 替换为实际的值。 3. 保存并退出:完成编辑后,请保存并退出启动脚本。 4. 设置脚本权限:运行以下命令,以确保启动脚本具有执行权限: ```bash chmod +x autossh_start.sh ``` 5. 将脚本添加到启动项:将启动脚本添加到系统的启动项中,以便在系统启动时自动运行。具体的操作方式可能因操作系统而异。 - 对于基于 systemd 的系统(如Ubuntu 16.04+),你可以创建一个名为 `autossh.service` 的服务单元文件,并将其放置在 `/etc/systemd/system/` 目录下。在文件中添加以下内容: ``` [Unit] Description=Autossh Service After=network.target [Service] ExecStart=/path/to/autossh_start.sh [Install] WantedBy=default.target ``` 请将 `/path/to/autossh_start.sh` 替换为实际的启动脚本路径。 然后,运行以下命令以重新加载 systemd 配置并启用服务: ```bash sudo systemctl daemon-reload sudo systemctl enable autossh.service ``` - 对于其他系统(如 CentOS、Red Hat、Debian 等),你可以将启动脚本的符号链添加到 `/etc/rc.d/rc.local` 文件中。运行以下命令将启动脚本添加到 `rc.local` 文件中: ```bash sudo ln -s /path/to/autossh_start.sh /etc/rc.d/rc.local ``` 请将 `/path/to/autossh_start.sh` 替换为实际的启动脚本路径。 6. 重新启动系统:完成上述步骤后,重新启动系统,autossh应该会在系统启动时自动运行。 这样,autossh就会在系统启动时自动建立 SSH 隧道连。记得根据你的实际需求和配置进行相应的调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值