autossh 解决内网访问

准备

  1. 公网服务器(阿里云、腾讯云都可)
  2. 需要访问的目标内网服务器

公网服务器配置

修改公网主机 B 的 SSH 配置文件/etc/ssh/sshd_config

GatewayPorts yes

这样可以把监听的端口绑定到任意 IP 0.0.0.0 上,否则只有本机 127.0.0.1 可以访问。

重启 sshd 服务

sudo service sshd restart

内网服务器配置

在内网主机 A 上,执行以下命令安装 AutoSSH

yum install autossh  #centos
apt-get install autossh #ubuntu

断线免密登录自动重连

ssh 反向链接会因为超时而关闭,如果关闭了那从外网连通内网的通道就无法维持,为此我们需要结合免密码登录及 AutoSSH 来提供稳定的 ssh 反向代理隧道。

1、在内网主机 A 上产生公钥和私钥

ssh-keygen

然后按三次回车执行默认选项生成公钥和私钥。会生成密钥文件和私钥文件 id_rsa,id_rsa.pub 或 id_dsa,id_dsa.pub

2、拷贝秘钥 在内网主机 A 上继续执行如下命令,将内网主机 A 上的秘钥文件 copy 到公网主机 B 中。

ssh-copy-id  username@ip

其中“username”是公网主机 B 的用户名,ip 为公网主机 B 的 ip,然后按照提示输入公网主机 B 的密码就完成了。

启动autossh

注意

前提是公网服务器的22001端口(也可自定义)已经开放,没有的话先去设置安全组

autossh -M 4010 -NR 22001:localhost:22 username@xxx.xxx.xxx.xxx (-p xxxx)

参数解释:

  • “-M 4010”意思是使用内网主机 A 的 4010 端口监视 SSH 连接状态,连接出问题了会自动重连
  • “ -N”意思是不执行远程命令
  • “-R”意思是将远程主机(公网主机 B)的某个端口转发到本地指定机器的指定端口

代码解释:

  • “22001:localhost:4000”意思是将内网主机 A 的 4000 号端口转发至公网主机 B 的 22001 号端口上
  • “username@xxx.xxx.xxx.xxx”意思是公网主机 B 的用户名和 IP
  • “-p xxxx”意思是公网主机 B 的 SSH 端口,如果是默认的 22 号端口,则可以不输入.

查看端口情况

lsof -i:4010

开机自启

在 Ubuntu 中我们可以使用 systemd 管理 autossh 的开机启动问题(旧版本中可以使用 init.d)。配置很简单,只需要创建一个 /etc/systemd/system/remote-autossh.service 文件:

[Unit]
Description=AutoSSH service for remote tunnel
After=network-online.target

[Service]
User=your_username
ExecStart=/usr/bin/autossh -M 4010 -NR 22001:localhost:22 remote_user@a_a_a_a

[Install]
WantedBy=multi-user.target   #这个target组内的所有服务都会开机自启,这才是systemctl的关键

这样就创建了一个 remote-autossh 服务,并指定其在网络服务启动后启动。可以运行 systemctl daemon-reload && systemctl start remote-autossh 立即启动服务,或者 systemctl enable remote-autossh.service 启动服务并设置为开机启动。

需要注意的是,配置文件中的 autossh 命令需要替换为其绝对地址,以及不支持 -f 参数。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐