神代綺凜

[frp] 内网穿透神器搭建 萌新也看得懂的教程系列
目前个人认为配置和使用上是最方便的内网穿透工具,已经用了快两年了,拿来穿透进没有公网的位于学校宿舍的路由器,蹭蹭百...
扫描右侧二维码阅读全文
12
2018/05

[frp] 内网穿透神器搭建 萌新也看得懂的教程系列

目前个人认为配置和使用上是最方便的内网穿透工具,已经用了快两年了,拿来穿透进没有公网的位于学校宿舍的路由器,蹭蹭百度文库企业账号和知网之类的23333

Head Pic: 「ALTER」/「NIAN」[pixiv]

frp

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议

前言

为什么不直接放一个一键脚本?手动搭建不会很麻烦吗?

  1. 这个程序配置起来一点都不麻烦
  2. 一键脚本固然方便,但是对于萌新,我更建议你们尝试手动配置,这样对熟悉与理解 Linux 会有更大帮助
  3. 手动配置具有更大的自由度,并且你将会很清楚这些程序是干什么的

本文将以萌新也能看懂的方式讲解

  1. frp服务端搭建
  2. frp服务端配置
  3. frp客户端配置

不会讲解frp客户端的搭建,因为目前frp的主要用途是用于内网穿透,因此客户端通常情况下是家用路由器之类的没有公网的设备

本文针对的受众是拥有“刷了带frp的固件的路由器(比如这个)”而不清楚如何使用或者在使用上存在疑惑的萌新

如果你需要在一个不含 frp 的 openwrt 路由器上搭建客户端,或者是拥有树莓派之类的家用 linux 机想部署客户端,那么我认为你的知识水平应该足以根据frp服务端搭建的步骤来类比出客户端的搭建方法,以及通过百度谷歌来解决问题

0.18.0版本开始,新版与旧版不兼容,并且部分配置字段不同,为了不混淆,这里讲的是新版的搭建与配置[/scode]

服务端 - frps

1. 下载程序

首先到 frp 的 releases 页面下载最新版的对应 VPS 的处理器架构的压缩包
https://github.com/fatedier/frp/releases

如何知道 VPS 的处理器架构?在 VPS 上运行这个命令:

arch

如果输出x86_64则需要下载带linux_amd64的那个压缩包;
如果输出的是其他的,则在文件列表中找 linux 的对应架构的压缩包

x86_64架构举例(目前大多数都应该是这个架构),本文撰写时 frp 最新版是v0.18.0

cd /root
# 下载
wget --no-check-certificate https://github.com/fatedier/frp/releases/download/v0.18.0/frp_0.18.0_linux_amd64.tar.gz
# 解压
tar -xzvf frp_0.18.0_linux_amd64.tar.gz
# 文件夹名改成 frp,不然目录太长了不方便
mv frp_0.18.0_linux_amd64 frp
cd frp
# 确保 frps 程序具有可执行权限
chmod +x frps

然后试着运行一下frps,看看是否能正常运行

./frps --help

正常情况下会输出一串帮助信息,那么就说明你下载了正确架构的版本

如果提示-bash: ./frps: cannot execute binary file: Exec format error就说明你下错版本了

2. 配置程序

参考以下配置说明来书写配置文件frps.ini,你可以先在电脑上打一份草稿
此处只解释说明一些必要和常用的配置,如需研究完整配置说明请看目录下的frps_full.ini,以及参考frp中文说明

# 下面这句开头必须要有,表示配置的开始
[common]

# frp 服务端端口(必须)
bind_port = 7000

# frp 服务端密码(必须)
token = 12345678

# 认证超时时间,由于时间戳会被用于加密认证,防止报文劫持后被他人利用
# 因此服务端与客户端所在机器的时间差不能超过这个时间(秒)
# 默认为900秒,即15分钟,如果设置成0就不会对报文时间戳进行超时验证
authentication_timeout = 900

# 仪表盘端口,只有设置了才能使用仪表盘(即后台)
dashboard_port = 7500

# 仪表盘访问的用户名密码,如果不设置,则默认都是 admin
dashboard_user = admin
dashboard_pwd = admin

# 如果你想要用 frp 穿透访问内网中的网站(例如路由器设置页面)
# 则必须要设置以下两个监听端口,不设置则不会开启这项功能
vhost_http_port = 10080
vhost_https_port = 10443

# 此设置需要配合客户端设置,仅在穿透到内网中的 http 或 https 时有用(可选)
# 假设此项设置为 example.com,客户端配置 http 时将 subdomain 设置为 test,
# 则你将 test.example.com 解析到服务端后,可以使用此域名来访问客户端对应的 http
subdomain_host = example.com

然后把你的准备好的配置文件内容写入frps.ini

echo "[common]
bind_port = 7000
token = 12345678
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
vhost_http_port = 10080
vhost_https_port = 10443
subdomain_host = example.com" > frps.ini

试着启动一下frps

# 使用 -c 参数指定配置文件
./frps -c frps.ini

如果没有出现错误提示就说明配置没有问题,可以正常使用

接着按下Ctrl + C终止程序运行

3. 使 frps 在后台持续运行

启动

直接使用前面的命令行来运行是不行的,因为在关掉 ssh 窗口后程序frps就会停止运行,因此要使用nohup [command] &这种操作来使其在后台运行

nohup /root/frp/frps -c /root/frp/frps.ini &

并且程序的所有输出(日志)会被写入nohup.out文件中,你可以使用cat命令查看其内容

停止

想停止的话,结束frps即可

pkill frps

重启

那就先停止再启动嘛23333

加入开机自启

编辑/etc/rc.local文件,将启动那句命令加到exit 0语句之前(如果有)

客户端 - frpc

如需研究完整配置说明请看目录下的frpc_full.ini,以及参考frp中文说明

书写配置

基本配置(必须)

# 下面这句开头必须要有,表示配置的开始
[common]
# frp 服务端地址,可以填ip或者域名
server_addr = 0.0.0.0
# frp 服务端端口,即填写服务端配置中的 bind_port
server_port = 7000
# 填写 frp 服务端密码
token = 12345678

TCP/UDP

这里以转发 ssh 为例

# 自定义一个配置名称,格式为“[名称]”,放在开头
[ssh]
# 连接类型,填 tcp 或 udp
type = tcp

# 本地ip,填你需要转发到的目的ip
# 如果是转发到frp客户端所在本机(比如路由器)则填 127.0.0.1
# 否则填对应机器的内网ip
local_ip = 127.0.0.1
# 需要转发到的端口,比如 ssh 端口是 22
local_port = 22

# 是否加密客户端与服务端之间的通信,默认是 false
use_encryption = false
# 是否压缩客户端与服务端之间的通信,默认是 false
# 压缩可以节省流量,但需要消耗 CPU 资源
# 加密自然也会消耗 CPU 资源,但是不大
use_compression = false

# frp 服务端的远程监听端口,即你访问服务端的 remote_port 就相当于访问
# 客户端的 local_port,如果填0则会随机分配一个端口
remote_port = 6001

HTTP(S)

以转发路由器设置页面为例

# 自定义一个配置名称,格式为“[名称]”,放在开头
[router-web]
# 连接类型,填 http 或 https
type = http

local_ip = 127.0.0.1
local_port = 80

# http 可以考虑加密和压缩一下
use_encryption = true
use_compression = true

# 自定义访问网站的用户名和密码,如果不定义的话谁都可以访问,会不安全
# 有些路由器如果从内部访问web是不需要用户名密码的,因此需要在这里加一层密码保护
# 如果你发现不加这个密码保护,路由器配置页面原本的用户认证能正常生效的话,可以不加
http_user = admin
http_pwd = admin

# 还记得我们在服务端配置的 subdomain_host = example.com 吗
# 假设这里我们填 web01,那么你将 web01.example.com 解析到服务端ip后
# 你就可以使用 域名:端口 来访问你的 http 了
# 这个域名的作用是用来区分不同的 http,因为你可以配置多个这样的配置
subdomain = web01

# 自定义域名,这个不同于 subdomain,你可以设置与 subdomain_host 无关的其他域名
# subdomain 与 custom_domains 中至少有一个必须要设置
custom_domains = web02.yourdomain.com

# 匹配路径,可以设置多个,用逗号分隔,比如你设置 locations 为以下这个,
# 那么所有 http://xxx/abc 和 http://xxx/def 都会被转发到 http://xxx/
# 如果不需要这个功能可以不写这项,就直接该怎么访问就怎么访问
locations = /abc,/def

# 重写 host header,相当于反向代理中的“发送域名”
# 如果设置了,转发 http 时,请求中的 host 会被替换成这个
# 一般情况下不需要用到这个,可以不写这项
host_header_rewrite = dev.yourdomain.com

TCP/UDP 范围转发

# 自定义一个配置名称,格式为“[range:名称]”,放在开头
[range:multi-port]

type = tcp
local_ip = 127.0.0.1
use_encryption = false
use_compression = false

# 本地端口和远程端口可以指定多个范围,如下格式,且范围之间必须一一对应
local_port = 6010-6020,6022,6024-6028
remote_port = 16010-16020,16022,16024-16028

合并配置

将你决定要使用的配置合起来,然后填到路由器的 frp 配置脚本中

如果你是在 linux 上运行,则写入到frpc.ini中,然后仿照运行服务端的方式来运行客户端

比如将以上示例配置合并之后,看起来应该是这个样子

[common]
server_addr = 0.0.0.0
server_port = 7000
token = 12345678

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
use_encryption = false
use_compression = false
remote_port = 6001

[router-web]
type = http
local_ip = 127.0.0.1
local_port = 80
use_encryption = true
use_compression = true
http_user = admin
http_pwd = admin
subdomain = web01
custom_domains = web02.yourdomain.com
locations = /abc,/def
host_header_rewrite = dev.yourdomain.com

[range:multi-port]
type = tcp
local_ip = 127.0.0.1
use_encryption = false
use_compression = false
local_port = 6010-6020,6022,6024-6028
remote_port = 16010-16020,16022,16024-16028

事后

登录服务端的 dashboard,看看是否连接成功,测试各项转发是否可用

如果出现无法使用的情况,按照基本思路排查问题:

  1. 看服务端和客户端日志是否有报错
  2. 客户端与服务端连接正常,就检查是否是服务端的防火墙或者安全组是否没开放使用到的端口
  3. 如果客户端是在路由器上,想转发至内网设备上的某个端口或服务,请检查目标设备的防火墙是否开放所需端口,且建议为该内网设备分配一个静态ip
搬瓦工VPS优惠套餐,建站稳如狗,支持支付宝,循环出账94折优惠码BWH26FXH3HIQ
年付$28CN2线路,1核/512M内存/10G硬盘/[email protected]点击购买】(经常售罄,请抓紧机会)
年付$47CN2线路,1核/1G内存/20G硬盘/[email protected]点击购买
Last modification:October 16th, 2018 at 02:32 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment

40 comments

  1. 南风  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 75.0.3770.142(Google Chrome 75.0.3770.142)
    大佬请问一下,客户端启动frpc一直提示[service.go:82] login to server failed: dial tcp 192.144.136.32:7000: connect: connection timed out这个是什么原因啊?
    1. 神代綺凜  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 75.0.3770.142(Google Chrome 75.0.3770.142)
      @南风 检查服务端是不是防火墙或安全组没开放对应端口
  2. Alex Kuang  Mac OS X 10.14.5(Mac OS X 10.14.5) / Google Chrome 75.0.3770.142(Google Chrome 75.0.3770.142)
    感谢大佬的文章… 但想问个不太相关的问题… 博客是开了什么scroll方面的设置吗用触控板上下滑动感觉有点滞后,非常不跟手…
    1. 神代綺凜  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 75.0.3770.142(Google Chrome 75.0.3770.142)
      @Alex Kuang 大概是因为一个平滑滚动的 js
  3. in0222  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 75.0.3770.100(Google Chrome 75.0.3770.100)
    博主是openwrt吗,方便上个客户端的配置截图么。openwrt和lede的配置界面看起来不一样,op适合小白得图文教程好少。不会填 囧
    1. 神代綺凜  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 75.0.3770.100(Google Chrome 75.0.3770.100)
      @in0222 openwrt 如果是H大老毛子那种固件的话,会给个自定义配置的输入窗口来自定义frpc.ini的,配置仿照示例写就行了
  4. tentem  GNU/Linux x64(GNU/Linux x64) / Google Chrome 73.0.3683.103(Google Chrome 73.0.3683.103)
    检测一下我的系统(/ω\)
  5. gai126  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 72.0.3626.121(Google Chrome 72.0.3626.121)
    万分感谢,看来这么多frp教程,就你讲解的最详细清楚。
  6. Jetpy  Windows 7 x64 Edition(Windows 7 x64 Edition) / Google Chrome 73.0.3683.86(Google Chrome 73.0.3683.86)
    我最近写一个类似工具时候研究过frp, 最终觉得还是可以更加简单, 目前我写的allproxy相当于在本地开启了socks5代理, 所以根本就不需要配置端口映射之类的, 只需要一个socks5地址就可以访问局域网其他资源了。 您可以参考下 https://www.jianshu.com/p/7a07843bdd7f
    1. 神代綺凜  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 73.0.3683.86(Google Chrome 73.0.3683.86)
      @Jetpy 问下您这个软件有开源么,好像并没有在文章中看到任何 git 仓库链接,并且也没有放出搭建服务端所需要的程序,这样很容易被怀疑有隐私安全问题噢
      1. Jetpy  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 73.0.3683.86(Google Chrome 73.0.3683.86)
        @神代綺凜 理解用户这个担忧, 一则目前服务端还有好几个功能我个人不太满意,还在优化中, 二则我觉得普通用户的话可能拥有一个公网VPS比较困难, 所以暂时还没开放服务端, 应该半年以内可以开放。 不过说实话, 就我们的网络环境而言, 我个人已经基本不对隐私有什么期望了, 能做到的只能是涉密不上网了。
  7. caoyufei  Mac OS X 10.14.2(Mac OS X 10.14.2) / Google Chrome 71.0.3578.98(Google Chrome 71.0.3578.98)
    代码高亮啥插件啊OωO
    1. 神代綺凜  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 71.0.3578.98(Google Chrome 71.0.3578.98)
      @caoyufei 主题自带
  8. runoob  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 70.0.3538.110(Google Chrome 70.0.3538.110)
    你好,可以告诉一下,你用的是 什么评论插件吗?
    1. 神代綺凜  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 70.0.3538.110(Google Chrome 70.0.3538.110)
      @runoob 主题原生评论
  9. yuan  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 69.0.3497.100(Google Chrome 69.0.3497.100)
    我有一台padavan路由器在校园网上,没有公网ip,想在路由器上弄个vpn服务器,这样在校外也能访问校园网,请问该怎么搞
    1. yuan  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 69.0.3497.100(Google Chrome 69.0.3497.100)
      @yuan 我跟博主的需求相同,也是为了校外访问校内资源,能不能把你的frpc配置发给我( ๑´•ω•) "(ㆆᴗㆆ)
      1. 神代綺凜  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 69.0.3497.100(Google Chrome 69.0.3497.100)
        @yuan 配置不是死的,你服务是哪个端口就配置穿透哪个端口,剩下的那些通用设置啊密码什么你就自己设置啊
    2. 神代綺凜  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 69.0.3497.100(Google Chrome 69.0.3497.100)
      @yuan 在一台服务器上配置好frp服务端,然后在你的路由器上开启你喜欢的代理服务器(http/socks/ss/ssr等),然后配置frp客户端(参考TCP/UDP的说明)
  10. zcvxcv  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 67.0.3396.99(Google Chrome 67.0.3396.99)
    现在的家庭 都是给的动态内网ip 所以 frp 还是非常给力的! 至于DDNS我觉得现在没什么用了。。。
    只要你有个云服务器 部署好frp服务端
    在路由上安装上frp客户端 在外能访问家里的nas 路由 ssh 和任何的设备;非常方便。
    路由上安装客户端 是最便捷的一种方法 你总不能24小时开一台电脑跑frp吧 但是你可以24小时开着路由。
    1. 神代綺凜  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 67.0.3396.99(Google Chrome 67.0.3396.99)
      @zcvxcv DDNS也就动态公网IP用的上,我家就是(
  11. ac  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 67.0.3396.99(Google Chrome 67.0.3396.99)
    大佬大佬,能不能问下你这个标签页的“你看不到我”和“还是被发现了”的效果是怎么实现的?
  12. 道长  Mac OS X 10.13.5(Mac OS X 10.13.5) / Safari 11.1.1(Safari 11.1.1)
    感觉用处好像很大,但是细想好像又有点儿鸡肋,日后应该能用得上吧。emmm还是感谢分享
  13. 尹先生  Android 7.0(Android 7.0) / Google Chrome 66.0.3359.158(Google Chrome 66.0.3359.158)
    收藏了,晚些时间学习一下。
  14. zephyru  Windows 8.1 x64 Edition(Windows 8.1 x64 Edition) / Google Chrome 66.0.3359.181(Google Chrome 66.0.3359.181)
    大佬我有个疑问,大致的浏览了一下..这个,感觉和SSH 反向代理到云服务器上,再连接似乎差不多?
    通过反向代理连接的话,因为要中转,所以连接速度受中转服务器制约,这个也有类似的制约么?
    不晓得大佬了不了解DDNS?这个也会受到中转服务器带宽的制约么?
    如果都受..有没有什么内网穿透方案不受中转服务器带宽制约的呢?
    我试了下直接连接我家暴露出去的公网ip可以得到天翼网关的登录界面..
    然而我实际的上网环境在这个网关背后的路由器的路由器了..也就是网关一层路由器..
    下面还有两层路由器..通过路由器一层层端口映射似乎不太具备可行性....
    大佬怎么看?
    1. zephyru  Windows 8.1 x64 Edition(Windows 8.1 x64 Edition) / Google Chrome 66.0.3359.181(Google Chrome 66.0.3359.181)
      @zephyru 刚扫了一眼文档似乎有提供点对点的穿透方案...
      看起来原理似乎是通过UDP广播..?
      然而,如果第二个点只有浏览器可用..怎么办..
      有跑在浏览器里的Linux环境么....?
      1. zephyru  Windows 8.1 x64 Edition(Windows 8.1 x64 Edition) / Google Chrome 66.0.3359.181(Google Chrome 66.0.3359.181)
        @zephyru 再来一层提问...
        关于这个文章中提到的Padavan固件....
        我入了一个.. MikroTik的千兆路由..默认系统是RouterOS...全英文有点难受..
        我怎么知道能不能刷Padavan固件....
        Padavan这个通常有什么要求呢?
        1. 神代綺凜  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 66.0.3359.181(Google Chrome 66.0.3359.181)
          @zephyru 停一下,问题太多了我已经不知道从哪里开始回答了
          1. zephyru  Windows 8.1 x64 Edition(Windows 8.1 x64 Edition) / Google Chrome 66.0.3359.181(Google Chrome 66.0.3359.181)
            @神代綺凜 233,我感觉我为大佬找了个很好的写博文的话题,你看正好周末了,来...
            敲碗,
            1. 神代綺凜  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 66.0.3359.181(Google Chrome 66.0.3359.181)
              @zephyru 然而问题太多了,要问希望能分别列出关键问题点,而且很多比较偏的东西我也没接触过
              然而周末还要写作业
              1. zephyru  Windows 7 x64 Edition(Windows 7 x64 Edition) / Google Chrome 64.0.3282.186(Google Chrome 64.0.3282.186)
                @神代綺凜 关键点....来看我简单总结一下..
                1、有没有一种不受中转服务器带宽影响的点对点其中访问端是浏览器的内网穿透方法?
                简单来说,就是内网搭个HTTP服务器,外网可以访问,且不受中专服务器带宽限制...
                不知道DDNS能不能满足需求...
                2、 MikroTik的路由能刷...老毛子Padavan的固件么..
                如果不能..刷这个固件对硬件的要求是啥...
                一大串..核心点可能就这两个..
                1. 神代綺凜  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 66.0.3359.181(Google Chrome 66.0.3359.181)
                  @zephyru 1(1)、点对点必须在也本机上使用frp客户端,即需要你本机有客户端、某公网服务器有服务端、被穿透内网机子有客户端,在github的frp说明中有写(本机必须要有客户端的原因你可以参考p2p的原理
                  1(2)、DDNS是给动态IP用的,比如家宽的动态公网IP,目的是每当IP变动时同步更改DNS记录,这个和frp没有关系
                  2、不清楚→_→
                  1. wefinger  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 67.0.3396.62(Google Chrome 67.0.3396.62)
                    @神代綺凜 http://www.right.com.cn/forum/thread-161324-1-1.html
                    这是H大的老毛子Padavan固件发布地址,你可以在这里查找是否支持你的路由器,如果不支持作者也提供了源码你可以自己尝试编译。
                2. zephyru  Windows 7 x64 Edition(Windows 7 x64 Edition) / Google Chrome 64.0.3282.186(Google Chrome 64.0.3282.186)
                  @zephyru 时间是挤出来得,相信我..
                  看到我得探求欲了吗?明天我还要上着班来着..
  15. 柒月君  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 66.0.3359.170(Google Chrome 66.0.3359.170)
    申请个内网IP 用cloudxns api多好
    1. 神代綺凜  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 66.0.3359.181(Google Chrome 66.0.3359.181)
  16. lavender  Android 8.0.0(Android 8.0.0) / Google Chrome 66.0.3359.158(Google Chrome 66.0.3359.158)
    哇,比之前教我的时候还详细!有空慢慢看,看完了自己再改进改进,谢谢绮凛⌇●﹏●⌇
    1. 神代綺凜  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 66.0.3359.139(Google Chrome 66.0.3359.139)
  17. 哈哈  Android 8.0.0(Android 8.0.0) / Opera 1.170623.032(Opera 1.170623.032)
    博主,aria2远程有研究吗?结合这篇文章看看能不能搞出来,https://1oo1.github.io/2017/03/18/%E5%9C%A8ac68u%E4%B8%8A%E9%83%A8%E7%BD%B2aria2/
    1. 神代綺凜  Windows 10 x64 Edition(Windows 10 x64 Edition) / Google Chrome 66.0.3359.139(Google Chrome 66.0.3359.139)
      @哈哈 路由器上的我直接用H大的老毛子固件,里面什么都有,aria和frp
      没试过手动搭建,毕竟已经自带了