搭建nps服务器和frp服务器的尝试过程

Mussy Hu

前言

在尝试编写个人服务器部署脚本的过程中,就已经有了对 nps 服务器搭建的尝试,因为我觉得在有了一个个人服务器的基础上,内网穿透这个功能是一个比较实用的功能,当我在本地电脑上搭建了一些临时服务或者像远程电脑或者远程 ssh 等,有了内网穿透我就可以在外面访问到自己电脑上的东西,无论是控制电脑还是下载电脑上的文件,总之是实用的。

过程

对于 nps 服务器,我的尝试一直是使用 docker 部署,nps 提供给客户端连接的端口是 8024,我将它从容器中映射到主机上的 8004 端口,然后再用 nginx 监听 8024 端口并根据域名转发到 8004 端口(因为我希望这些端口能被复用)。
在反复尝试后,客户端始终连接不到服务端,中间发现并解决的问题有

  • 服务器的系统防火墙问题
  • 腾讯云的防火墙规则问题
  • 服务端客户端版本对不上问题
    在解决上述问题后,nps 客户端仍然连接不到服务端,报错如下:
1
2024/12/17 23:10:26.372 [E] [control.go:111]  read tcp 10.100.27.125:54517->111.229.175.123:8024: i/o timeout

此时我认为这是 nps 的问题,考虑到内网穿透服务器不止一个方案,于是我开始寻找替代方案,最后选择的是 frp。

对于 frp 服务器,我仍然照猫画虎找了 docker 镜像来部署,基本按照我部署 nps 时一样的操作来,结果按照网上的教程部署好服务器后,在部署客户端时,发现客户端的配置文件格式是 toml 文件,教程里给出的格式则是 ini 格式,而服务端我在部署是用的是 ini 格式(实际上最新版已采用 toml 格式的配置文件,用 ini 也能运行但会提示 ini 在未来会不再支持)。
由于当时我并不知道 toml 格式的配置文件如何编写,也不清楚 ini 格式的配置能否直接使用,因为自带的配置文件是 toml 格式,担心改成 ini 会有问题,所以一时难以往前推进。
在后续搜索部署客户端的教程过程中,发现有一款开源的 GUI 客户端,可以可视化配置,不需要编写文件,在下载这款软件并配置客户端后,查看日志发现报出了和 nps 客户端连接服务端时一模一样的错误:

1
2024-12-18 21:10:28.521 [W] [client/service.go:298] connect to server error: dial tcp 111.229.175.123:7000: i/o timeout

在寻找问题时发现客户端没有选择 token 认证(服务端启用了),但客户端启用后仍然连不上,报的还是之前的错。
此时我意识到很有可能就是服务器相关的一些其它方面有问题,在尝试过后,最后发现的原因如下:

nginx 是一个 web 服务器,它是基于 web 请求来进行转发的,而 nps 和 frp 它们的客户端连接服务器时采用的并不是 http 协议,因此在这个过程里如果用 ngin 来反向代理 frp 服务器,会有不知名问题(暂不知细节,推测是因为用 tcp 连接,没有 http 头,所以 nginx 无法处理)
后续搜索查询发现 nginx 是可以代理 tcp 或 udp 流量的

于是不再使用 nginx 代理客户端连接端口,直接 docker 映射 7000:7000,这下客户端不再报之前的错误了,而是显示 token 不匹配(明明设的是一样的),于是我直接取消了 token 验证,这次终于连上了。

连上之后我开始尝试使用内网穿透功能访问本地电脑的服务,结果一直连不上,反复尝试后,先是发现腾讯云防火墙规则没有放行,于是直接一口气把所有端口所有协议的流量放行了,省得以后再专门配置,但放开后仍然访问不到,又捣鼓半天才意识到,我的 frp 服务端部署在 dokcer 容器内,因此服务端监听的代理端口(访问服务端端口会等价于访问本地电脑的本地端口)位于容器内部,因此在没有相关映射的情况下,我访问服务器是访问不到对应端口的。

最终的解决方案是将 frp 服务端容器的网络模式设置为 host 模式。

  • 标题: 搭建nps服务器和frp服务器的尝试过程
  • 作者: Mussy Hu
  • 创建于 : 2024-12-19 00:00:00
  • 更新于 : 2024-12-19 12:45:43
  • 链接: https://blog.musdrop.com/2024/12/19/搭建nps服务器和frp服务器的尝试过程/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
目录
搭建nps服务器和frp服务器的尝试过程