前言
如果你有一台服务器、nas 等,如果你需要建站或者远程访问 NAS 文件那么就必须拥有公网 IP,大部分人都没有公网 IP,所有就需要内网穿透。
这里先说明一下,虽然这里所说的公网 IP 是指 IPV4,但其实现在大部分人家里可能都有公网 IPV6 了,如果你需要远程访问 nas 或者内网设备,可以直接使用家里的 IPV6。但是如果是建站等公共服务,国内的 IP 如果是 80 或者 443 端口的服务是需要进行备案的,好像是可以使用其他的端口然后进行反向代理,但是不建议这样做(听说可能会被警察叔叔请去喝茶)
IPV6 公网
如果你拥有 IPV6 的话,家里的设备直接配置好 IPV6 就可以直接访问了,大部 IPV6 都是公网 IP,这个分地区分情况的,可以自己去查询。如果不是的话那就只能购买一台公网的服务器做内网穿透了。
如果你的 IPV6 是公网 IP,访问的客户端也需要拥有 IPV6,比如你在学校的电脑访问你家里的 NAS(拥有公网 IPV6),你学校的电脑也必须是拥有 IPV6 地址!不过好像你也可以使用 cloudflare 代理实现 IPV4 访问 IPV6,这个我准备下次回家试试,有结果再反馈,有使用成功的朋友也可以分享一下。
内网穿透
frp 简介
frp 分为服务端和客户端,服务端就是拥有公网的 IP 的服务器,将其作为中转站,实现公网 ←→ FRP(服务器) ←→ 内网。如下图所示
它支持 tcp,udp,http,https,不久前了解了它还推出了“点对点穿透”的试验性功能。连接成功后可以让公网设备直接跟内网设备“点对点”传输,数据流不再经过 VPS 中转,这样可以不受服务器带宽的限制,传输大文件会更快更稳定。这个功能等有时间再折腾。
frp 安装
frp 支持 Windows ,Linux,macOS,ARM 等多平台部署。我是在 Linux 以及群晖系统中部署中。WIndows 的命令以及操作都差不多。
仓库代码](https://github.com/fatedier/frp))
Linux 服务端
先根据自己的服务器类型选择相应的安装包,点击 release,然后下载最新的就行了,注意不要下到 .Resource
后缀的文件了,那个是源码,
下载完成之后会得到下面几个文件,还应该有两个 frps_full.ini 和 frpc_full.ini 文件的,好像被查杀了,这两个文件相当于一个文档,里面写满了配置信息,在你自己写配置的时候可以参照上面的配置填写。
其中 LICENSE 文件是服务端以及客户端都需要的,frps 是客服端的程序,frpc 是服务端的程序,ini 结尾的是相关的配置文件。frps. ini 和 frpc. ini 都是空文件,需要自己配置,首先是服务端的配置
[common]
//服务端与客服端连接的端口,客户端的端口需要和下面的保持一致
bind_port = 7000
//tocken相当于一种秘钥,客户端连接时需要配置正确的tocken否则无法连接
//用户需要自定义tocken,也可以不设置,建议设置
tocken = xxxxxxxxxx
//默认的http和https连接端口,主要是网页服务
vhost_http_port = 80
vhost_https_port = 443
上面只是简单的一小部分配置,可以适应大部分场景,如果有更多的需求,可以参照 full文件配置
然后将 frps ,frps. ini,LICENSE 这三个文件上传到需要部署的服务器上,建议新建一个“frps”文件夹,上传后使用命令行窗口,切换到 root 用户,移动到 frps 所在文件夹,然后执行 frps -c frps.ini
然后出现一堆 success,只要没有爆红或者爆黄色提示就说明搭建成功了。
如果是新手的话可能不知道上面说的是什么意思,下面来具体说明一下,首先你需要通过 ssh 连接上你的服务器,我一般是使用的 MobaXterm,软件下载链接
下面我将通过用 MobaXterm 连接,首先下载解压后会得到一个如下的可执行程序
点击 session
然后点击 SSH
在 remote host 里面填上你的服务器 ip 地址,选上 specify username,然后在后面填上 root
然后输入你服务器的 root 密码
连接上服务器后,把服务器需要的三个文件 frps ,frps. ini, LICENSE 都打包进一个 frps 的文件夹里,然后把 frps 的文件夹直接拖进侧栏的文件栏中即可上传到服务器
然后在命令行窗口执行 cd frps
切换到 frps 文件夹中,再执行 ./frps -c frps.ini
即可开始运行,但是现在还不行,如果断开 ssh 连接那么 frps 这个程序也会停止,我们需要运行一个脚本实现可持续运行。
首先我们需要创建一个 frps. service 文件
执行 vim /etc/systemd/system/etc/frps.service
,然后就可以进入 vim 编辑器
按下 i 键即可进行编辑操作,将下面的代码复制进去即可
Description=Frp Client Service
After=network.target
[Service]
Type=simple
//user需要改成相应的用户,也就是命令行@前面的字符
User=root
Restart=on-failure
RestartSec=5s
# 启动 frps 的命令,需修改为您的 frps 的安装路径
ExecStart = /root/frps/frps -c /root/frps/frps.ini
[Install]
WantedBy=multi-user.target
然后执行 systemctl enable frps
,设置开机自启动。
下面讲几个常用的命令
systemctl start frps
启动 frps 服务
systemctl restart frps
重启 frps 服务
systemctl status frps
查看 frps 服务的运行状态
注意:上面的所有服务端有关的命令在配置 linux 客户端的时候也是一样的操作,不过是要把 frps 改成 frpc,一般来说本地服务器你不会直接用 root 用户登录,那么在脚本配置的时候 User 那一行记得要改成相应的用户名即可
客户端
客户端可以部署在软路由中,也可以部署在本地服务器中,我是部署在群晖 nas 中,部署的方式比较简单,如果是 linux 系统或者 WIndows 系统部署都和上面的服务器部署差不多,主要是修改配置文件,然后在 frpc 与 frpc. ini (还有 LICENSE 文件)所在文件夹下执行的命令 frpc -c frpc.ini
即可,Windows 的话是执行 frpc.exe -c frpc.ini
,切记一定要移动到相应的文件夹再执行命令行操作。
下面是 frpc. ini 文件的配置
[common]
server_addr = 填写你的服务端公网ip地址,可以填指向公网ip的域名
# 一定要与服务端的bind_port保持一致
server_port = 7000
# 与服务端的tocken保持一致
tocken = xxxxxxxxxx
# 下面是你需要穿透的服务
# 首先是在[]中填写服务名字,起一个自己能辨认是什么服务的就行,比如web服务用web
[web]
# 然后是协议类型,网页的话一般是http或者https
# https需要配置相应的证书,比较麻烦,以后有机会单独讲
type = http
# 然后是你的本地ipv4地址
local_ip = xxx.xxx.xxx.xxx
# 本地服务的端口号
local_port = xxxx
# 网站的域名,注意:如果传输协议的http或者https的话必须配置域名
# 域名需要指向你的公网ip地址
custom_domains = xxx.xxx.xxx
# 如果是一般的服务不需要域名的话如下配置
[nas]
# 类型的话tcp就行
type = tcp
# 然后本地的ipv4地址以及端口
local_ip = xxx.xxx.xxx.xxx
local_port = xxxx
# 然后是你需要映射到公网的端口
# 在进行访问的时候需要 公网ip:端口号 进行访问
remote_port = xxxx
remote_port = xxxx
IPV6 搭建(待证实)
因为我家里是有公网 IPV6 的,而 frp 是完全支持 IPV6 的,所以我之前有考虑使用家里的 IPV6 进行内网穿透来实现外网访问 NAS 的,这样速度也比较快。但是因为 IPV4 和 IPV6 不能互访,并且我的校园网是没有 IPV6 地址的(好像如果有也不需要内网穿透了 hh),所以意味着我在寝室的服务器是无法连接通过 IPV6 搭建的 frp 服务端,就无法实现内网穿透,但是如果通过 cloudflare 代理实现 ipv4 访问 ipv6 的话那么上述操作就可能实现。这个需要等下次回家的时候进行证实、
公网 IPV4 服务器搭建穿透服务
首先说明一下,如果只是单纯的想搭建网站的话建议就直接购买轻量化服务器,一般学生优惠或者搞活动购买的话一个网站的服务器一年就一百左右,而且省时省力,建议购买大厂的服务器,阿里云学生优惠是可以免费一年的海外服务器,还有阿里云目前还推出了新用户与续费不变价的活动,2h2g 一年 99 还是比较划算的,不过不知道活动会持续多久,如果没有活动了的话就是“老用户与狗不得入内”了,腾讯云的学生认证之后价格也还行。国外也有一些可以白嫖的服务器,比如 aws 和 azure 可以免费白嫖一年,建站的话还行,不过流量比较少拿去做穿透可能就有点捉紧了。
我做 frp 穿透主要使用过下面两种
1. 使用国外的 vps 搭建
Vps 服务器一般带宽大,拿去做 nas 比较合适,国外搞活动的话有些低价的一般就 10 刀左右一年,不过延迟可能比较高,如果是搬瓦工的话就太贵了,一般这一类便宜的 vps 在晚上的时候基本卡的没法用,如果是文件传输的话可能有点够呛,其他的话比如说网站服务等还是可以通过一些手段去实现。这里先说一下我用过的三家 vps 服务商,第一家是 raksmast 和我现在用的 racknerd 差不多,主要都是美国的机房,晚上基本卡的没办法用,而且更换 IP 的话需要额外给钱,如果不小心被墙了的话就比较伤了,我当时 raksmart 就因为搭梯子没有做伪装就被墙了,因为就买了一个月就没管了,raksmart 不限流量但是带宽比较小,大部分都是大陆优化,但是感觉也没好到哪去.
RackNerd - Introducing Infrastructure Stability
Dedicated Server, VPS, Cloud Server and Bare Metal Provider - Raksmart
还用过一家 justvps,价格稍微贵一点,其实他们家和俄罗斯的一家叫 justhost 的服务商是同一个运营团队,justhost 之前很不错的,价格非常便宜而且速度也很牛逼关键还不限流量并且可以免费更换 ip,不过后面好像烂了就没敢买。Justvps 价格较为贵一点,月付的话大概是 30 多块钱,如果是年付的话大概是一个月 20 多块钱,如果是五年付的话就比较便宜只需要 16 块钱左右,但是害怕后面烂掉不太敢买。
他们家有多个机房可以重构切换机房,还可以免费更换 50 次 ip 完全不怕被墙,但是千万不要选他们家的香港机房,不知道是用的人太多还是绕路了,延迟很大很卡,最好用西伯利亚的机房,延迟就一百多点,速度还是比较快,就算是晚上也能挺住,而且他们家的客服很棒,因为当时机房选错了使用体验太糟糕了,跟客服反馈之后客服建议我换了西伯利亚的机房还给了个 8 折优惠。使用下来的体验还是挺不错的
Unmanaged VPS hosting (justvps.pro)
Racknerd 现在买了其实已经后悔了,虽然便宜,一年只用 160,但延迟确实高,而且晚高峰太卡了。
总结一下就是如果你要买国外的 vps ,可以试试 justvps,他们家西伯利亚机房的延迟和速度真的很不错,如果觉得太贵了的话想要便宜的话,要么折腾一下,具体怎么折腾我后面会单独出一篇,要么就买下面提到的 frp 线路。
2. 购买专门提供 frp 服务的线路
我用的一家 dpfrp 还不错,运营了也不少时间了,只买过他们家香港 8 元 20 m 的线路,用的是阿里云的服务器,延迟比较低,但是因为共享带宽,高峰期可能会跑不满,nas 的话可以购买他们家重庆等 nas 专用的线路,不过那种没有 80 端口。看了他们家还有个香港 50 m 的之后可能会考虑买一个玩玩,之前有个韩国 500 m 的 6 年 388 元,不过可惜现在停售了可能是白嫖的甲骨文云,他们家虽然有免费的线路不过基本都在维护状态,可能大部分人都拿去当梯子用了就被封了。
我建议就是买一条香港的 8 块钱线路,套一个 cft(aws 免费的 cdn,由于篇幅,后面单独说),网站的访问速度还是不错的。如果还有对速度要求不太高,平常就传输一些文档之类的东西,拿去给 nas 穿透也应该够用了,如果需要大带宽延迟低就建议买一个国内的线路比如重庆的线路。其实香港的 50m 也看起来不错,但是之前我 20m 的在播放内网 jellyfin 的时候有时候加载还是有点慢,不知道 50m 的会不会有所改善。
一定要注意!国内的线路是不开放 80 端口的,是没有办法建站的!要建站只能买国外的线路!!! 还有他们家的免费隧道只有两条,买套餐是不送隧道的!一条隧道 3 块钱永久有效
对比
购买 vps 的话最大的好处就是带宽大,随便建隧道,同时你还可以用 vps 搭一个梯子,也可以搭建一些其他的服务,比如私人图床,建在 vps 上的服务其实是不需要 cdn 加速的,使用优选 ip 加速访问速度也很快,所以你也可以配置买稍微高一点,可以直接在上面搭建网站等服务。文中的提到的优选 ip 后面会单独出教程,也可以在油管看“不良林”大佬的视频。
如果是 frp 线路的话,优点就是相对于国外的 vps 延迟低,速度比较稳定,使用简单,只需要在客户端部署就行了,缺点就是没有扩展性,隧道需要单独购买,貌似有骚操作可以一条隧道多个服务,如果以后有需要有时间的话再折腾一下。
PS:提示一下各位要注意保护自己的服务器,最好常用的端口都替换掉,比如 ssh 所使用 22 端口,以及网页默认的 80,443 端口,可以直接把 frps 中端口改为如 32942 这类随意的端口,然后通过反向代理的转发到 80,443 端口,后面的反向的代理教程会单独出一期