fscarmen2 / Argo-Xray-JS-PaaS

在 JS 容器平台部署 Xray + Argo 隧道,4种协议 Vless / Vmess / Trojan / SS + TLS + WS,不需 CF workers 反代
165 stars 193 forks source link

quack tunnel(临时隧道)只能把NodeJS的监听端口占了吗? #10

Closed Ropgrc closed 3 months ago

Ropgrc commented 3 months ago

没有其他办法了吗? 如果把临时隧道配置修改成8080,跟Xray一样,访问临时隧道的时候直接显示bad req。那么我用NodeJS搞的Web网页不就是摆设吗? 临时隧道的配置修改成NodeJS的监听端口3000就正常了,访问临时隧道显示web网页,也能访问list节点信息,同时打入ws的路径也能访问Xray的bad req。只不过容器给的域名没了,访问容器域名直接给的是中间件代理到Xray的bad req。 我的意思是能不能让临时隧道的流量经过web,走nodejs的中间件代理到Xray?而不是把nodejs的端口占了。

fscarmen2 commented 3 months ago

问 ai

nodejs如何做到像 nginx 一样的websocket ,通过 /a 或者 /b 或者 /c ,location 到 8080端口

ChatGPT

ChatGPT ChatGPT

Poe

要在 Node.js 中实现类似 Nginx 的 WebSocket 代理功能,让不同的路径(例如 /a、/b、/c)转发到不同的后端 WebSocket 服务器(例如 8080 端口),可以使用以下代码示例:

javascript 复制

const http = require('http');
const httpProxy = require('http-proxy');
const WebSocket = require('ws');

// 创建一个 HTTP 代理服务器
const proxy = httpProxy.createProxyServer({});

// 创建一个 HTTP 服务器
const server = http.createServer((req, res) => {
  const { url } = req;

  // 根据请求路径进行分流
  if (url.startsWith('/a')) {
    proxy.web(req, res, { target: 'ws://localhost:8080' });
  } else if (url.startsWith('/b')) {
    proxy.web(req, res, { target: 'ws://localhost:8081' });
  } else if (url.startsWith('/c')) {
    proxy.web(req, res, { target: 'ws://localhost:8082' });
  } else {
    res.statusCode = 404;
    res.end('Not Found');
  }
});

// 创建 WebSocket 服务器
const wss1 = new WebSocket.Server({ noServer: true });
const wss2 = new WebSocket.Server({ noServer: true });
const wss3 = new WebSocket.Server({ noServer: true });

// 将 WebSocket 服务器附加到 HTTP 服务器上
server.on('upgrade', (req, socket, head) => {
  const { url } = req;

  // 根据请求路径进行 WebSocket 升级
  if (url.startsWith('/a')) {
    wss1.handleUpgrade(req, socket, head, (ws) => {
      wss1.emit('connection', ws, req);
    });
  } else if (url.startsWith('/b')) {
    wss2.handleUpgrade(req, socket, head, (ws) => {
      wss2.emit('connection', ws, req);
    });
  } else if (url.startsWith('/c')) {
    wss3.handleUpgrade(req, socket, head, (ws) => {
      wss3.emit('connection', ws, req);
    });
  } else {
    socket.destroy();
  }
});

// 启动服务器
server.listen(80, () => {
  console.log('Server is running on port 80');
});

以上代码使用了 http-proxy 模块来创建一个 HTTP 代理服务器,并使用 http 模块创建一个 HTTP 服务器。根据请求的路径进行分流,将不同的路径转发到不同的后端 WebSocket 服务器。

同时,使用 ws 模块创建了三个 WebSocket 服务器,并通过 handleUpgrade 方法将它们附加到 HTTP 服务器上,以便处理 WebSocket 升级请求。

你可以根据需要修改示例中的路径、后端 WebSocket 服务器的地址和端口,以及服务器的监听端口。启动该 Node.js 代码后,它将监听指定的端口(例如 80),并根据请求路径将 WebSocket 请求转发到相应的后端 WebSocket 服务器。

Gemini

只使用 Node.js 实现类似 Nginx 的 WebSocket 功能,可以通过以下步骤进行:

  1. 安装依赖库

首先,需要安装 Node.js 的 WebSocket 库,例如 ws 或 socket.io。

npm install ws
  1. 创建 WebSocket 服务器

使用 ws 库创建 WebSocket 服务器,并监听指定的端口。

JavaScript

const WebSocket = require('ws');

const server = new WebSocket.Server({ port: 8080 });

server.on('connection', (socket) => {
  // 处理 WebSocket 连接
});

谨慎使用代码。

  1. 处理不同路径

根据不同的路径,使用不同的处理逻辑。例如,可以根据路径的不同,发送不同的消息或执行不同的操作。

JavaScript

const WebSocket = require('ws');

const server = new WebSocket.Server({ port: 8080 });

server.on('connection', (socket, request) => {
  const pathname = request.url.pathname;

  switch (pathname) {
    case '/a':
      // 处理 `/a` 路径
      break;
    case '/b':
      // 处理 `/b` 路径
      break;
    case '/c':
      // 处理 `/c` 路径
      break;
  }
});

谨慎使用代码。

示例代码: JavaScript

// server.js

const WebSocket = require('ws');

const server = new WebSocket.Server({ port: 8080 });

server.on('connection', (socket, request) => {
  const pathname = request.url.pathname;

  switch (pathname) {
    case '/a':
      socket.send('This is /a');
      break;
    case '/b':
      socket.send('This is /b');
      break;
    case '/c':
      socket.send('This is /c');
      break;
  }
});

谨慎使用代码。

运行示例:

node server.js

测试:

使用浏览器或 WebSocket 客户端连接到 http://localhost:8080/a、http://localhost:8080/bhttp://localhost:8080/c,即可建立 WebSocket 连接,并收到相应的消息。

Ropgrc commented 3 months ago

目前已经摸索着找到对的方法了。 隧道的配置端口就是和NodeJS的监听端口一致才对,如果是Nginx建站也要和Nginx的监听端口一致,不会冲突。关于为什么我会说到冲突可能就是Path上的问题,然后我误以为是端口的问题。下图就是我现在NodeJS的中间件配置,由于我只用vless,所以只有一个,如果想多协议应该是可以加的,3002是vless inbound port。作者目前的代理中间件代理的是根路径,我感觉是错的,但是也说不出什么所以然。 屏幕截图 2024-03-22 122718 这样设置的话,隧道域名和容器域名都能正常访问路径提供的服务 容器www.example.com/UUID www.example.com/PATH www.example.com/list www.example.com/status 隧道www.trycloudflare.com/UUID www.trycloudflare.com/PATH www.trycloudflare.com/list www.trycloudflare.com/status

fscarmen commented 3 months ago

作者目前的代理中间件代理的是根路径

那个根路径因为不能直连可以去掉的,从其他项目直接搬过来,之前不严谨而已,我在另外的科学项目上已经去掉了,无意义的。

现在的方案科学数据直接通过隧道到达平台的 xray 8080 inbound,再通过不同的指定的路径,回落到相应的 xray 的其他 ws 协议的 inbound ,当然,这个是在xray里分流,没有经过 nodejs 的网的。

你的需求是想要隧道先去到 nodejs 的 3000 端口,再在上面使用类似 nginx 的分流,是访问根的就去到伪装网 80 端口,有指定路径的就分流去到 8080 的 xray inbound。这个需求我自己没有做过,不过问问 GPT 使用什么中间件,如何通过路径分流,会问的话应该不太难。

fscarmen2 commented 3 months ago

那个根路径因为不能直连可以去掉的,从其他项目直接搬过来,之前不严谨而已,我在另外的科学项目上已经去掉了,无意义的。

现在的方案科学数据直接通过隧道到达平台的 xray 8080 inbound,再通过不同的指定的路径,回落到相应的 xray 的其他 ws 协议的 inbound ,当然,这个是在xray里分流,没有经过 nodejs 的网的。

你的需求是想要隧道先去到 nodejs 的 3000 端口,再在上面使用类似 nginx 的分流,是访问根的就去到伪装网 80 端口,有指定路径的就分流去到 8080 的 xray inbound。这个需求我自己没有做过,不过问问 GPT 使用什么中间件,如何通过路径分流,会问的话应该不太难。

当时为什么没有设计隧道去到 nodejs 使用的3000端口,像你需求那样呢。因为我想使用本项目的多数需求都是科学而已,有 ws+tls+cdn 应该很安全的了,并不需要伪装网,所以隧道就直接去到 xray inbound,这样能减少一个环节,在我看来能高效点(尽管速度上肯定感觉不出来,只是心理觉得),如果你是这样改,我认为甚至你都可以在xray上只做1个vless+ws的 127.0.0.1 inbound 3011,通过 nodejs 分流到该 3011 端口。

Ropgrc commented 3 months ago

那个根路径因为不能直连可以去掉的,从其他项目直接搬过来,之前不严格限制,我在另外的科学项目上已经去掉了,没有意义的。 现在的方案科学数据直接通过到达隧道平台的xray 8080入站,再通过不同的指定的路径,回落到相应的xray的其他ws协议的入站,当然,这个是在xray里分流,没有经过nodejs的网络的。你的需求是想要tunnel先去nodejs的3000端口,再在上面使用类似nginx的分流,是访问根的就去到伪装网80端口,有指定路径的就分流去8080的xray入站。这个需求我自己没有,不过询问GPT使用什么中间件,如何通过路径分流,会问的话应该不太难。当时为什么没有设计tunnel去nodejs使用的3000端口,像你的需求那样呢。因为我想使用本项目的大部分需求都是科学的,有ws+tls+cdn应该很安全的了,不需要伪装网,所以隧道就直接去到xray入站,这样可以减少一个阶段,在我看来能高效点(虽然速度上肯定感觉不出来,只是心理觉得),如果你是这样改的话,我想甚至你都可以在xray上只做1个vless+ws的127.0.0.1入站3011,通过nodejs分流到该3011端口。

你是对的,vm+tls+cdn相较其他来说在很长时间处于稳定状态,不管什么方法能科学就足够了。是的,我的config inbound只有vless+ws。谢谢你的回复。