用 frp 搭建内网穿透服务

由 三硝基豆腐 发布

犹记当年想搭建个人博客,想用内网穿透简单搭个本地服务器,结果大家都知道的,花生壳那些所谓的内网穿透真心搞笑,废话我也懒得说了。(当然有的还是很良心的,比如我记得有个叫做 Sakura frp 的,的确免费能用,当然免费的嘛速度就很捉急了)

现在疫情期间宅在家里无事可做,打算把以前的树莓派什么的折腾一下,然后又有一台闲置的硅谷 Ubuntu 服务器,就试了试搭建自己的内网穿透服务。

下面讲正题

使用文档

Github - 中文文档

请大致阅读,将有助于理解下文每条配置的含义

服务端

感谢 MvsCode 提供的一键安装脚本

Github 地址

安装过程中有几个值得注意的地方:

  • Bind port:走流量的端口
  • vhost http port:http web 网站走的端口(我用的默认 80)
  • vhost https port:https web 网站走的端口(我用的默认 443)
  • Dashboard port:安装后会有一个概览后台网页,这是它的访问端口
  • token:相当于是密码,只有客户端和服务端用同样的 token 才能获得代理权限

其它的看不懂什么意思就直接留空回车用默认的配置即可

安装完成后脚本将显示你的各项配置,建议复制至本地保存备忘

此时你可以用frps {start|stop|restart|status|config|version}来控制 frps

客户端

请去 Github - releases 中下载 frp

下载至本地后修改 frpc.ini

示例 1:自定义域名并访问内网 http web 服务

将 frpc.ini 修改为如下所示:

[common]
server_addr = 服务端 ip
server_port = 服务端 Bind port
token = 服务端 token

[web]
type = http
local_port = 本地 web 端口(通常是 80)
custom_domains = 自定义的域名(需添加 A 记录至服务端 ip)

保存后运行frpc -c frpc.ini,显示 success 后可通过服务端 ip:vhost http port(若 vhost http port 为 80 则可不加端口号)访问本地 web 服务

示例 2:转发 tcp 流量

[common]
server_addr = 服务端 ip
server_port = 服务端 Bind port
token = 服务端 token

[tcpproxy]
type = tcp
local_ip = 127.0.0.1
local_port = 本地 tcp 端口
remote_port = 远程访问端口

保存后运行frpc -c frpc.ini,显示 success 后可通过服务端 ip:远程访问端口访问本地 tcp 服务

值得注意的是,中括号中的webtcpproxy经过实验验证应该是可以随便怎么写的。

Ubuntu 客户端启用 frpc 服务,开机将自启动

首先tar -xzf解压压缩包

进入压缩包后执行以下代码:

chmod +x ./frpc
cp ./frpc /usr/bin/
mkdir /etc/frp
cp ./frpc.ini /etc/frp
cp ./systemd/frpc.service  /lib/systemd/system
systemctl enable frpc.service
service frpc start

附 2

我发现 frp 客户端的服务配置文件虽然有这么一行:

After=network.target

但是实际上服务并不会在网络真正连接后才启动,这会导致一些问题,比如连不上。

因此我们需要把这一行改成:

After=network-online.target

2 条评论

  1. UJSACCN
    UJSACCN · 2020-04-09 00:40

    用frp访问内网http的话,只能走http,不能走https,http就是在互联网上裸奔。应该可以用nginx反代frps的端口,然后开启TLS,这样可以实现frps到用户端的https,不过前半段就没办法了。
    还有,中括号里的内容,会显示在frps的面板里,方便识别。

  2. 冷曜
    冷曜 · 2020-03-20 08:45

    很棒的样子,有时间试试。有一说一,oray已经日暮西山,但是之前我用过它的忘记几块钱了的NAT,卡归卡,还不错哦

发表评论