文章目录

  • 情景描述
  • 准备工作
    • 1. 服务器示例
    • 2. ssh工具
    • 3. autossh工具(重要)
    • 4. ssh免密登录
    • 5. 开机自启动
  • 一、基于ssh+nginx实现外网访问内网的web网站
    • 1. 内网服务器:建立反向代理
    • 2. 公网服务器
    • 3. 公网服务器:配置nginx
    • 4. 浏览器访问网站即可
  • 二、基于ssh实现远程访问内网服务器
    • 1. 内网服务器:建立反向代理
    • 2. 公网服务器
    • 3. 公网服务器:正向代理
    • 4. 个人电脑使用ssh远程登录内网服务
  • 参考资料

情景描述

之前在校园网内的服务器上部署了web项目,由于外网无法访问到该网站,所以使用frp内网穿透工具借助阿里云服务器代理,从而实现了外网访问该网站。但由于学校网络中心尽职尽责,检测到了我们的frp连接,说我们被黑客黑了,呵呵,并屏蔽掉了我们的公网ip。frp方式会被检测到,不得不寻找其他方法。

一种实测可行的方案是建立云服务器与内网服务器之间的ssh连接,通过ssh传输数据,从而实现内网穿透。目前还不确定能否被网络中心误判为“黑客程序”。

准备工作

1. 服务器示例

机器代号 服务器类别 ip 用户名 本机的ssh端口号
A 内网服务器 192.168.1.1 user_nei 22
B 公网(云)服务器 100.100.100.100 user_gong 22

注意:上表提供的端口请保证不被防火墙挡住,保证云服务器端口已添加到安全组。一般国内云服务器(如阿里云)需要提前在官网后台添加安全组规则,以开放该端口。
为安全起见,建议不要直接使用root用户去做下文的操作,新建一个权限比较低的普通用户。

2. ssh工具

apt install openssh-server
service ssh restart

反向代理 ssh -fCNR,我们要在内网服务器上用的。
正向代理 ssh -fCNL,根据需要使用。

-f 后台执行ssh指令
-C 允许压缩数据
-N 不执行远程指令
-R 将远程主机(服务器)的某个端口转发到本地主机指定的端口
-L 将本地机(客户机)的某个端口转发到远端指定机器的指定端口
-p 指定远程主机的端口

3. autossh工具(重要)

上一节的ssh工具虽然可以后台运行,但一旦断开了连接,则不会尝试重连!而autossh恰好可以解决这个问题,在网络不稳定时,ssh连接可能会断开,而autossh则会尝试自动重连

  • 安装

    apt install autossh
    
  • 如何代替ssh
    直接将命令ssh,替换为

    autossh -M 8999
    

    其中8999端口负责监视连接状态,连接有问题时就会自动重连。

4. ssh免密登录

  • 在内网A机器生成秘钥~/.ssh/id_rsa和公钥~/.ssh/id_rsa.pub。一直按Enter默认就行。

    ssh-keygen
    
  • 将公钥发送到远程公网B机器。(内网A机器的~/.ssh/id_rsa.pub会被写入公网B机器的~/.ssh/authorized_keys中)
    ssh-copy-id user_gong@100.100.100.100
    

    以后在内网A机器执行ssh(或autossh)命令访问远程B机器时无需输入密码。

5. 开机自启动

需要注意的是,下文即将提出的方法中,ssh(或autossh)命令只是启动了一个进程。一旦服务器关机或重启,进程将丢失,再次开机时,我们需要重新创建一次ssh连接。

由于linux版本的不同,开机自启动的方法不尽相同,请根据自己的系统,搜索开机自启动方法。针对下文提到的方法,我们只需要把ssh(或autossh)开头的命令加入到开机自启动项即可。

一、基于ssh+nginx实现外网访问内网的web网站

假设内网服务器运行的网站使用8000端口访问。

1. 内网服务器:建立反向代理

  • 建立内网服务器8000端口与公网服务器8001端口之间的ssh连接

    ssh -fCNR 8001:localhost:8000 -o ServerAliveInterval=60 user_gong@100.100.100.100 -p 22
    # ssh -fCNR [公网IP(可省略)]:[公网端口]:[内网IP]:[内网端口] [公网用户名@公网IP] -p [公网ssh端口(默认22)]
    # 或者使用autossh:
    # autossh -M 8999 -CNR 8001:localhost:8000 user_gong@100.100.100.100 -p 22
    

    解释:-o ServerAliveInterval=60表示每60秒发送一次消息,以保持连接存在。

  • 执行ps aux | grep ssh可查看是否成功启动了该进程。

2. 公网服务器

查看是否成功建立了连接

netstat -antpul | grep 8001


可以看到成功建立了连接:127.0.0.1:8001,这代表只允许本机访问。

3. 公网服务器:配置nginx

由于上面建立的连接端口8001只允许本机访问,我们需要使用nginx将http(s)请求都转发到8001

  • 安装nginx:

    apt update
    apt install nginx
    
  • 创建配置文件
    vim /etc/nginx/conf.d/ssh_agent_8001.conf
    
  • ssh_agent_8001.conf内容如下(http请求80端口,https请求443端口,根据自身情况修改)
    server {listen 80;server_name _(填写域名,不填的话请删除这个括号内容);location / {proxy_pass http://127.0.0.1:8001;proxy_redirect  off;proxy_set_header  Host  $host;proxy_set_header  X-Real-IP  $remote_addr;proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;}
    }
    
  • 重启nginx使配置生效
    service nginx restart
    

4. 浏览器访问网站即可

二、基于ssh实现远程访问内网服务器

1. 内网服务器:建立反向代理

  • 内网服务器的22端口和公网服务器的8022端口建立ssh连接

    ssh -fCNR 8022:localhost:22 -o ServerAliveInterval=60 user_gong@100.100.100.100 -p 22
    # ssh -fCNR [公网IP(可省略)]:[公网端口]:[本机IP]:[本机端口] [公网用户名@公网IP] -p [公网ssh端口(默认22)]
    # 或者使用autossh:
    # autossh -M 8999 -CNR 8022:localhost:22 user_gong@100.100.100.100 -p 22
    

    该命令实现的功能是,让一个远端机器的8022端口代理自己的22端口,这里所说的远端机器就是我们的公网服务器。

  • 执行ps aux | grep ssh可查看是否成功启动了该进程。

2. 公网服务器

  • 查看是否成功建立了连接

    netstat -antpul | grep 8022
    


至此,我们就可以在公网服务器上直接访问内网内网了!

  • 从公网服务器的终端上直接登录到内网服务器:

    ssh user_nei@localhost -p 8022
    
  • 从公网服务器的终端上向内网服务器/home/下发送文件:
    scp -P 8022 filename user_nei@localhost:/home/
    

3. 公网服务器:正向代理

前面实现的反向代理端口8022,但这个端口只允许公网服务器内部访问。也就是说,只能先用ssh登录公网服务器,然后在终端上使用ssh访问8022端口才能真正登录到内网服务器。那能不能直接从个人电脑上登录到内网服务器呢?能~

  • 公网服务器:让8023代理8022*表示接受来自任意机器的访问)

    ssh -fCNL *:8023:localhost:8022 -o ServerAliveInterval=60 user_gong@localhost -p 22
    # ssh -fCNL [本机IP(可省略)]:[本机端口]:[远端IP]:[远端端口] [远端用户名@远端IP] -p [远端ssh端口(默认22)]
    # 或者使用autossh:
    # autossh -M 8999 -CNL *:8023:localhost:8022 user_gong@localhost -p 22
    

    该命令实现的功能是,让本机8023端口指向一个远端机器的8022端口,而这里的远端机器恰好就是公网服务器本身。

  • 执行ps aux | grep ssh可查看是否成功开启了进程。

4. 个人电脑使用ssh远程登录内网服务

ssh user_nei@100.100.100.100 -p 8023
# ssh [内网服务器用户名]@[公网服务器IP] -p [代理端口]
  • 可能遇到的问题

    请前往内网服务器执行

    apt install openssh-server
    service ssh restart
    

参考资料

https://www.cnblogs.com/kwongtai/p/6903420.html
https://segmentfault.com/a/1190000002718360

ssh反向代理实现内网穿透;ssh+nginx实现公网云服务器代理访问内网服务器相关推荐

  1. 钉钉内网穿透工具,如何使用钉钉小程序访问内网

    描述:公司内网搭建项目,客户端钉钉小程序,如何实现钉钉小程序请求公司内网服务. 钉钉提供了内网穿透工具. 一.安装工具 git clone https://github.com/open-dingta ...

  2. 使用frp端口映射实现内网穿透(SSH、HTTP服务)

    使用frp端口映射实现内网穿透(SSH.HTTP服务) 一.下载 通过内网穿透的原理和实现方式的学习我们已经明白了内网穿透的原理,想要实现内网穿透就需要让内网实现与具有公网IP的设备进行绑定. 我们这 ...

  3. frp内网穿透SSH

    参考博客: 博客1(推荐): https://sspai.com/post/52523 博客2: https://blog.csdn.net/qq_36981760/article/details/1 ...

  4. frp点对点udp方式内网穿透ssh,不走服务器流量

    frp点对点udp方式内网穿透ssh,不走服务器流量 (2019 年 5 月 30 日) frp ssh 安全连接和服务器安全设置 (2019 年 5 月 29 日) frp 控制台监控dashboa ...

  5. 内网穿透远程群晖NAS:免费安装cpolar内网穿透 1/6

    系列文章 内网穿透远程群晖NAS:免费安装cpolar内网穿透 1/6 内网穿透远程群晖NAS:映射5000端口实现公网访问群晖 2/6 内网穿透远程群晖NAS:配置cpolar内网穿透生成数据隧道 ...

  6. 树莓派搭建网站,并免费内网穿透发布上线到公网

    系列文章 树莓派搭建网站,并免费内网穿透发布上线到公网 树莓派搭建WordPress网站,并内网穿透发布上线无需公网IP服务器 为树莓派上的WordPress网站配置自己的域名,并内网穿透发布上线公网 ...

  7. Windows内网穿透远程桌面:公网远程桌面控制内网电脑 2/3

    系列文章 Windows内网穿透远程桌面:启用Windows远程桌面 1/3 Windows内网穿透远程桌面:公网远程桌面控制内网电脑 2/3 Windows内网穿透远程桌面:配置固定的远程桌面公网T ...

  8. 注册华为云用户: 访问官网 https://huaweicloud.com/ 注册华为云用户(需手机号验证) 登录并完成实名认证 为账号充值不少于100元(不用时可提现

    3.2 步骤 实现此案例需要按照如下步骤进行. 步骤一:注册华为云 1)访问官网,如图-1所示: 图-1 2)注册用户,如图-2所示: 图-2 2)登陆并完成实名认证,如图-3所示: 图-3

  9. 内网穿透+ssh登录打造私人云服务器

    本地linux服务器 natapp 将 服务器ip:22 映射到公网 使用公网 ssh远程登录 即可远程访问服务器 另附可以实现内网穿透的几款工具:https://blog.csdn.net/pala ...

  10. ssh 使用新法:公网(合法 ip)用户访问内网(私有 ip)服务器(http,ftp,sshd,cvs...),

    内网的朋友苦于没有合法 ip,不能对外提供 internet 服务.解决方案很多,可以通过在网关做端口映射,或其他的辅助软件等. 本文介绍两种比较简单实用的方法,利用 ssh 这个强大的工具. (以下 ...

最新文章

  1. 绝望,上传文件失败。。遇到并解决java.lang.NullPointerException
  2. html怎么查看cad文件,如何直接查看CAD格式的图纸
  3. 《C语言》-(算术运算、关系运算、逻辑运算)
  4. 20165203第四周考试
  5. Python实现Newton和lagrange插值
  6. PC如何接管手机的双因子身份验证 靠的是英特尔的CPU
  7. 物联网Wi-Fi配网方式,你知道几种?
  8. Event/window.Event属性和方法
  9. 利用python爬虫(part1)--urllib.request模块
  10. 黑苹果系统坏了如何恢复_黑苹果macOS系统U盘版/恢复版基础安装教程
  11. vue中用watch监听路由信息
  12. c语言程序结果 856400,《C语言程序设计教程》习题参考解析1.doc
  13. 怎么把代码放图片里面进行注入_揭秘代码分层后的新世界
  14. TASLP | 从判别到生成:基于对比学习的生成式知识抽取方法
  15. 通俗易懂理解朴素贝叶斯分类的拉普拉斯平滑
  16. vim 配置文件 (未完待续)
  17. iOS 屏幕旋转的实践解析
  18. 我对TCP CDG拥塞控制算法的改进和优化
  19. 关于计算机的英语谚语,关于英语谚语83句
  20. python兔子和獾_Pygame-依葫芦画瓢之兔獾大战

热门文章

  1. 在线查看计算机配置,怎样查看电脑配置信息?
  2. C++跟C#获取电脑上连接的多个摄像头名称与编号
  3. 小写字母转大写字母并输出ASCLL值
  4. MySQL 排序规则
  5. uni-app 使用 @touchmove.stop.prevent 导致弹框内容无法滚动
  6. python设函数解方程_如何在Python函数最小化中获得速度,求椭球方程解
  7. 我在 CMU 的八年博士生涯...
  8. excel文档中了宏病毒--
  9. 电脑连手机热点找不到服务器的ip地址,电脑开热点手机连不上怎么连接
  10. macOS 开发 - Move to Applications folder