跳转到内容
彼岸论坛
欢迎抵达彼岸 彼岸花开 此处谁在 -彼岸论坛

[程序员] 求助 QUIC 协议走 Wireguard 代理不通的问题


小天管理

已推荐帖子

环境

电脑 --- 路由器 --- 跳板服务 --- 目标服务器

电脑 IP:10.10.*.*

路由器 Wireguard IP:192.168.69.1

要访问的远程服务器 IP:17.*.*.*

问题

电脑在内网,路由器上配置了 Wireguard ,Wireguard 另一端跳板服务在公网。现在内网的电脑想通过 Wireguard 访问到公网的服务器的 QUIC 协议的服务。

现在情况是,如果不走 Wireguard ,电脑通过路由器是可以正常访问到目标服务的,没有问题。但是配置走了 Wireguard ,就无法正常访问了。

conntrack 和 Wireshark 抓包的结果:

w9KQ9lV5.png

lp3Bo0Ox.png

看起来是电脑在发送 QUIC 请求,服务端返回了响应包,但是电脑对收到的每个响应包都会回一个 ICMP Port unreachable 的响应,导致连接立即被中断 DESTROY 。

尝试排查

因为 QUIC 协议是基于 UDP 的,所以我拿 Node.JS 简单写了个测试程序,在服务器上监听 UDP 端口,做一个 echo 服务,电脑上给服务端发 UDP 请求,服务端给返回多个响应包:

服务端:

import dgram from 'node:dgram';

const server = dgram.createSocket('udp4');
server.bind(443);

server.addListener('message', async (msg, rinfo) => {
    console.log(`Received ${msg.length} bytes from ${rinfo.address}:${rinfo.port}: ${msg}`);
    for (let i = 0; i < 5; ++i) {
        // 延迟 1 秒
        await new Promise(r => setTimeout(r, 1e3));
        server.send(Buffer.concat([msg, Buffer.from(i.toString())]), rinfo.port, rinfo.address, (error, bytes) => {
            console.log('send to', rinfo.address, rinfo.port, error, 'bytes', bytes);
        });
    }
});

客户端:

import dgram from 'node:dgram';

const socket = dgram.createSocket('udp4');

socket.addListener('message', (msg, rinfo) => {
    console.log(`Received ${msg.length} bytes from ${rinfo.address}:${rinfo.port}: ${msg}`);
});

socket.send("asd", 443, " [脱敏,远端 IP ] ");

结果是正常的,电脑上运行客户端代码,会用一个随机端口给服务器的 443 发请求,服务端收到的包显示远端 IP 是 Wireguard 远端的 IP ,表示数据包确实是走 Wireguard 转发到服务端的,然后服务端回复给 Wireguard 远端的 5 个包也都能正常被内网的电脑收到。


目前没有其他头绪了,来求助问一下,还有什么方向可以排查的吗?可能是什么问题呢?

意见的链接
分享到其他网站

加入讨论

您现在可以发表并稍后注册. 如果您是会员,请现在登录来参与讨论.

游客
回复主题...

×   粘贴为富文本.   粘贴为纯文本来代替

  只允许使用75个表情符号.

×   您的链接已自动嵌入.   显示为链接来代替

×   您之前的内容已恢复.   清除编辑器

×   您无法直接粘贴图片.要从网址上传或插入图片.

  • 游客注册

    游客注册

  • 会员

    没有会员可显示

  • 最新的状态更新

    没有最新的状态更新
  • 最近查看

    • 没有会员查看此页面.
×
×
  • 创建新的...