最近我买了一台树莓派主机 ,并且装上了官方系统(Raspbian )。打算用它来跑跑脚本之类的。但是遇到一个问题,我在外的时候,怎么远程连接家里的在局域网中的主机呢?
我已经成功的解决了这个问题,期间也遇到了各种坑,我在这里也会详细的说一下这些坑。如果您还有任何其他问题,可以在下面评论留言给我。

软硬件环境:
1.树莓派 3b+ 1个,安装于我租住的房间中。联网经过多层NAT(网络地址转换),故无公网IP
2.一个有公网IP的VPS(虚拟主机),我使用的是国外的vultr,您也可以选择阿里云,亚马逊等各种厂商产品。这台机器的操作系统为 centos 7.0 ,IP 为 A.A.A.A
3.一台普通的电脑


操作步骤:

  1. 修改公网服务器 ssh 配置文件 sshd_config 文件:
# vi /etc/ssh/sshd_config
添加 GatewayPorts yes
# 重启 ssh 服务
# centos 7
systemctl reload sshd.service
# centos 7 以下
service sshd reload
  1. 局域网中的树莓派连接公网服务器反向代理端口:

    这段代码在本地树莓派中执行,这段代码是将本地机器的22端口绑定公网服务器的7233端口

ssh -CqTfnN -R 0.0.0.0:7233:127.0.0.1:22 root@A.A.A.A
  1. 检查反向代理是否成功:
    在公网服务器中执行如下代码,如果出现相同结果则表明 SSH反向代理成功
netstat -anp | grep 7233
tcp        0      0 0.0.0.0:7233                0.0.0.0:*                   LISTEN      2392/sshd
tcp        0      0 :::7233                     :::*                        LISTEN      2392/sshd
  1. 测试是否能通过反向代理连接局域网中的树莓派:
    这时,你可以通过普通电脑的ssh客户端 连接 公网服务器的7233端口。测试连接是否成功
ssh -p 7233 root@A.A.A.A

编写脚本守护反向代理
1.设置树莓派免密码登录公网服务器:

# 在内网树莓派中执行
ssh-keygen -t rsa -P ''
# 然后一直按回车, 于是在~/.ssh/中 会生成两个文件 id_rsa 与 id_rsa.pub
# 将id_rsa.pub 复制到公网服务器中
scp ~/.ssh/id_rsa.pub root@A.A.A.A:~
#输入密码#切换到公网服务器中执行如下代码
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
#修改文件权限,这一步很必要
chmod 600 .ssh/authorized_keys
chmod 700 .ssh/

2.编写公网服务器关闭代理脚本

#!/bin/shif [ -n "$1" ] && [ "$1" -gt "0" ];thenPID=$(netstat -anp | grep $1 | awk '/sshd/ && !/awk/{print $7}')PID=${PID%%/*}if [ -n "${PID}" ];thenkill -9 $PID && exit 0fi
fiexit 1

3.编写客户端代理守护脚本 (注意配置服务器端口及IP)

#!/bin/bashROMOTE_USERNAME=root
ROMOTE_SERVER_IP="A.A.A.A"
ROMOTE_PORT=7233
###[ /sbin/ifconfig|sed -n '/inet addr/s/^[^:]*:\([0-9.]\{7,15\}\) .*/\1/p'|grep -v 127.0.0.1 ]
LOCALHOST_IP=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`
LOCALHOST_PORT=22while true ;
doPID=$(ssh -l root ${ROMOTE_SERVER_IP}  netstat -anp | grep ${ROMOTE_PORT} | awk '/sshd/ && !/awk/{print $7}')PID=${PID%%/*}if [ -n "$PID" ] && [ "$PID" -gt "0" ];thensleep 30selse/usr/bin/ssh -l root ${ROMOTE_SERVER_IP} /bin/sh /data/kill_ssh_agent.sh ${ROMOTE_PORT}/usr/bin/ssh -CqTfnN -R 0.0.0.0:${ROMOTE_PORT}:${LOCALHOST_IP}:${LOCALHOST_PORT} ${ROMOTE_USERNAME}@${ROMOTE_SERVER_IP}fi
doneexit 0

4.设置 SSH 连接为长连接 (在公网服务器操作)

vi /etc/ssh/sshd_config#每1分钟发送一个心跳信号给客户端
ClientAliveInterval 60
#最大超时次数,客户端不响应则关闭连接
ClientAliveCountMax 3
  1. 设置为开机启动 (在内网机器操作):
vi /etc/rc.local/bin/sh /data/ssh_agent_deamon.sh &

遇到的问题:
理论上按照上面的步骤操作,反向代理就能成功了。但是操作中我还是遇到了不少问题。我这里把他们列出来
1.防火墙
防火墙会阻止未经许可端口的数据通过,所以允许端口的防火墙通过是很有必要的。您需要确认每台机器是否有防火墙,如果有防火墙,是否正确的配置了防火墙。
另外,在公网服务器中,很多服务商提供了额外的防火墙服务。在他们的网页控制台可以看到。我的公网服务器就有服务商提供的额外防火墙。我的做法是将centos自带的防火墙关掉,并禁止开机启动。然后配置服务商提供的防火墙,允许反向代理的端口通过。当然您也可以两个防火墙都开着,但要确保他们都通过了您需要的端口。
2.ssh自动登录失败:
自动登录失败,可能因为你的秘钥文件权限不对。ssh秘钥登录对文件权限很敏感。还有我犯了一个错误,我在公网服务器生成秘钥,然后放到本地。导致一度登录失败。正确的做法应是在内网生成秘钥,放到外网服务器中
3.守护脚本不能成功设置反向代理问题:
守护代理是通过 /etc/rc.local 开机启动的,其默认用户为root。我在生成秘钥的时候一直用的普通用户,于是导致在开启自动启动时运行失败。解决办法是,切换到内网机器的root用户,再生成一次秘钥,将秘钥追加到公网服务器的authorized_keys文件中。如果新买的机器不知道root用户的密码是什么,可以看一下参考文章的第4个连接

参考的文章:
https://www.cnblogs.com/phpdragon/p/5314650.html
https://blog.csdn.net/Post_Yuan/article/details/78603212
http://www.mamicode.com/info-detail-2128504.html
https://blog.csdn.net/faryang/article/details/50779767

如果有帮到您,打个赏呗

利用SSH 反向代理 ,实现跨局域网连接家里的linux 主机 (树莓派)相关推荐

  1. 利用nginx 反向代理解决跨域问题

    利用nginx 反向代理解决跨域问题 参考文章: (1)利用nginx 反向代理解决跨域问题 (2)https://www.cnblogs.com/hpx2020/p/9928175.html 备忘一 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    http://www.cnblogs.com/kwongtai/p/6903420.html 转载于:https://www.cnblogs.com/littlehb/p/7598037.html

  3. 通过nginx反向代理解决跨域

    先写一个发送跨域请求的页面index.html <html> <head><title></title> </head> <body& ...

  4. 树莓派+SSH反向代理实现远程开机

    之前购买的向日葵开机棒出现了bug,客服给解决不了,想跟客服通个电话,客服表示不提供电话服务,无语.结果只能放在一边吃灰了.转念一想家里的树莓派可以用作远程唤醒,但是需要解决一个问题,就是内网穿透.何 ...

  5. 利用 squid 反向代理提高网站性能

    本文在介绍 squid 反向代理的工作原理的基础上,指出反向代理技术在提高网站访问速度,增强网站可用性.安全性方面有很好的用途.作者在具体的实验环境下,利用 DNS 轮询和 Squid 反向代理技术, ...

  6. nginx反向代理解决跨域问题,使本地调试更方便

    nginx反向代理解决跨域问题,使本地调试更方便 参考文章: (1)nginx反向代理解决跨域问题,使本地调试更方便 (2)https://www.cnblogs.com/gwf93/p/102951 ...

  7. webpack-dev-server 设置反向代理解决跨域问题

    webpack-dev-server 设置反向代理解决跨域问题 参考文章: (1)webpack-dev-server 设置反向代理解决跨域问题 (2)https://www.cnblogs.com/ ...

  8. iconfont配置nginx跨域问题、nginx反向代理接口跨域

    1.nginx配置解决iconfont跨域 浏览器跨域访问js.css.img等常规静态资源被同源策略许可,但iconfont字体文件(eot|otf|ttf|woff|svg)例外,此时可在ngin ...

  9. vue反向代理解决跨域及部署nginx端口转发解决跨域

    1. 前言 本文是为了解决vue反向代理解决跨域及部署服务器nginx端口转发解决跨域,因为踩了不少的坑,百度了很多,也试了太多的方法,最终得以解决,所以记录一下,希望遇到同样问题的友友们可以高效的解 ...

最新文章

  1. 一文看懂百度云智峰会:发布两大中台、八大方案,落地细节精准到发丝
  2. Python操作Zip文件
  3. 过年遇到前任借钱, 如何傲娇的拒绝?
  4. fedora java 开发环境_在Linux(Fedora)下搭建JAVA开发环境
  5. C#(Sharp)进阶篇:文件操作
  6. PHP小语种网站开发,当阳小语种建站
  7. pjsip视频通信开发(上层应用)之EditText重写
  8. 【转】.NET 的 WebSocket 开发包比较
  9. Java –什么是瞬态字段?
  10. Twisted中的putChild和getChild
  11. python自动复制,Python数组自动相互复制
  12. RN style使用以及常用样式总结
  13. win11错误代码0xc1900101怎么解决 windows11错误代码0xc1900101的解决方法
  14. 【深度优先搜索】计蒜客:置换的玩笑
  15. Cocos2d-x 地图行走的实现3:A*算法
  16. 查看远端的端口是否通畅3个简单实用案例
  17. vue接入百度翻译api
  18. 【洛谷】P5960 【模板】差分约束算法
  19. robotframework报错
  20. 微信公众号+Vue+JS-SDK配置注册失败,显示config:fail,Error: 系统错误,错误码:63002,invalid signature等解决方法

热门文章

  1. DL之R-FCN:R-FCN算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  2. CV之MTCNN:MTCNN算法过程及其相关思路配图集合
  3. Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Canvas)
  4. Ubuntu出现卡logo、卡住、黑屏无法正常启动、屏幕和键盘背光无法调节等一系列问题?可能是NVIDIA显卡驱动没装好...
  5. jQuery里面的addClass讲解
  6. Linux usual cmd
  7. javascript select option对象总结
  8. SQL Server中查询所有的表、视图、列和存储过程
  9. 微软一站式示例代码库 7月新代码示例发布
  10. jBPM3.12用户指南中文翻译----第二章 起步