[GH-ISSUE #218] udp proxy在空闲一段时间之后,无法正常工作。 #149

Closed
opened 2026-05-05 11:52:12 -06:00 by gitea-mirror · 15 comments
Owner

Originally created by @goer99 on GitHub (Jan 9, 2017).
Original GitHub issue: https://github.com/fatedier/frp/issues/218

过程描述:

  1. 启动frps;
  2. 启动frpc;查看frps 和frpc的log,确认已经连上;
  3. 第三方使用udp proxy,工作正常;
  4. 以上3步骤都是接连进行的,间隔时间不超过5分钟;
  5. 第三方停止使用udp proxy;
  6. 过20分钟。
  7. 第三方使用udp proxy,无响应;

建议:

log记录中增加proxy(frps,frpc)对第三方(proxy使用方)的消息处理记录,例如收/发情况,转发情况等。

Originally created by @goer99 on GitHub (Jan 9, 2017). Original GitHub issue: https://github.com/fatedier/frp/issues/218 过程描述: 1. 启动frps; 2. 启动frpc;查看frps 和frpc的log,确认已经连上; 3. 第三方使用udp proxy,工作正常; 4. 以上3步骤都是接连进行的,间隔时间不超过5分钟; 5. 第三方停止使用udp proxy; 6. 过20分钟。 7. 第三方使用udp proxy,无响应; 建议: log记录中增加proxy(frps,frpc)对第三方(proxy使用方)的消息处理记录,例如收/发情况,转发情况等。
gitea-mirror 2026-05-05 11:52:12 -06:00
  • closed this issue
  • added the
    question
    label
Author
Owner

@goer99 commented on GitHub (Jan 9, 2017):

回看frps的log,在维持heartbeat期间,有数次如下记录:

2017/01/08 19:29:58 [control.go:163] [D] ProxyName [abc], get heartbeat
2017/01/08 19:30:05 [server.go:368] [W] ProxyName [abc], work connection for udp closed
2017/01/08 19:30:08 [control.go:163] [D] ProxyName [abc], get heartbeat
2017/01/08 19:30:12 [server.go:395] [D] ProxyName [abc], write to work connection for udp error: write tcp x.x.x.x:6000->y.y.y.y:33836: write: broken pipe
2017/01/08 19:30:18 [control.go:163] [D] ProxyName [abc], get heartbeat

<!-- gh-comment-id:271193816 --> @goer99 commented on GitHub (Jan 9, 2017): 回看frps的log,在维持heartbeat期间,有数次如下记录: 2017/01/08 19:29:58 [control.go:163] [D] ProxyName [abc], get heartbeat 2017/01/08 19:30:05 [server.go:368] [W] ProxyName [abc], work connection for udp closed 2017/01/08 19:30:08 [control.go:163] [D] ProxyName [abc], get heartbeat 2017/01/08 19:30:12 [server.go:395] [D] ProxyName [abc], write to work connection for udp error: write tcp x.x.x.x:6000->y.y.y.y:33836: write: broken pipe 2017/01/08 19:30:18 [control.go:163] [D] ProxyName [abc], get heartbeat
Author
Owner

@fatedier commented on GitHub (Jan 11, 2017):

参考 #206,感觉这样的应用并不适用。

<!-- gh-comment-id:271925996 --> @fatedier commented on GitHub (Jan 11, 2017): 参考 #206,感觉这样的应用并不适用。
Author
Owner

@goer99 commented on GitHub (Jan 12, 2017):

我的应用场景和 #206 完全不同。我的使用场景是frp + vpn

#206 的 n2n 其实是一个udp打洞工具,实现两个内网主机的点对点通讯。n2n需要每个使用者都安装n2n的节点。

而frp是一个多协议反向proxy。frp不需要每个使用者都安装frp。

n2n的supernode也必须是公网ip。这点和frp一样,都需要一个具有公网ip的公共节点,联络各个内网节点,以及转发数据包。所有的内网穿透产品,都是这么一个架构。

与frp不同,n2n并非proxy,而是利用虚拟网卡建立点对点通讯,可惜的是n2n不是一个vpn,没有实现network 2 network,只实现了node 2 node。其实n2n中建立一下各个节点的路由表就能实现network 2 network,不知道为什么作者没有实现这个功能。

因此,需要构建两个内网network 2 network的使用场景,目前来看frp + vpn是一个比较好的解决方案。

<!-- gh-comment-id:272112614 --> @goer99 commented on GitHub (Jan 12, 2017): 我的应用场景和 #206 完全不同。我的使用场景是frp + vpn #206 的 n2n 其实是一个udp打洞工具,实现两个内网主机的点对点通讯。n2n需要每个使用者都安装n2n的节点。 而frp是一个多协议反向proxy。frp不需要每个使用者都安装frp。 n2n的supernode也必须是公网ip。这点和frp一样,都需要一个具有公网ip的公共节点,联络各个内网节点,以及转发数据包。所有的内网穿透产品,都是这么一个架构。 与frp不同,n2n并非proxy,而是利用虚拟网卡建立点对点通讯,可惜的是n2n不是一个vpn,没有实现network 2 network,只实现了node 2 node。其实n2n中建立一下各个节点的路由表就能实现network 2 network,不知道为什么作者没有实现这个功能。 因此,需要构建两个内网network 2 network的使用场景,目前来看frp + vpn是一个比较好的解决方案。
Author
Owner

@fatedier commented on GitHub (Jan 12, 2017):

我的意思是如果 openVPN 使用 UDP 的方式,可能也需要感知到连接的 ip 和端口,而中间加了 frp 这个代理之后,这些信息会丢失,导致不能正常工作。

完全是猜测,因为不确定 openVPN 的具体工作原理。

<!-- gh-comment-id:272125159 --> @fatedier commented on GitHub (Jan 12, 2017): 我的意思是如果 openVPN 使用 UDP 的方式,可能也需要感知到连接的 ip 和端口,而中间加了 frp 这个代理之后,这些信息会丢失,导致不能正常工作。 完全是猜测,因为不确定 openVPN 的具体工作原理。
Author
Owner

@goer99 commented on GitHub (Jan 12, 2017):

frpc和frps刚刚连接上时,openVPN工作完全正常。只是当frpc和fprs之间idle一段时间,没有数据交换之后,再使用openVPN就无法连上了。

<!-- gh-comment-id:272137099 --> @goer99 commented on GitHub (Jan 12, 2017): frpc和frps刚刚连接上时,openVPN工作完全正常。只是当frpc和fprs之间idle一段时间,没有数据交换之后,再使用openVPN就无法连上了。
Author
Owner

@fatedier commented on GitHub (Jan 12, 2017):

因为 udp 是没有连接的,所以 frp 并不知道你发送的 udp 包之后,要多长时间才不需要继续读取数据。所以目前转发 udp 包时设置了一个超时,超过 2 分钟之后,仍然没有读取到对方发送的数据就会退出。这样对方就无法再主动给你发送数据。

不知道是不是这个地方有影响,通常要维护 udp 的 ”连接“,需要主动发送心跳,因为 NAT 设备上的 UDP 转发表应该也会定期清除的。

你可以把 openVPN 的部署方式发我,我有时间可以测试下。

<!-- gh-comment-id:272139384 --> @fatedier commented on GitHub (Jan 12, 2017): 因为 udp 是没有连接的,所以 frp 并不知道你发送的 udp 包之后,要多长时间才不需要继续读取数据。所以目前转发 udp 包时设置了一个超时,超过 2 分钟之后,仍然没有读取到对方发送的数据就会退出。这样对方就无法再主动给你发送数据。 不知道是不是这个地方有影响,通常要维护 udp 的 ”连接“,需要主动发送心跳,因为 NAT 设备上的 UDP 转发表应该也会定期清除的。 你可以把 openVPN 的部署方式发我,我有时间可以测试下。
Author
Owner

@goer99 commented on GitHub (Jan 13, 2017):

估计就是这个2分钟超时机制的设定引起的问题,无udp数据传输2分钟之后,判定为超时,udp proxy关闭。下次第三方想再次使用udp proxy时,就无法连接成功。

几点建议:

  1. 能否将这个udp proxy超时退出的参数放到conf文件里呢?这样可以进一步测试验证。

  2. 这个udp proxy的超时退出机制,应该根据无心跳的时间判定超时。由于udp不是面向连接的,若维持udp proxy的生存需要udp心跳的话,那么可以将frps和frpc之间的心跳改为udp协议,认证仍旧使用tcp协议,这样就可以完美解决这个问题了。

frpc与frps之间的认证和心跳都是用的tcp协议,所以tcp proxy没有这个问题。只要有心跳存在,tcp proxy就会一直生存,而不会判定超时退出。即便出现网络问题连接不上,也会重连之后激活tcp proxy。

<!-- gh-comment-id:272346300 --> @goer99 commented on GitHub (Jan 13, 2017): 估计就是这个2分钟超时机制的设定引起的问题,无udp数据传输2分钟之后,判定为超时,udp proxy关闭。下次第三方想再次使用udp proxy时,就无法连接成功。 几点建议: 1. 能否将这个udp proxy超时退出的参数放到conf文件里呢?这样可以进一步测试验证。 2. 这个udp proxy的超时退出机制,应该根据无心跳的时间判定超时。由于udp不是面向连接的,若维持udp proxy的生存需要udp心跳的话,那么可以将frps和frpc之间的心跳改为udp协议,认证仍旧使用tcp协议,这样就可以完美解决这个问题了。 frpc与frps之间的认证和心跳都是用的tcp协议,所以tcp proxy没有这个问题。只要有心跳存在,tcp proxy就会一直生存,而不会判定超时退出。即便出现网络问题连接不上,也会重连之后激活tcp proxy。
Author
Owner

@fatedier commented on GitHub (Jan 13, 2017):

你这里有个问题理解错了,超时不是针对 udp proxy,而是单个 udp 请求。

比如 dns 查询,发送查询请求,客户端收到数据包之后就结束了,tcp 的话这里会主动发起关闭连接的操作。但是对于 udp 来说,你不 read 就行了,是没有连接的。这个操作交给 frp 中转的话,frp 不能感知到什么时候结束,所以必须要有超时机制来释放这部分资源。

<!-- gh-comment-id:272356901 --> @fatedier commented on GitHub (Jan 13, 2017): 你这里有个问题理解错了,超时不是针对 udp proxy,而是单个 udp 请求。 比如 dns 查询,发送查询请求,客户端收到数据包之后就结束了,tcp 的话这里会主动发起关闭连接的操作。但是对于 udp 来说,你不 read 就行了,是没有连接的。这个操作交给 frp 中转的话,frp 不能感知到什么时候结束,所以必须要有超时机制来释放这部分资源。
Author
Owner

@goer99 commented on GitHub (Jan 13, 2017):

对于udp proxy,看来需要有一个frps对frpc的唤醒机制。

当frpc 睡眠时(无udp连接,仅有心跳),若frps 收到第三方发起的udp数据请求,frps应立即唤醒frpc,frpc向frps重建udp通道,frps转发frpc与第三方的udp数据。

如果frp 在udp proxy上无法维持这种随时接收和响应第三方udp请求的状态(即唤醒机制),那么这个udp proxy的实用意义就没有了。

<!-- gh-comment-id:272363430 --> @goer99 commented on GitHub (Jan 13, 2017): 对于udp proxy,看来需要有一个frps对frpc的唤醒机制。 当frpc 睡眠时(无udp连接,仅有心跳),若frps 收到第三方发起的udp数据请求,frps应立即唤醒frpc,frpc向frps重建udp通道,frps转发frpc与第三方的udp数据。 如果frp 在udp proxy上无法维持这种随时接收和响应第三方udp请求的状态(即唤醒机制),那么这个udp proxy的实用意义就没有了。
Author
Owner

@fatedier commented on GitHub (Jan 13, 2017):

  1. 目前主动发起的 udp 请求在任何时候都应该正常。
  2. 某次发送的 udp 请求,过了一段时间后,想继续接收到对方回复的消息,必须由客户端自己实现心跳。这个是 udp 的特点决定的。

你可以整理一下思路,目前你的理解和实际的问题并不一致,openVPN 的问题也不需要光猜测,还是复现定位问题比较方便。

<!-- gh-comment-id:272363973 --> @fatedier commented on GitHub (Jan 13, 2017): 1. 目前主动发起的 udp 请求在任何时候都应该正常。 2. 某次发送的 udp 请求,过了一段时间后,想继续接收到对方回复的消息,必须由客户端自己实现心跳。这个是 udp 的特点决定的。 你可以整理一下思路,目前你的理解和实际的问题并不一致,openVPN 的问题也不需要光猜测,还是复现定位问题比较方便。
Author
Owner

@goer99 commented on GitHub (Jan 13, 2017):

你可以安装一下openVPN看看是否有这个问题。

openVPN的官网:https://openvpn.net/ 需要翻一下墙。


openVPN的安装可以参考:

CenTos OpenVpn 一键安装包
http://www.myzhenai.com/thread-17453-1-1.html

如果脚本里面的资源包下载地址不可用,可能需要更换所需资源包的下载地址。

以上是openVPN的服务器端安装。


OpenVPN客户端配置

对于Windows客户端
http://www.vpswe.com/goto/3h62 下载gui版的OpenVPN,按照提示安装完成后,进入到安装目录,如D:\Program Files\OpenVPN。将Linux服务端使用easy-rsa产生的客户端证书、私钥和ca证书下载到本地。即需要下载到本地的文件如下:
/etc/openvpn/easy-rsa/2.0/keys/ca.crt #ca证书
/etc/openvpn/easy-rsa/2.0/keys/client.crt #客户端证书
/etc/openvpn/easy-rsa/2.0/keys/client.key #客户端私钥

将这些文件下载到D:\Program Files\OpenVPN\config下。

编辑客户端OpenVPN配置文件client.ovpn,内容如下:
client
dev tun
proto udp
remote SERVER_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
comp-lzo
verb 3
redirect-gateway def1
route-method exe
route-delay 2

将SERVER_IP写成OpenVPN服务器的ip,然后打开OpenVPN的GUI,点击连接,完成OpenVPN拨入

对于Mac 客户端
http://sourceforge.net/projects/tunnelblick/ 下载OpenVPN 客户端软件 Tunnelblick

<!-- gh-comment-id:272364863 --> @goer99 commented on GitHub (Jan 13, 2017): 你可以安装一下openVPN看看是否有这个问题。 openVPN的官网:https://openvpn.net/ 需要翻一下墙。 ---------- openVPN的安装可以参考: CenTos OpenVpn 一键安装包 http://www.myzhenai.com/thread-17453-1-1.html 如果脚本里面的资源包下载地址不可用,可能需要更换所需资源包的下载地址。 以上是openVPN的服务器端安装。 ------- OpenVPN客户端配置 对于Windows客户端 到 http://www.vpswe.com/goto/3h62 下载gui版的OpenVPN,按照提示安装完成后,进入到安装目录,如D:\Program Files\OpenVPN。将Linux服务端使用easy-rsa产生的客户端证书、私钥和ca证书下载到本地。即需要下载到本地的文件如下: /etc/openvpn/easy-rsa/2.0/keys/ca.crt #ca证书 /etc/openvpn/easy-rsa/2.0/keys/client.crt #客户端证书 /etc/openvpn/easy-rsa/2.0/keys/client.key #客户端私钥 将这些文件下载到D:\Program Files\OpenVPN\config下。 编辑客户端OpenVPN配置文件client.ovpn,内容如下: client dev tun proto udp remote SERVER_IP 1194 resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert client.crt key client.key comp-lzo verb 3 redirect-gateway def1 route-method exe route-delay 2 将SERVER_IP写成OpenVPN服务器的ip,然后打开OpenVPN的GUI,点击连接,完成OpenVPN拨入 对于Mac 客户端 到 http://sourceforge.net/projects/tunnelblick/ 下载OpenVPN 客户端软件 Tunnelblick
Author
Owner

@2726266496 commented on GitHub (Jan 16, 2017):

我也发现这个问题了,OpenVPN使用udp方式刚开始没有问题,过一段时间连接会超时,目前解决方法是使用OpenVPN的tcp模式,frp也使用tcp方式。使用了两三天了,没出现什么问题。
PS:原issue#206已关闭,在此感谢作者回复

<!-- gh-comment-id:272761679 --> @2726266496 commented on GitHub (Jan 16, 2017): 我也发现这个问题了,OpenVPN使用udp方式刚开始没有问题,过一段时间连接会超时,目前解决方法是使用**OpenVPN的tcp模式,frp也使用tcp方式**。使用了两三天了,没出现什么问题。 PS:原issue[#206](https://github.com/fatedier/frp/issues/206)已关闭,在此感谢作者回复
Author
Owner

@goer99 commented on GitHub (Jan 16, 2017):

没错。tcp proxy没有这个问题,只有udp proxy有这个问题。

frp作为tcp proxy非常不错,期待udp也能一样出色。

<!-- gh-comment-id:272792506 --> @goer99 commented on GitHub (Jan 16, 2017): 没错。tcp proxy没有这个问题,只有udp proxy有这个问题。 frp作为tcp proxy非常不错,期待udp也能一样出色。
Author
Owner

@luhanglei commented on GitHub (Mar 2, 2017):

我也遇到了同样的问题,每次请求就是需要在公网发送一条UDP到我的内网里的某台设备,然后在很短的时间内,内网的设备回复回去。frpc刚运行的时候很稳定的可以使用。但隔了一晚上没有任何操作之后,TCP仍然正常,UDP就连接不上了。要重启frpc才可以。

<!-- gh-comment-id:283516600 --> @luhanglei commented on GitHub (Mar 2, 2017): 我也遇到了同样的问题,每次请求就是需要在公网发送一条UDP到我的内网里的某台设备,然后在很短的时间内,内网的设备回复回去。frpc刚运行的时候很稳定的可以使用。但隔了一晚上没有任何操作之后,TCP仍然正常,UDP就连接不上了。要重启frpc才可以。
Author
Owner

@fatedier commented on GitHub (May 21, 2017):

@goer99 可以尝试下 v0.10.0 版本,这个 issue 暂时关闭,如果新版本还有问题,麻烦另开 issue 反馈。

<!-- gh-comment-id:302926744 --> @fatedier commented on GitHub (May 21, 2017): @goer99 可以尝试下 v0.10.0 版本,这个 issue 暂时关闭,如果新版本还有问题,麻烦另开 issue 反馈。
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: github-starred/frp#149
No description provided.