cyilin / FRP 内网穿透的个人配置

Created Thu, 06 Feb 2025 21:32:08 +0800 Modified Sun, 14 Dec 2025 23:57:20 +0800

总所周知,公网ipv4的ip地址在中国那是相当的珍惜。为了一个固定、甚至只是动态的公网ipv4,无数人打爆运营商的电话,甚至是花费一大笔钱开通所谓的专线方可获得,虽然这种固定ip在发达地区是人手一个。

但是我们访问家里的设备和运行的服务又要一个独立的ip,因此我们就发展出各种各样的技术,比如我之前写得搭建zerotier局域网

但是这种方式需要在双方设备都安装客户端,且需要在网站上把设备加入到自己的局域网中,外人想要访问就显得很是麻烦,比如给网友分享自己私人网盘资源的时候。当我们有这种需求且没有公网ip的情况下,frp技术应运而生。

FRP

FRP——高性能的反向代理应用,作用是把流量从服务端转到客户端上。当流量访问到服务端的时候,frp便会把相关的流量转到部署了客户端的设备中中,这样我们就实现了外部网络访问到自己的设备了。

那么说到这里,我想你也很敏感的注意到,咱们还是需要公网ip以便于我们可以直接访问到服务端。 我们是租用一台带有公网ip的云服务器来部署服务端。这样做的优势就在于租用云服务的成本通常要小于直接拉取专线,个人用户拉专线只是为了一个公网ip其实还是很亏的 (说得就是广东,连动态公网都不给的屑运营商)。

购买服务器

在正如前文所述,在开始正式部署之前我们需要租用一个带有公网ip的服务器,按需购买即可。购买之前看清楚是否带独立的公网ip(只是开放数个端口的也可以,但是对frp有部分限制)、上下行带宽(服务器一般的带宽单位是Mbps/s,而我们日常生活中的流量速度单位是MB/s,前者除以8才能得到后者),可以的话尽量找大牌的服务器商,比如阿里云这类,选择中小服务器商有跑路的风险。

配置FRPS(服务端)

我们需要在服务器部署frp服务端(frps),在客户端上部署frp客户端(frpc)。

Releases · fatedier/frp · GitHub

我们从上面的连接下载适合自己版本的frp(frp_windows_amd64)并解压,可以得到以下这几个文件:

我们首先把带frps字样的文件放到我们租用的服务器上,然后点开frps.toml,对frps进行基础配置。由于我只是需要转发http网页流量,因此我是这么写:

#【frp服务端口,用于frps和frpc之间通信用的】
bindPort = 17603
#【http服务端口,用于传输http流量,适合网页流量传输】
vhosthttpport = 13470
#【frps和frpc之间的通信授权码,为了安全起见青改成复杂一点的】
auth.token = "xxx"

在fprs的配置中,tcp类型的流量是不需要单独设置端口的,且我们是需要在frpc配中设置;tcpmux则是需要单独设置端口,它支持服务端 TCP 端口的多路复用,允许通过同一端口访问不同的内网服务,但是我一直没搞明白,因此在此按下不谈。

配置FRPC(客户端)

我们把带frpc字样的文件放在自己的设备上,然后点开frpc.toml,对frpc进行基础配置。由于我只是需要转发http网页流量,因此我是这么写:

# 【公网服务器的ip地址】
serverAddr = "xxx.xxx.xxx.xxx"

#【frp服务端口,用于frps和frpc之间通信用的,端口设置成和bindPort一样】
serverPort = 17603

#【frps和frpc之间的通信授权码,之前写什么这里就写什么】
auth.token = "xxx"

[[proxies]]    #代表一个项目的开始和结尾
name = "xxx"    # 项目的名称
type = "http"    # 项目的类型,前面我只是指定了http端口,因此这里我输入http
localIP = "xxx.xxx.xxx.xxx"    #本地ip,不一定是要frpc的ip,frp本身是有转发功能的,写入真实访问到的ip即可
localPort = xxxx    #访问到的机器的具体端口
customdomains = ["xxxxx.xxxxx.xx"]    #域名,这里是根据域名来流量应该转发到哪里端口

以上配置中,我是设置了http类型端口进行流量转发,并通过customdomains参数来规划每一部分流量的具体走向,因此我这里是输入自己的域名。

域名配置可以看我之前写得这一片教程稍微剑走偏锋的nas方案——2 | cyilin的小房间,只要看域名那一块即可。

对于tcp的流量,之前说过我们是不需要在frps指定一个tcp端口的,因为tcp会直接占用frps端的一整个端口,无法像是http类型这样通过customdomains来判定流量具体走向到什么端口。因此我们可以这么写:

# 【公网服务器的ip地址】
serverAddr = "xxx.xxx.xxx.xxx"

#【frps和frpc之间的通信授权码,之前写什么这里就写什么】
auth.token = "xxx"

[[proxies]]    #代表一个项目的开始和结尾
name = "xxx"    # 项目的名称
type = "tcp"    # 项目的类型,前面我只是指定了http端口,因此这里我输入http
localIP = "xxx.xxx.xxx.xxx"    #本地ip,不一定是要frpc的ip,frp本身是有转发功能的,写入真实访问到的ip即可
localPort = 1029    #访问到的本地机器的具体端口
remotePort = 6000    #监听服务器的端口,会把该端口的所有流量都转发到localPort设置的端口上

反向代理

根据前面的步骤,我设置了13470端口作为http的流量转发端口,我们需要把访问到公网服务器的流量转发到这个端口上,因此反向代理或者端口转发就得派上用场了。而反向代理可以挂上SSL证书且可以实现端口复用,因此我优先选择使用反向代理。

至于SSL证书和反向代理的使用请看之前的博客,翻到SSL证书这一部分。

在这里需要注意的是,我们设置的反向代理后端地址是写本机地址(127.0.0.1)的http流量转发端口。以上面的例子来说,就是写入127.0.0.1:13470

弄完之后,我们在在frps目录下启动powershell并输入./frps -c ./frps.toml,在frpc目录下启动powershell并输入./frpc -c ./frpc.toml,随后在浏览器进行连接测试即可,能成功访问那就是正常运行。

Frp常驻后台

上面使用命令启动frp不但容易误触,而且每次启动也不方便,关机后还得再次输入命令,因此我们需要一个自动化启动的方案。由于我使用的是windows作为演示,因此我这里使用**nssm**将frp注册为windows的系统服务,从而达成自动开机启动frp。

我们下载合适自己系统的**nssm,并放到一个合适的目录上。打开cmd,使用cd命令进入到含有nssm.exe**的文件夹上。

然后我们输入命令nssm install,就可以得到这样一个弹窗。

Application Path中选择frps的exe文件;Statup directory会自动填写到frp的根目录,不用管;Arguments则是填写-c frps的配置文件路径既可;Service name则是随意,指的是服务的名称,自己能记住就行,不能够和已有的服务同名。

然后我们点击Install service既可成功注册,frpc端也是这样如法炮制。

接着我们在搜索并打开“服务”,找到刚刚注册好的frp服务(Service name),然后点击启动即可。需要注意的是我们要右键frp服务并打开属性, 并把启动类型改成自动,这样才能一开机就自启动frp。

至此,便是我目前配置的frp。

如果不是该死的运营商天天想着拿ipv4收钱,我也不用这么麻烦。但是当我看到阿里云的ipv6开通居然要额外缴费,真是感慨:一山还有一山高啊。