使用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 的日志,确保没有异常访问或错误。
      🚀
相关推荐
名字还没想好☜6 分钟前
React 受控输入框光标跳到末尾:格式化输入时的 selection 丢失 bug 与修复
前端·javascript·react.js·bug·react·next.js
Access开发易登软件6 分钟前
Access 怎么做前后端分离?用 Web API 读写 SQL Server
前端·数据库·人工智能·microsoft·excel·access
10share15 分钟前
React 新一代样式隔离方案 —— 编译时、零运行时、原生写法
前端·react.js
有续技术23 分钟前
哈斯 (Haas) 机床 IP、端口号配置内容总结
运维·服务器
Revolution6126 分钟前
Node.js 是什么:前端项目里哪些事情由它完成
前端·面试·node.js
心念枕惊34 分钟前
新写了个直播录制工具,可录制抖音快手斗鱼直播
运维·服务器·数据库
我要两颗404西柚44 分钟前
Stage three:VUE工程化与实战工具
前端·javascript·vue.js
躺不平的理查德1 小时前
CMAKE备忘录
linux·运维·服务器
光影少年1 小时前
RN 的EventEmitter 双向通信
前端·react native·react.js
9624561 小时前
跨域与私有网络访问限制排查实录
运维·服务器·网络