使用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 隧道

在内网服务器上执行以下命令:
bash 复制代码
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 监听:

    bash 复制代码
    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:
  • 确保以下配置项已启用:

    bash 复制代码
    AllowTcpForwarding yes
    GatewayPorts yes
  • 重启 SSH 服务以应用更改:

    bash 复制代码
    sudo systemctl restart sshd
检查防火墙:
  • 确保外网服务器的防火墙允许 8080 端口的流量:

    bash 复制代码
    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,添加以下内容:

    nginx 复制代码
    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 配置:
  • 检查配置文件语法:

    bash 复制代码
    sudo nginx -t
  • 重新加载 Nginx 配置:

    bash 复制代码
    sudo systemctl reload nginx

4. 启动内网 Web 服务

在内网服务器上启动 Web 服务:
  • 使用 Python 的 http.server 模块启动 Web 服务:

    bash 复制代码
    python -m http.server 8899
  • 确保服务正常运行,并可以通过 http://localhost:8899 访问。


5. 测试 SSH 隧道

在外网服务器上测试:
  • 使用 curl 测试 8080 端口:

    bash 复制代码
    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 隧道稳定:

    • 使用 autossh 或 tmux 保持 SSH 隧道的稳定性。

    • 示例:

      bash 复制代码
      autossh -M 0 -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R 8080:localhost:8899 user@47.238.40.212
  2. 安全性:

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

    • 定期检查 Nginx 和 SSH 的日志,确保没有异常访问或错误。
      🚀
相关推荐
IT_陈寒12 分钟前
Vite性能优化完全指南
前端·人工智能·后端
燕落南枝13 分钟前
HTML 表单入门:表单容器、文本框与密码框属性详解
前端·microsoft·html
TYC926 分钟前
Mac创建Vue3+TypeScript或者React+TypeScript项目
前端·javascript·typescript
程序员小孔.28 分钟前
基于 SpringBoot + UniApp + Vue 的家政服务系统设计与实现
前端·数据库·spring boot·python·docker·微信小程序
Profile排查笔记34 分钟前
指纹浏览器 GitHub 项目怎么选?先看仓库交付的是工具、内核还是管理器
前端·人工智能·后端·自动化
djjjx.36 分钟前
Linux进程篇(三):深度硬核!全面起底 Linux 进程状态变化与内核链表动态解绑
linux·运维·服务器
风骏时光牛马38 分钟前
云原生驱动的分布式高可用架构设计与落地实践
前端
乔旭伟40 分钟前
Linux 服务器环境搭建实战笔记:最小化安装、Docker Compose 编排与上线检查全流程
linux·服务器·笔记
梦曦i1 小时前
uni-app x 专属 Pinia 库正式发布
前端·pinia·uni-app x
燕落南枝1 小时前
HTML 学习:input 单选、复选与文件域详解
服务器·学习·html