##先决条件为:一个有公网IP的VPS(虚拟主机),我使用的是国内的腾讯云,您也可以选择阿里云,亚马逊等各种厂商产品。这台机器的操作系统为 centos 7.0 ,IP 为 A.A.A.A

#双内网主机

#实现不同内网内的主机ssh连接

 vi /etc/ssh/sshd_config

  

添加 GatewayPorts yes

  然后

systemctl reload sshd.service
重读配置

  

本地内网操作

ssh -CqTfnN -R 0.0.0.0:7222:127.0.0.1:22 root@A.A.A.A

                   7222端口本地22端口           运程公网ip

检查

netstat -anp | grep 7222

  测试

ssh -p 7222 root@A.A.A.A

注意不是运程ip 密码
是你要连接的本地内网root密码
注意区分

  编辑为长连接

vi /etc/ssh/sshd_config

#每1分钟发送一个心跳信号给客户端
ClientAliveInterval 60 # 秒
#最大超时次数,客户端不响应则关闭连接
ClientAliveCountMax 3 #次

理论上按照上面的步骤操作,反向代理就能成功了。但是操作中我还是遇到了不少问题。我这里把他们列出来
1.防火墙
防火墙会阻止未经许可端口的数据通过,所以允许端口的防火墙通过是很有必要的。您需要确认每台机器是否有防火墙,如果有防火墙,是否正确的配置了防火墙。
另外,在公网服务器中,很多服务商提供了额外的防火墙服务。在他们的网页控制台可以看到。我的公网服务器就有服务商提供的额外防火墙。我的做法是将centos自带的防火墙关掉,并禁止开机启动。然后配置服务商提供的防火墙,允许反向代理的端口通过。当然您也可以两个防火墙都开着,但要确保他们都通过了您需要的端口。
2.ssh自动登录失败:
自动登录失败,可能因为你的秘钥文件权限不对。ssh秘钥登录对文件权限很敏感。还有我犯了一个错误,我在公网服务器生成秘钥,然后放到本地。导致一度登录失败。正确的做法应是在内网生成秘钥,放到外网服务器中
还有就是编辑守护脚本

#!/bin/bash

ROMOTE_USERNAME=root
ROMOTE_SERVER_IP="A.A.A.A"
ROMOTE_PORT=7222
###[ /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=22 while true ;
do
PID=$(ssh -l root ${ROMOTE_SERVER_IP} netstat -anp | grep ${ROMOTE_PORT} | awk '/sshd/ && !/awk/{print $7}')
PID=${PID%%/*}
if [ -n "$PID" ] && [ "$PID" -gt "0" ];then
sleep 30s
else
/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
done exit 0

  注意serverip

和port端口

守护脚本不能成功设置反向代理问题:
守护代理是通过 /etc/rc.local 开机启动的,其默认用户为root。我在生成秘钥的时候一直用的普通用户,于是导致在开启自动启动时运行失败。解决办法是,切换到内网机器的root用户,再生成一次秘钥,将秘钥追加到公网服务器的authorized_keys文件中。如果新买的机器不知道root用户的密码是什么

注意要优先实现免密登录 操作才好办

最新文章

  1. Linux 入门之网络配置
  2. 【手记】未能从程序集System.Net.Http.Formatting中加载类型System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter
  3. DataAdapter与DataSet的使用
  4. document对象操作:浏览器页面文件
  5. ImageMagick远程命令执行工具检测工具
  6. 《Play for Java》学习笔记(二)基本的CRUD应用
  7. Android中Webview使用javascript调用事先定义好的Java函数
  8. malloc/free和new/delete的区别汇总
  9. nginx 中文文件名显示问题
  10. js实现图片变化
  11. springboot整合netty(二)
  12. PHP基础学习----字符串操作
  13. Maven 那点事儿(转)
  14. 学习基础和C语言基础调查
  15. SQL Server索引误区使用建议
  16. [MapReduce_7] MapReduce 中的排序
  17. SystemTap - 安装
  18. spring quartz动态修改执行时间
  19. 02-Sockent客户端
  20. 【python】安装bcoding

热门文章

  1. 链接mysql数据库报错:2003-cant connect to Mysql server on ‘localhost’(10038)
  2. 为什么 .NET应用推荐使用 await、async异步编程?
  3. (原创)Onlyoffice docs docker实例安装示例后,打开文档提示:文档下载失败
  4. (0319) uvmgen的使用,产生的UVM环境介绍
  5. php curl方法封装
  6. undefined reference to symbol xxxxx和undefined symbol:xxxx错误的原因分析以及解决方法
  7. zk-复制安装
  8. notepad++设置
  9. macos下编译glfw
  10. Fortran笔记 派生类型-整理版