内网穿透工具 frp 的相关教程、示例、遇到的坑

这里将连载一些内网穿透工具 frp 的一些教程、示例。

分享教程与示例的同学,将获赠实体书《Linux 就该这么学》一本,共 10 本,先到先得,详见这里

授权访问

为了安全起见,请在 frps.ini 与 frpc.ini 配置文件的 common 部分添加授权:

[common]
server_addr = IP
server_port = 7000
auto_token = appinn

请保证两端的 auto_token 值相同,这相当于两端对暗号,不一致将无法链接,有助于保护你的 frp 服务。

Windows 下如何让 frp 以系统服务的方式运行

运行 frp 后会有一个命令提示符的窗口,如果长期在桌面的话,会很烦人。

这里有一个 nssm 工具,可以帮助你把 .exe 程序变成 Windows 系统服务,这样就看不到那个窗口,并且也会在开机后自动运行了,非常的方便。

下载地址,nssm 官网挂了,这里是 GitHub 的下载地址。

然后用管理员方式打开命令提示符:

nssm.exe install frp

然后就会弹出窗口,如上图输入后,点击 Install Service 按钮,就会在服务中创建一个 frp 的系统服务了:

然后,就开机无忧啦。

准备去吃饭前看到,好像挺简单不怎么耗时间。在学生价开的阿里云轻量应用服务器上按部就班搞一套,最后访问网址的时候提示说未备案 :mask: 直接访问域名的话是 frp 的 “ The page you visit not found.”

还是先去吃饭,之后再在我 vultr 上试试吧。

使用linux服务器时,可以使用supervisor守护进程,在/etc/supervisor/conf.d里面随便建一个xxx.conf的文件,在里面加入

command=/www/wwwroot/frp_0.27.1/frps -c /www/wwwroot/frp_0.27.1/frps.ini
directory=/www/wwwroot/frp_0.27.1/
autostart=true

就不用担心关了终端frp就挂了,如果不小心挂了他也会自动启动

如果要使用HTTPS,要在frps.init里面配置vhost_https_port ,当然这个端口号可以随便写

vhost_https_port = 443

然后在客户端配置frpc.ini

[https]
type = https
local_port = 8080

最后,本地8080端口提供的还必须是https服务,打个比方,如果用webpack,那在webpack.dev.conf.js中devServer必须配

https:true
1赞

可以直接用 IP 访问,原文说的麻烦也在于此…

关于守护进程。

在 Windows 上面用 winsw 比较好,这在我之前的 Aria2 - 超・懒人包(2018.11.19 更新) 里用过。nssm 年老失修,且在终止服务进程的时候会有些问题。

而在 Linux 上面,用系统自带的 systemd 比较好,supervisor 你还需要额外去安装启动。frp 我目前没有使用的需求,不然我可以提供个 unit file 文件范例,但网上是能搜到的。

活跃气氛大法好,正好可以试试在我的onevps上试试. 在公司访问家里电脑.

求教程。

我经常也用 FRP,最常见的问题就是阿里云服务器上为了安全起见,开启了防火墙,此时内网防火墙对外网访问进行了流量识别与屏蔽,比如禁止了 SSH 协议等,你怎么也连接不上 SSH 端口,此时可设置参数 use_encryption = true,是将FRP 客户端 与 FRP 服务端之间的通信内容加密传输,这样就符合了 SSH 协议的数据加密传输要求,就可以有效防止流量被拦截这种问题,也可以设置 use_compression = true 参数,这个是启用报文压缩的功能,稍微会消耗一点CPU,几乎感觉不到的,这两个就是我经常遇到的问题,分享给大家,希望能帮助大家排查一下问题。

试了一下winsw,使用比nssm麻烦点,第一个是要给下下来的winsw程序改名字,比如我改成winsw_frp.exe,第二个是建立xml配置文件,必须跟刚刚改的名字同名,即winsw_frp.xml,内容

<configuration>
  <id>frp</id>
  <name>Frp Service</name>
  <description>Frp服务,开机自动启动</description>  
  <executable>D:\Program Files\frp_0.26.0\frpc.exe</executable>
  <startmode>Automatic</startmode>
  <arguments>-c "D:\Program Files\frp_0.26.0\frpc.ini"</arguments>
</configuration>

搞好了 frp,这样我就能在外网访问自己的 NextCloud 了。终于实现了我之前发帖子说的在外网看自己局域网中的视频 :joy:

但是 NextCloud app 看视频的体验不是很好,对我内网的小主机资源消耗也相对比较高。想试试用 frp 搞定外网访问 samba。在 frpc.ini 里添加了如下内容:

[smb]
type = tcp
local_ip = 127.0.0.1
local_port = 445
remote_port = 44546

这样就可以在外网连接到内网的 samba 了。外网中访问 samba,Host 要填服务器的公网 ip, portfrpc.ini 里的 remote_port

用 samba 浏览内网文件比 NextCloud 快一点,内网机器的资源消耗要小。用 Samba 的话,从外网看内网视频的播放器的选择丰富得多,资源消耗同样少不少。

嗯,winsw 没有 GUI 配置程序,需要手动编写配置文件,这对普通人的确是麻烦的事情。

不过服务托管本来就不是一般人干的事情,编写配置文件不应该算作麻烦了,而且难度也跟 linux 下配置 frp 差不多吧。

winsw 开源免费,技术和功能都不错,也在持续更新,的确是一款很优质的软件,其实上次我发 aria2 超・懒人包的时候就说了青蛙可以单独介绍下这个软件。

winsw 应该是比较适合 windows server 这种生产环境,托管自己写的程序以及 nginx 之类的程序,像 nssm 托管 nginx 会有问题,终止服务的时候,只能 kill 掉 master 进程,无法 kill 其 fork 出的 worker 进程。至于 nssm 托管 frp会不会有问题,可能没有,我没用过就不知道了。

@Qingwa ,上面这位给了配置文件,教程什么的再看吧,鄙人英文差。

再搬运个 ArchLinx 的 AUR 库里面的守护进程配置文件吧,

服务端

/etc/systemd/system/frps.service

[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frps -c /etc/frp/frps.ini

[Install]
WantedBy=multi-user.target

客户端

如果你客户端是装在 windows 上的,这个配置文件可以忽略掉

/etc/systemd/system/frpc.service

[Unit]
Description=Frp Client Service
After=network.target

[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frpc -c /etc/frp/frpc.ini
ExecReload=/usr/bin/frpc reload -c /etc/frp/frpc.ini

[Install]
WantedBy=multi-user.target

上面两个配置文件中的 frp 路径也许需要更改,这取决于你把 frp 放在什么路径下。其它配置项可能在不同发行版需要斟酌下。

设置服务端为开机启动 : sudo systemctl enable frps

启动服务端: sudo systemctl start frps

查看服务端运行状态: sudo systemctl status frps

同样,如果客户端安装在 linux 上,同样的三个操作,只需要把上面三个命令中的 frps 替换为 frpc 。

发完贴后急速破案 :joy:

发现是因为一开始服务器端的配置将可用的端口限制为 2000-50000


今天我添加一项 tcp 转发后,在服务器端的 dashboard 里一直看不到,尝试直接访问也是无效的。

之后我随意添加了一个名为 “test” 的 tcp 转发,在 dashboard 里能看到。但当我在客户端的配置里把 “test” 删掉之后,dashboard 里还显示着一个空的 “test”——离线的没有端口号的。

我之前添加的那个应该是:

[node-js]
type = tcp
local_ip = 127.0.0.1
local_port = 1880
remote_port = 1880
use_Encryption = yes
use_Compression = yes

我以前在知乎发过一个稍微复杂点的应用教程 frp和nginx内网服务器转发和建站