当前位置: 首页 > article >正文

使用SSH建立内网穿透,能够访问内网的web服务器

搞了一个晚上,终于建立了一个内网穿透。和AI配合,还是得自己思考,AI配合才能搞定,不思考只依赖AI也不行。内网服务器只是简单地使用了python -m http.server 8899,但是对于Gradio建立的服务器好像不行,会出问题。
在这里插入图片描述


问题背景

需求

  • 将内网的 Web 服务器(http://localhost:8899)通过 SSH 隧道映射到外网服务器,使外网可以通过外网服务器的 8080 端口访问内网服务。

环境

  • 内网服务器
    • Web 服务运行在 localhost:8899
    • 可以访问外网服务器,但外网服务器无法直接访问内网服务器(由于防火墙限制)。
  • 外网服务器
    • 外网 IP:47.238.40.212
    • 需要将 8080 端口的流量通过 SSH 隧道转发到内网的 8899 端口。

问题分析

  1. SSH 隧道未正确建立

    • 外网服务器的 8080 端口被 sshd 监听,但流量未正确转发到内网的 8899 端口。
    • 错误日志显示 upstream prematurely closed connection,表明连接被提前关闭。
  2. Nginx 配置问题

    • Nginx 配置正确,将请求转发到 127.0.0.1:8080,但 SSH 隧道未正常工作。
  3. 客户端服务问题

    • 内网的 Web 服务(http://localhost:8899)正常运行,但未通过 SSH 隧道暴露到外网。

解决方案

1. 配置 SSH 隧道

在内网服务器上执行以下命令
ssh -R 8080:localhost:8899 user@47.238.40.212
  • 参数说明
    • -R 8080:localhost:8899:将外网服务器的 8080 端口转发到内网的 8899 端口。
    • user@47.238.40.212:外网服务器的用户名和 IP 地址。
验证 SSH 隧道
  • 在外网服务器上检查 8080 端口是否被 sshd 监听:
    netstat -tuln | grep 8080
    
    输出示例:
    tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN      12345/sshd: user
    tcp6       0      0 ::1:8080                :::*                    LISTEN      12345/sshd: user
    

2. 配置外网服务器的 SSH 服务

编辑 /etc/ssh/sshd_config
  • 确保以下配置项已启用:
    AllowTcpForwarding yes
    GatewayPorts yes
    
  • 重启 SSH 服务以应用更改:
    sudo systemctl restart sshd
    
检查防火墙
  • 确保外网服务器的防火墙允许 8080 端口的流量:
    sudo firewall-cmd --permanent --add-port=8080/tcp
    sudo firewall-cmd --reload
    

3. 配置 Nginx

编辑 Nginx 配置文件
  • 在外网服务器上编辑 /etc/nginx/nginx.conf/etc/nginx/conf.d/default.conf,添加以下内容:
    server {
        listen 80;
        server_name xinnian.wang;
    
        location / {
            proxy_pass http://127.0.0.1:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_connect_timeout 300s;
            proxy_read_timeout 300s;
            proxy_send_timeout 300s;
        }
    }
    
测试 Nginx 配置
  • 检查配置文件语法:
    sudo nginx -t
    
  • 重新加载 Nginx 配置:
    sudo systemctl reload nginx
    

4. 启动内网 Web 服务

在内网服务器上启动 Web 服务
  • 使用 Python 的 http.server 模块启动 Web 服务:
    python -m http.server 8899
    
  • 确保服务正常运行,并可以通过 http://localhost:8899 访问。

5. 测试 SSH 隧道

在外网服务器上测试
  • 使用 curl 测试 8080 端口:
    curl http://127.0.0.1:8080
    
    如果 SSH 隧道正常工作,应该返回内网 Web 服务的内容。
通过外网访问
  • 在外网浏览器中访问 http://47.238.40.212:8080,确认可以访问内网 Web 服务。

最终结果

  • SSH 隧道成功建立
    • 外网服务器的 8080 端口通过 SSH 隧道转发到内网的 8899 端口。
  • Nginx 配置正确
    • Nginx 将外网请求转发到 127.0.0.1:8080,并通过 SSH 隧道传递到内网。
  • 测试成功
    • 通过 curl http://127.0.0.1:8080 和浏览器访问 http://47.238.40.212:8080,成功访问内网 Web 服务。

后续建议

  1. 保持 SSH 隧道稳定

    • 使用 autosshtmux 保持 SSH 隧道的稳定性。
    • 示例:
      autossh -M 0 -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R 8080:localhost:8899 user@47.238.40.212
      
  2. 安全性

    • 使用 SSH 密钥认证代替密码认证。
    • 限制允许访问的 IP 地址。
  3. 日志监控

    • 定期检查 Nginx 和 SSH 的日志,确保没有异常访问或错误。
      🚀

http://www.kler.cn/a/467140.html

相关文章:

  • 【C++】深入解析二维数组初始化与越界问题
  • edeg插件/扩展推荐:助力生活工作
  • 【每日学点鸿蒙知识】广告ID、NFC手机充值、CSS支持语法、PC与模拟器交互、SO热更新等
  • 基于微信小程序的面部动作检测系统
  • Fabric部署-docker安装
  • Uniapp中使用`wxml-to-canvas`开发DOM生成图片功能
  • 使用Docker部署最新版JupyterHub
  • 如何利用群晖NAS实现远程访问你的网页版Linux虚拟桌面环境
  • [gcc]代码演示-O使用场景
  • SQL中聚类后字段数据串联字符串方法研究
  • kernel32.dll动态链接库报错要怎解决?详细解析kernel32.dll文件缺失解决方案
  • 什么是 C++ 的序列化?
  • 【一文解析】新能源汽车VCU电控开发——能量回收模块
  • STM32-笔记23-超声波传感器HC-SR04
  • kubernets基础入门
  • 基于STM32的热带鱼缸控制系统的设计
  • 大模型数据采集和预处理:把所有数据格式,word、excel、ppt、jpg、pdf、表格等转为数据
  • 高清监控视频的管理与展示:从摄像头到平台的联接过程
  • 呼叫中心中间件实现IVR进入排队,判断排队超时播放提示音
  • Git快速入门(一)·Git软件的安装以及GitHubDesktop客户端的安装
  • 装饰器模式详解
  • clickhouse Cannot execute replicated DDL query, maximum retries exceeded报错解决
  • Android 14.0 系统限制上网系列之iptables用IOemNetd实现app上网黑名单的实现
  • 行为模式4.观察者模式------消息推送
  • LangChain+博查搜索API轻松实现实时信息搜索
  • 【每日学点鸿蒙知识】ASON工具、自定义tabbar、musl、Text异常截断等