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

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

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

1 个赞

授权访问

为了安全起见,请在 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 个赞

关于守护进程。

在 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,几乎感觉不到的,这两个就是我经常遇到的问题,分享给大家,希望能帮助大家排查一下问题。

1 个赞

试了一下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>

再搬运个 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 。

1 个赞

发完贴后急速破案 :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内网服务器转发和建站

我这边FRP想要添加个状态查询去,要怎么操作呢?

不知道你说的是什么…

在 frps 端,有一个 web 页面呀。

就是添加这个web页面,已经找到方法添加了,谢谢

请问我按照教程设置完成后 用微软的远程桌面访问 这边本地的服务器永远是拒绝呢,防火墙我都是关闭的

你怎么访问的呀

winsw,EasyService,都是需要.net运行时的,所以我还是只能用nssm,唉

现在 .net 不是系统自带么

求教程。