frp 是一套简单易配的内网穿透服务,能很方便的把内网服务映射到公网,使得公网也能轻易的访问内网的web、文件等,前提是得确保设置得端口不受防火墙保护。
1.下载
分别在服务器端跟需要访问得内网服务器下载 frp的对应版本 ,下载网址:
https://github.com/fatedier/frp/releases
Linux下载命令:
找到对应版本,鼠标右键复制下载链接地址,然后运行命令:
# wget 下载地址
wget https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz
如果报找不到wget:
-bash: wget: command not found
那么你就需要事先下载安装下:
yum install wget
实例下载:
[root@docker ~]# mkdir -p /usr/local/frp
[root@docker ~]# cd /usr/local/frp
[root@docker frp]# wget https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz
解压:
[root@docker frp]# tar -zxvf frp_0.33.0_linux_amd64.tar.gz
frp_0.33.0_linux_amd64/
frp_0.33.0_linux_amd64/frpc_full.ini
frp_0.33.0_linux_amd64/LICENSE
frp_0.33.0_linux_amd64/frpc.ini
frp_0.33.0_linux_amd64/frps.ini
frp_0.33.0_linux_amd64/frpc
frp_0.33.0_linux_amd64/frps_full.ini
frp_0.33.0_linux_amd64/frps
[root@docker frp]# ls
frp_0.33.0_linux_amd64 frp_0.33.0_linux_amd64.tar.gz
[root@docker frp]# mv frp_0.33.0_linux_amd64 frp
[root@docker frp]# ls
frp frp_0.33.0_linux_amd64.tar.gz
查看树形结构:
[root@docker frp]# tree frp
frp
├── frpc //客户端
├── frpc_full.ini
├── frpc.ini //客户端配置
├── frps //服务端
├── frps_full.ini
├── frps.ini //服务端配置
└── LICENSE
不难理解,其中的frpc代表frp client,也就是配置在内网客服端
类似的,frps则代表frp server, 也就是配置在公网服务端
2.公网服务器配置
在公网主机上配置服务端,也就是下载文件中的frps、frps.ini
frps.ini
[common]
#服务端口
bind_port = 7000
#监听地址
bind_addr = 0.0.0.0
#认证token
token = 123456
#http服务端口
vhost_http_port = 80 #一般可以直接设置80,那么就可以直接访问域名无需加端口
#https服务端口
vhost_https_port = 443 #一般可以直接设置443,那么就可以直接访问域名无需加端口
# 控制面板的端口、账号、密码
dashboard_port = 7500
dashboard_user = root
dashboard_pwd = admin
[web-http]
listen_port=80 #监听内网端口
[web-http02]
listen_port=80 #监听内网端口
[web-https]
listen_port=443 #监听内网端口
3.内网客户端配置
在内网主机上配置客户端,也就是下载文件中的frpc、frpc.ini
frpc.ini
[common]
server_addr = 112.113.114.115 #公网IP,自行设置成自己的服务端ip
server_port = 7000 #公网端口
token = 123456 #认证token,需要跟服务端的token保持一致
[ssh]
type = tcp
local_port = 22
local_ip = 127.0.0.1 # 本地局域网ip
# 在服务端注册端口 服务端将监听 7022 ssh [email protected] -p 7022 即可代理到本机 ssh 登录
remote_port = 7022
bandwidth_limit = 1MB #单位下载速度限制
[web-http]
# 远端服务器定义好了 http 服务的端口 这里不需要指定
# 只需要指定 custom/sub_domains 用来做路由即可
# 如果只是代理一台 则指定服务端ip 使用ip访问即可
type = http
local_port = 8888 #本地http服务端口
remote_port = 80 # 这个不能缺少,否者无法打开
local_ip = 127.0.0.1#本地http服务地址
# 或者指定域名 可以使用其他域名继续绑定
custom_domains = frp1.test.com # 这里的域名是公网ip解析的域名
[web-http02]
type = http
local_port = 8082 #本地http服务端口
local_ip = 127.0.0.1# 本地http服务地址
remote_port = 80 # 这个不能缺少,否者无法打开
# 直接使用服务端的公网ip绑定(这样一个frps只能代理一个http客户端)
custom_domains = frp2.test.com # 这里的域名是公网ip解析的域名
[web-https]
type = https
remote_port = 443 #远程端口
local_ip = 127.0.0.1
local_port = 443 # 本地端口
custom_domains = frp2.test.com
plugin = https2http
plugin_local_addr = 127.0.0.1:80
plugin_crt_path = ./server.crt
plugin_key_path = ./server.key
plugin_host_header_rewrite = 127.0.0.1
plugin_header_X-From-Where = frp
具体配置可参考git文档:https://github.com/fatedier/frp
一般https需要证书,而且比较麻烦,所以为了解决该问题,下面我们说一下利用cloudflare实现https加密
4.启动服务
服务端
- 服务端前台启动
[root@iZj6cfqhk4voeeejr9uygtZ frp]# ./frps -c ./frps.ini
2020/06/03 11:28:26 [I] [service.go:83] frps tcp listen on 0.0.0.0:7000
2020/06/03 11:28:26 [I] [service.go:108] http service listen on 0.0.0.0:6080
2020/06/03 11:28:26 [I] [main.go:112] Start frps success
2020/06/03 11:28:26 [I] [main.go:114] PrivilegeMode is enabled, you should pay more attention to security issues
以上提示则表示已经开启成功!!不过一般前台启动多用户调试使用,实际应该使用后台启动:
- 服务端后台启动
nohup ./frps -c ./frps.ini &
客户端
- 客户端前台启动
[root@docker frp]# ./frpc -c ./frpc.ini
2020/06/03 02:40:51 [I] [service.go:282] [e0a53f67512c167b] login to server success, get run id [e0a53f67512c167b], server udp port [0]
2020/06/03 02:40:51 [I] [proxy_manager.go:144] [e0a53f67512c167b] proxy added: [web-01 ssh web]
2020/06/03 02:40:51 [I] [control.go:179] [e0a53f67512c167b] [web-01] start proxy success
2020/06/03 02:40:51 [I] [control.go:179] [e0a53f67512c167b] [ssh] start proxy success
2020/06/03 02:40:51 [I] [control.go:179] [e0a53f67512c167b] [web] start proxy success
- 客户端后台启动:
nohup ./frpc -c ./frpc.ini &
5.测试访问
经过上面一顿配置操作,打开浏览器访问:
- frp1.test.com能成功访问内网:ip:8888的web项目
- frp2.test.com能成功访问内网:ip:8082的web项目。
到此就完成了内网穿透的配置以及开启!!!
6.遇到的坑以及注意事项
- 1.公网启动成功,内网启动报以下错误
[root@docker frp]# ./frpc -c ./frpc.ini
2020/06/02 23:34:39 [W] [service.go:101] login to server failed: dial tcp xx.xx.xx.xxx:7000: connect: connection timed out
这个错误一般要么是防火墙没开放端口、要么公网服务器那边未把指定端口加入安全组!
解决方案:
a) 防火墙开放端口
- 防火墙状态:
systemctl status firewalld.service
- 开启防火墙:
systemctl start firewalld.service
- 关闭防火墙
systemctl stop firewalld.service
- 查看已开放端口:
firewall-cmd --permanent --zone=public --list-ports
- 设置开放端口
firewall-cmd --zone=public --add-port=7000/tcp --permanent
- 重启防火墙
firewall-cmd --reload
b)云服务器开放端口
参考:https://blog.csdn.net/wsjzzcbq/article/details/88896214
- 2.客户端与服务端的frp的版本不一致
a) 客户端提示:
2020/06/02 23:57:28 [W] [service.go:101] login to server failed: EOF
EOF
b) 服务端提示:
2020/06/03 11:50:45 [W] [service.go:214] Accept new mux stream error: broken pipe
- 3.如果一开始是后台启动,修改配置再开启报frp已经存在,那么需要查看frp进程
ps -aux|grep frp| grep -v grep
杀死进程并重新开启frp服务即可!!!
frp服务端后台运行以及开机自启
一、frpc配置systemctl启动
1.创建systemctl配置文件:
vi /lib/systemd/system/frpc.service
2.配置文件填入以下配置信息:
[Unit]
Description=frpc service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
#启动服务的命令(此处写你的frpc的实际安装目录)
ExecStart=/usr/local/frp/frp/frpc -c /usr/local/frp/frp/frpc.ini
ExecReload=/usr/local/frp/frp/frpc reload -c /usr/local/frp/frp/frpc.ini
[Install]
WantedBy=multi-user.target
3.启动frpc
# 启动frps
systemctl start frpc
# 打开开机自启动
systemctl enable frpc
# 关闭开机自启动
systemctl disable frpc
# 重启应用
systemctl restart frpc
# 停止应用
systemctl stop frpc
# 查看应用的日志
systemctl status frpc
二、frps配置systemctl启动
类似frpc的配置,只不过是在外网服务器配置frps!!
三、systemctl常用方法
启动服务:systemctl start xxx.service
关闭服务:systemctl stop xxx.service
重启服务:systemctl restart xxx.service
显示服务的状态:systemctl status xxx.service
在开机时启用服务:systemctl enable xxx.service
在开机时禁用服务:systemctl disable xxx.service
查看服务是否开机启动:systemctl is-enabled xxx.service
查看已启动的服务列表:systemctl list-unit-files|grep enabled
查看启动失败的服务列表:systemctl --failed