frp - 内网穿透

frp服务端和客户端部署,穿透内网远程连接内网设备。以腾讯云服务器(Ubuntu)、香橙派(Armbian)、小米路由器3(Padavan)为例。

原理

frp - Github

我们部署在内网的设备,由于防火墙或动态IP等原因,外网是一般访问不到的。那么我们希望穿透内网,从外网访问该怎么操作呢?一般有以下几种方式:DDNS动态域名解析+路由器端口映射、Ngrok、Frp…

Ngrok和Frp的原理其实是差不多的,相比之下,Frp的部署更简单,使用效率更高,所有这里就介绍Frp的部署了。

通过在服务器(外网)和内网设备(内网)上分别部署Frp服务端和客户端,内网的客户端会反向连接外网的服务端,从而建立连接。然后我们只需访问外网服务器地址即可重定向到内网设备,从而达到目的。这里的服务器可以充当桥梁的作业。本篇将介绍如何在服务器和内网设备上部署Frp,没有服务器的朋友可以去网上搜索现成的Frp服务器使用,一般是免费的。

服务端 - 腾讯云服务器(Ubuntu)

这里用到一个脚本来方便部署。

wget --no-check-certificate https://raw.githubusercontent.com/clangcn/onekey-install-shell/master/frps/install-frps.sh -O ./install-frps.sh    #下载脚本
chmod 755 ./install-frps.sh #赋予权限
./install-frps.sh install #安装脚本

然后脚本开始运行,会让你输入一些配置,直接回车是默认配置。

Please input frps bind_port [1-65535](Default Server Port: 5443):[7000]

#输入frp提供服务的端口,用于服务器端和客户端通信

Please input frps vhost_http_port [1-65535](Default vhost_http_port: 80):[7080]

#输入frp进行http穿透的http服务端口,建议修改防止冲突呀

Please input frps vhost_https_port [1-65535](Default vhost_https_port: 443):[70443]

#输入frp进行https穿透的https服务端口,建议修改防止冲突呀

Please input frps dashboard_port [1-65535](Default dashboard_port: 6443):[7081]

#输入frp的控制台服务端口,用于查看frp工作状态

Please input dashboard_user (Default: admin):[admin]

#登录控制台的用户名

Please input dashboard_pwd (Default: kpkpM7VZ):[admin]

#登录控制台的密码

Please input privilege_token (Default: 9m2UAOWa6hx5Eise):[admin]

#Frp服务端和客户端的通信密码

下面的内容都是默认即可

到此服务端安装完成。

Frp服务端

综上可知,服务端配置如下:

[common]
bind_addr = 0.0.0.0
bind_port = 7000
subdomain_host = zhaoo.cc #后面加的,配置域名
kcp_bind_port = 7000
dashboard_port = 7081
dashboard_user = admin
dashboard_pwd = admin
vhost_http_port = 7080
vhost_https_port = 70443
log_file = ./frps.log
log_level = info
log_max_days = 3
privilege_token = admin
max_pool_count = 50
tcp_mux = true

从配置可以看到,我又加了条主域名配置,在之后的客户端我们可以再配置子域名。配置域名后不会生效,需要添加解析:泛解析,*.zhaoo.cc和空解析,@.zhaoo.cc

使用命令:

/etc/init.d/frps start    #启动
/etc/init.d/frps stop #关闭
/etc/init.d/frps restart #重启
/etc/init.d/frps status #查看状态
/etc/init.d/frps config #查看配置
/etc/init.d/frps version #查看版本
./install-frps.sh update      #更新
./install-frps.sh uninstall #卸载
./install-frps.sh config #修改配置

开启Frp服务器后,访问http:服务器IP:7081可访问Frp控制台。

Tips: 服务器如果开启了防火墙,别忘了放行以上端口哦。我用了宝塔面板,老是忘了这一茬。

客户端 - 香橙派(Armbian)

安装Frpc

下面在香橙派上部署Frp客户端,树莓派用的是arm的cpu,所以我们要下载arm版的。

wget https://github.com/fatedier/frp/releases/download/v0.18.0/frp_0.18.0_linux_arm.tar.gz    #下载Frp,amd版本
tar -zxvf frp_0.18.0_linux_arm.tar.gz #解压
cd frp_0.18.0_linux_arm.tar.gz #移动到frp目录
sudo vim frpc.ini #编辑配置

详细配置见下表:

注:打"*"的说明要和服务器上的配置一致

#基础配置
[common]
server_addr = 服务器IP #服务器IP
server_port = 7000 #服务器通信端口 *
privilege_token = admin #服务器通信密码 *
login_fail_exit = false #后续设置自动启动使用

#ssh配置
[ssh]
type = tcp #tcp方式
local_ip = 127.0.0.1 #本地IP
local_port = 22 #本地端口
remote_port = 7122 #远程连接端口

#http配置
[http]
type = http #http方式
local_ip = 127.0.0.1 #本地IP
local_port = 80 #本地地址
subdomain = opi #子域名

#https配置
[https]
type = https #https方式
local_ip = 127.0.0.1 #本地IP
local_port = 443 #本地地址
custom_domains = opi #子域名
安装Systemd自动启动Frp

客户端的Frp在香橙派每次重启后都要命令开启一下,那势必要在内网先连接ssh,很麻烦。所以安装Systemd,在香橙派每次开机时都能自动启动Frp服务。

apt-get install systemd    #安装systemd
apt-get install systemd-sysv #安装systemd

下面需要配置Grub文件,在开机时自动运行Systemd。

sudo vim /etc/default/grub    #编辑grub

写入以下内容:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash init=/lib/systemd/systemd"

保存并重启一下。

编辑Syetemd配置来自启动Frp

cd 到frpc目录下
cp frpc /usr/local/bin/frpc #复制frpc文件到系统目录
mkdir /etc/frp #系统目录下新建frp文件夹
cp frpc.ini /etc/frp/frpc.ini 复制frpc配置文件
vim /usr/lib/systemd/system/frpc.service #编辑frpc.service文件,敲入以下命令:
[Unit]
Description=frpc
After=network.target

[Service]
TimeoutStartSec=30
ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.ini
ExecStop=/bin/kill $MAINPID

[Install]
WantedBy=multi-user.target
systemctl enable frpc    #启动frp并设置开机自启
systemctl start frpc
systemctl status frpc

Tips: frpc启动无效时,可以尝试先停止服务: systemctl stop frpc

到此,香橙派上的Frp客户端配置完成,树莓派啊各种派配置也是一样的。

连接说明
SSH: IP地址 -> opi.zhaoo.cc    端口 -> 7122
HTTP: http://opi.zhaoo.cc:7180
HTTPS: https://opi.zhaoo.cc:71433

客户端 - 小米路由器3(Padavan)

参考 – 小米路由器3 – 烧录Padavan固件

参考 – 小米路由器3 – Padavan固件

我给小米路由器3刷了Padavan,自带Frp功能,所以就直接配置了。

小米路由器3-frp

启用前先更新一下Frp版本,确保和服务端的版本一致,否则无法建立通信。然后只需在脚本处填写配置即可,我的配置如下:

#基础配置
[common]
server_addr = zhaoo.cc #IP地址(直接写IP也可以)
server_port = 7000
privilege_token = admin

#Web配置(Hexo轻博客)
[mirt-web]
type = http
local_ip = 192.168.1.1
local_port = 80
use_gzip = true #启用gzip压缩
subdomain = mirt #子域名

#SSH配置
[mirt-ssh]
type = tcp
local_ip = 192.168.1.1
local_port = 22
remote_port = 7222

#Web后台配置
[mirt-admin]
type = tcp
local_ip = 192.168.1.1
local_port = 81 #本地端口我改成了81,防止和web的80端口冲突。
remote_port = 7281

#KODE文件管理系统配置
[mirt-kode]
type = tcp
local_ip = 192.168.1.1
local_port = 82
remote_port = 7282

解释一下:Frp一个子域名下只能穿透一条http或htpps线路,而tcp线路却可以有多条。我们路由器上有许多Web服务需要穿透(轻博客、后台、KODE文件管理系统……),所以这里我们就采取曲线救国的方式,将其他Web线路配置成tcp方式,访问的时候跟上对应的远程端口即可。

保存配置

写入配置脚本后,点击下方的应用本页面设置,再重启一下Frp服务,通信即建立。

连接说明
SSH: IP地址 -> mirt.zhaoo.cc    端口 -> 7222
博客: http://mirt.zhaoo.cc:7080
路由器后台: http://mirt.zhaoo.cc:7081
KODE文件管理系统: http://mirt.zhaoo.cc:7082

Nginx反向代理

按照之前的配置,如果我要访问小米路由器3上搭建的Hexo博客,那么需要访问的地址是mirt.zhaoo.cc:7080,需要跟上个端口号。哪有人访问Web页面还得加个端口号的,况且这样也不利于SEO。所以我们用到Nginx反向代理这项技术,将7080🇨🇳端口反代到80端口上。

我服务器安装了宝塔面板,可以很直观的设置反向代理,这里仅做个演示。没安装的朋友用命令行配置也是没问题的,具体问度娘。
在宝塔面板下新建网站,绑定域名,然后设置。

宝塔面板-新建网站

然后在反向代理子目录下设置目标URL域名:frp端口号,我这就是http://mirt.zhaoo.cc:7080。设置好后开启反向代理。

设置反向代理

之后访问http://mirt.zhaoo.cc就可以直接访问到我的博客了。

Tips: 还可以在宝塔面板下配置https哦。这样博客就可以直接搭在小米路由器上了。emmm…我还是喜欢服务器…

参考文献

IT男的VPS系列教程 篇一:内网穿透(Frp)-拯救没有公网IP的你

借助 frp 随时随地访问自己的树莓派

查看评论