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

    • 使用 autosshtmux 保持 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 的日志,确保没有异常访问或错误。
      🚀
相关推荐
晓衣3 小时前
2025“獬豸杯”全国电子数据取证竞赛-k8s服务器取证wp
服务器·经验分享·程序人生·网络安全·容器·kubernetes·学习方法
li35743 小时前
将已有 Vue 项目通过 Electron 打包为桌面客户端的完整步骤
前端·vue.js·electron
Icoolkj3 小时前
VuePress 与 VitePress 深度对比:特性、差异与选型指南
前端·javascript·vue.js
excel4 小时前
CNN 分层详解:卷积、池化到全连接的作用与原理
前端
excel4 小时前
CNN 多层设计详解:从边缘到高级特征的逐层学习
前端
2301_794333915 小时前
实验室服务器配置|通过Docker实现Linux系统多用户隔离与安全防控
linux·服务器·docker·实验室
西陵5 小时前
Nx带来极致的前端开发体验——任务编排
前端·javascript·架构
大前端helloworld5 小时前
从初中级如何迈入中高级-其实技术只是“入门卷”
前端·面试
JCGKS6 小时前
Docker|“ssh: connect to host xxx.xxx.xxx.xxx port 8000: Connection refused“问题解决
docker·ssh·端口·listen·tcp三次握手