frp介绍
frp 是一个开源、简洁易用、高性能的内网穿透和反向代理软件,支持 tcp, udp, http, https等协议。frp 项目官网是 /fatedier/frp,
frp工作原理
服务端运行,监听一个主端口,等待客户端的连接;
客户端连接到服务端的主端口,同时告诉服务端要监听的端口和转发类型;
服务端fork新的进程监听客户端指定的端口;
外网用户连接到客户端指定的端口,服务端通过和客户端的连接将数据转发到客户端;
客户端进程再将数据转发到本地服务,从而实现内网对外暴露服务的能力。
简单来说就是一台没有公网ip的服务器,利用有公网ip的服务器的ip。让这两台设备连接。然后把这两台看成是一台就行了。然后这个frp就相当于把它俩连接起来的工具。
可以先了解一下其他的知识,比如正向代理与反向代理。这篇文章其实讲的挺好的。vpn就使用了正向代理,frp中使用了反向代理。
2 配置教程
想要配置frp穿透,首先必须先要有一台有公网ip的服务器,主要得有公网ip(即:可以外网访问)的服务器。如果没有,接下来的教程就不用看了。配置教程主要分为两个部分,一是服务器端(外网服务器)的配置;二是客户端(内网服务器)配置。
1、下载frp
/fatedier/frp/releases
frp_0.38.0_linux_amd64.tar.gz是64位系统,frp_0.38.0_linux_386.tar.gz是32位系统,根据自已的云服务器去下载对应的frp文件。
2.解压压缩文件:
tar -zxvf frp_0.38.0_linux_amd64.tar.gz
mvfrp_0.38.0_linux_amd64 frp
mv frp /usr/local/
cd/usr/local/frp
frpc, frpc.ini , 因为包含c结尾代表client,是客户端所使用的,所以服务器端用不到可以删除掉,也可以不删除,没有影响。
然后配置frps.ini文件。
使用vim frps.ini修改文件
如下所示
[common]
# frp监听的端口,默认是7000,可以改成其他的
bind_port =7000
# 授权码,请改成更复杂的
#token = xd123456abc # 这个token之后在客户端会用到
# frp管理后台端口,请按自己需求更改
dashboard_port = 7500
# frp管理后台用户名和密码,请改成自己的
dashboard_user = xdadmin
dashboard_pwd = xdadmin
#vhost_http_port = 6001 #访问6001端口,映射到内网web服务
#vhost_https_port = 10443
#enable_prometheus = true
# frp日志配置
log_file = /usr/local/frp/log/frps.log
log_level = info
log_max_days = 3
dashboard_port是服务端仪表板的端口。开启后可使用ip+dashboard_port访问。
token是另外一个没有公网ip的电脑连接的密码。
dashboard_user和dashboard_pwd表示打开仪表板页面登录的用户名和密码.
bind_port表示用于客户端和服务端连接的端口.也就是没有ip电脑所要连接的端口.它俩绑在一起的绳子.
使用守护程序systemctl
在/lib/systemd/system文件夹下创建frps.service
vim frps.service
输入如下内容,保存退出。
[Unit]
Description=frp service
After=network.target
[Service]
TimeoutStartSec=30
ExecStart=#frp绝对路径#/frps -c #frp绝对路径#/frps.ini
ExecStop=/bin/kill $MAINPID
[Install]
WantedBy=multi-user.target
启动服务
systemctl start frps
服务开机自启动
systemctl enable frps
服务器上最终的配置
[Unit]
Description=frp service
After=network.target
[Service]
TimeoutStartSec=30
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.ini
ExecStop=/bin/kill $MAINPID
[Install]
WantedBy=multi-user.target
验证服务端是否启动成功
访问:http://服务器IP:后台管理端口” ,输入用户名和密码可以查看连接状态
如:http://62.244.114.4:7500/,用户名和密码分别对应frps.ini文件中的dashboard_user和dashboard_pwd
登录之后界面如下:
如果上述步骤没有问题,则说明frp的服务端配置成功了,也就意味着内网穿透你已经成功了一半!!!
但是要提前到你买的官网打开这个可以访问的端口(我的是阿里云的服务器)(如何开放端口百度查询即可)如图:我的已经添加7000端口和3389端口
阿里云开放端口,在云服务器--->ECS安全组--->配置规则
还需要iptables或者fillwalld放开相关的端口
iptables
vim /etc/sysconfig/iptables
#自定义frp内网穿透端口
-A INPUT -p tcp -m state --state NEW -m tcp --dport 7000 -j ACCEPT
#frp管理后台端口
-A INPUT -p tcp -m state --state NEW -m tcp --dport 7500 -j ACCEPT
重启 iptables 防火墙服务
# systemctl restart iptables.service
fillwalld
那怎么开启一个端口呢
添加
firewall-cmd--zone=public--add-port=80/tcp--permanent (--permanent永久生效,没有此参数重启后失效)
重新载入
firewall-cmd--reload
查看
firewall-cmd--zone=public--query-port=80/tcp
删除
firewall-cmd--zone=public--remove-port=80/tcp--permanent
测试地址:http://182.92.232.14:7500/static/#/
客户端相关配置(也就是另外一台内网的服务器)
解压压缩文件:
tar -zxvf frp_0.38.0_linux_amd64.tar.gz
mvfrp_0.38.0_linux_amd64 frp
mv frp /usr/local/
cd/usr/local/frp
因为是客户端所以编辑包含c的文件
然后配置frpc.ini文件。
使用vim frpc.ini修改文件
如下所示
[common]
server_addr = 公网ip
server_port = 7000
[ssh]
type = tcp
local_ip = 192.168.1.88
local_port = 22
remote_port = 6000
[web1]
type = tcp
local_ip=192.168.1.88 #这个地方是没有公网ip的服务器地址
local_port = 80 #这个地方是没有公网ip的服务器部署的服务的端口
remote_port=8080 #绑定的远程有公网ip的服务器的端口
# frp日志配置
log_file = /usr/local/frp/log/frpc.log
log_level = info
log_max_days = 3
客户端配置
[common]
server_addr = 公网ip
server_port = 7000
[ssh]
type = tcp
local_ip=192.168.1.88
local_port = 22
remote_port=6000
查看frpc.ini配置文件(C代表客户端),在命令窗口直接输入frpc.ini即可打开。server_addr = 114.119.110.120是你买的服务器的公网IP要对应上。
server_port= 7000是监听端口与服务器的bind_port对应一致。local_port = 22,remote_port = 6000是在买服务器的官网开通的可访问端口。
最终配置
[common]
server_addr =182.92.232.14
server_port =7000
[ssh]
type = tcp
local_ip = 192.168.1.88
local_port = 22
remote_port = 6000
[web]
type = tcp
local_ip = 192.168.1.88
#访问本地80web服务
local_port = 80
#必须已经备案
custom_domains =
# frp日志配置
log_file = /usr/local/frp/log/frpc.log
log_level = info
log_max_days = 3
注意:代理端口好像限制最大8888(remote_port)
使用守护程序systemctl
在/lib/systemd/system文件夹下创建frpc.service
vim frpc.service
输入如下内容,保存退出。
[Unit]
Description=frp service
After=network.target
[Service]
TimeoutStartSec=30
ExecStart=/usr/local/frp/frpc-c/usr/local/frp/frpc.ini
ExecStop=/bin/kill $MAINPID
[Install]
WantedBy=multi-user.target
启动服务
systemctl start frpc
服务开机自启动
systemctl enable frpc
最终实验的最终版本
服务端部分
vim frps.ini
[common]
# frp监听的端口,默认是7000,可以改成其他的
bind_port = 7000
authentication_method = token
# 授权码,请改成更复杂的
token = xd123456abc
# 这个token之后在客户端会用到
# frp管理后台端口,请按自己需求更改
dashboard_port = 7500
# frp管理后台用户名和密码,请改成自己的
dashboard_user = xdadmin
dashboard_pwd = xdadmin
# 访问10080端口,映射到内网web服务
#vhost_http_port = 10080
#vhost_https_port = 10443
#enable_prometheus = true
# frp日志配置
log_file = /usr/local/frp/log/frps.log
log_level = info
log_max_days = 3
客户端部分
vim frpc.ini
[common]
server_addr = 182.92.232.14
server_port = 7000
authentication_method = token
token = xd123456abc
[ssh]
type = tcp
local_ip = 192.168.1.88
local_port = 22
remote_port = 6000
[web]
type = tcp
local_ip = 192.168.1.88
local_port = 80
#访问本地80web服务
remote_port = 8080
custom_domains =
#必须已经备案
# frp日志配置
log_file = /usr/local/frp/log/frpc.log
log_level = info
log_max_days = 3
注意需要阿里云和防火墙开放需要的哪些端口,不然还是没有办法访问的
访问web服务的时候
type=tcp
如果是type=http的话,访问不了
测试访问
现在访问服务器IP:访问内部的ssh端口 就可以访问内网的设备
比如我现在要访问我内网的设备就访问:182.92.232.14:6000
连接成功
frp如何加token?
在 frps.ini 和 frpc.ini中均添加
authentication_method = token
token = changeit