利用AutoSSH建立SSH隧道,实现外网访问内网HomeAssistant

利用AutoSSH建立SSH隧道,实现外网访问内网HomeAssistant

当我们使用公司或家中电脑搭建了 HomeAssistant 时,一般不能直接从外网访问,为了实现从外网直接访问到内网的服务,一般会需要用到 内网穿透 技术。今天介绍如何通过 SSH 端口转发,使内网主机上的HomeAssistant服务转发至公网主机 B 上,可以通过主机B的“IP地址+端口号”的方式访问内网的HomeAssistant。

硬件条件

内网主机 A:树莓派,运行HomeAssistant服务

Linux 公网主机 B:阿里云主机

第一步:公网服务器配置

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

GatewayPorts yes

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

重启 sshd 服务

$ sudo service sshd restart

第二步:安装 AutoSSH 服务

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

$ sudo apt-get install autossh

第三步:断线免密登录自动重连

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

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

$ ssh-keygen

然后按三次回车执行默认选项生成公钥和私钥。会生成密钥文件和私钥文件 id_rsa,id_rsa.pub 或id_dsa,id_dsa.pub,默认保存目录为“/home/pi/.ssh/”。

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

$ ssh-copy-id  username@ip

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

第四步:利用 AutoSSH 实现端口转发

在内网主机 A 上,利用 AutoSSH 建立一条 SSH 隧道

autossh -M 4010 -NR 0.0.0.0:8123:localhost:8123 username@xxx.xxx.xxx.xxx (-p xxxx)

参数解释:

  • “-M 4010”意思是使用内网主机 A 的 4010 端口监视 SSH 连接状态,连接出问题了会自动重连

  • “-N”意思是不执行远程命令

  • “-R”意思是将远程主机(公网主机 B)的某个端口转发到本地指定机器的指定端口

    代码解释:

  • “0.0.0.0:8123:localhost:8123”意思是将内网主机 A 的 8123 号端口转发至公网主机 B 的任意IP的 8123 号端口上

  • “username@xxx.xxx.xxx.xxx”意思是公网主机 B 的用户名和 IP

  • “-p xxxx”意思是公网主机 B 的 SSH 端口,如果是默认的 22 号端口,则可以不输入

第五步:监听端口检查

分别检查本地主机 A 及公网主机 B 的端口监听情况,出现如下进程则为正常。

本地主机 A:

pi@raspberrypi:~ $ lsof -i:4010
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ssh     1908   pi    4u  IPv6  27513      0t0  TCP localhost:4010 (LISTEN)
ssh     1908   pi    5u  IPv4  27514      0t0  TCP localhost:4010 (LISTEN)

远程主机 B:

[root@f-numen ~]# netstat -antp | grep 8123
tcp        0      0 0.0.0.0:8123            0.0.0.0:*               LISTEN      1190/sshd: root

想要在远程主机上关闭连接,可以使用kill命令:

$ kill 1190

第六步:开启自启动

配置 本地主机 A的AutoSSH 开机自启动,输入:

$ sudo nano /etc/rc.local

在“exit 0”前面输入添加内容:

# 建立ssh隧道,在断开后自动重连
(
# 等待本机网络启动,替换其中ip地址为本机的网关地址
until ping -nq -c3 192.168.*.1; do
   # Waiting for network
   sleep 5
done
# 使用autossh命令
/usr/bin/nohup sudo -u pi /usr/bin/autossh -M 4010 -fCNR 0.0.0.0:8123:localhost:8123 -o BatchMode=yes -i /home/pi/.ssh/id_rsa username@xxx.xxx.xxx.xxx
)&

说明:

“-o BatchMode=yes”:不用输入yes

“-i /home/pi/.ssh/id_rsa”:密钥的绝对路径

至此完成了端口转发,在相应的应用(如浏览器)中输入公网服务器 B 的 IP+端口即相当于直接访问内网主机 A 的相应服务,大功告成!

FAQ:

1、配置完通过外网 IP 加端口无法访问

配置完通过外网 IP 加端口无法访问: 请检查公网服务器防火墙是否开放响应端口。如下为阿里云服务器开放端口方法:

(1)打开服务器安全组,点击“配置规则”

(2)手动添加“入方向”的访问规则如下:

目的端口范围可根据配置的主机B端口进行修改,这里我配置的与Homeassistant的默认端口号一致。

参考文章:

https://zhuanlan.zhihu.com/p/112227542

https://www.hachina.io/docs/2147.html

https://blog.csdn.net/a33445621/article/details/51097233?locationNum=8&fps=1


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 xumeng32@126.com

文章标题:利用AutoSSH建立SSH隧道,实现外网访问内网HomeAssistant

文章字数:1.2k

本文作者:F_numen

发布时间:2020-05-23, 18:52:16

最后更新:2020-05-23, 22:23:07

原始链接:https://netheroone.cn/archives/22c866ec.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
/*baidu统计*/