Centos7 - frp内网穿透,访问内网web服务/访问内网websocket服务
frp
- Github地址:https://github.com/fatedier/frp
- Github发布包地址:https://github.com/fatedier/frp/releases
- 官方教程:https://github.com/fatedier/frp/blob/master/README_zh.md
1、外网服务器frp服务端配置(安装时最新版本0.32.1为例)
1.1 下载frp
使用
mkdir frp
命令创建一个新的文件夹frp,然后在文件夹下使用命令:
wget https://github.com/fatedier/frp/releases/download/v0.32.1/frp_0.32.1_linux_amd64.tar.gz
下载frp。
1.2 解压,并进入解压文件夹
tar -zxvf frp_0.32.1_linux_amd64.tar.gz
cd frp_0.32.1_linux_amd64/
1.3 删掉不必要的客户端文件
rm -rf frpc
rm -rf frpc.ini
1.4 编辑frps.ini文件
vi frps.ini
打开该文件,并将该文件内容修改为:
[common]
# 服务器端监听客户端连接请求的端口
bind_port = 7000
# 服务器端监听http请求的端口
vhost_http_port = 80(如果服务器上80端口已被占用,可随意修改为其他空闲端口)
# 授权码,请改成更复杂的
token = 52010 # 这个token之后在客户端会用到
# frp管理后台端口,请按自己需求更改
dashboard_port = 7500
# frp管理后台用户名和密码,请改成自己的
dashboard_user = admin
dashboard_pwd = admin
enable_prometheus = true
# frp日志配置
log_file = /var/log/frps.log
log_level = info
log_max_days = 3
保存退出。
1.5 防火墙开启相关端口
开启端口:
firewall-cmd --zone=public --add-port=7000/tcp --permanent
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=45635/tcp --permanent
重启防火墙:systemctl restart firewalld.service
1.6 启动服务的几种方式
1.6.1 正常启动
./frps -c ./frps.ini
1.6.2 使用nohup后台挂起服务
nohup ./frps -c frps.ini > ./log.txt 2>&1 &
日志输出到log.txt
1.6.3 制作一键启动sh脚本
1.6.3.1 启动脚本start.sh
#! /bin/bash
nohup ./frps -c frps.ini > log.txt 2>&1 &
echo $! >./pid.txt
1.6.3.2 停止脚本stop.sh
#! /bin/bash
PID=$(cat ./pid.txt)
kill -9 $PID
1.6.3.4 实时日志查看
tail -f ./log.txt
2、内网服务器frp客户端配置(安装时最新版本0.32.1为例)
2.1 下载
使用
mkdir frp
命令创建一个新的文件夹frp,然后在文件夹下使用命令:
wget https://github.com/fatedier/frp/releases/download/v0.32.1/frp_0.32.1_linux_amd64.tar.gz
下载frp。
2.2 解压,并进入解压文件夹
tar -zxvf frp_0.32.1_linux_amd64.tar.gz
cd frp_0.32.1_linux_amd64/
2.3 删掉不必要的客户端文件
rm -rf frps
rm -rf frps.ini
2.4 编辑frpc.ini文件
vi frpc.ini
打开该文件,并将该文件内容修改为:
[common]
server_addr = xx.xx.xx.xx(外网主机ip)
server_port = 7000
token = 52010 # 与frps.ini的token一致
# 配置ssh服务
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000 # 这个自定义,之后再ssh连接的时候要用
# 内网web服务,监听端口为80
[web]
type = http
local_port = 80
custom_domains = xx.xx.xx.xx(外网主机ip,和server_addr的相同,或者写域名,但是要做dns解析)
# websocket服务,端口假设为45635
[web01]
type = tcp
local_port = 45635
custom_domains = xx.xx.xx.xx(外网主机ip,和server_addr的相同,或者写域名,但是要做dns解析)
remote_port = 45635
保存退出。
2.5 防火墙开启相关端口
开启端口:
firewall-cmd --zone=public --add-port=7000/tcp --permanent
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=45635/tcp --permanent
重启防火墙:systemctl restart firewalld.service
2.6 启动服务的几种方式
2.6.1 正常启动
./frpc -c ./frpc.ini
2.6.2 使用nohup后台挂起服务
nohup ./frpc -c frpc.ini > ./log.txt 2>&1 &
日志输出到log.txt
2.6.3 制作一键启动sh脚本
2.6.3.1 启动脚本start.sh
#! /bin/bash
nohup ./frpc -c frpc.ini > log.txt 2>&1 &
echo $! >./pid.txt
2.6.3.2 停止脚本stop.sh
#! /bin/bash
PID=$(cat ./pid.txt)
kill -9 $PID
2.6.3.4 实时日志查看
tail -f ./log.txt
访问测试
- 分别开启远程主机frp服务,以及内网frp服务,保证相关端口已开启。
- frp内网穿透访问内网web服务:xx.xx.xx.xx:80
- frp内网穿透访问内网websocket服务:xx.xx.xx.xx:45635
3.设置frp开机自启
- 3.1使用如下命令创建 frp 服务文件
sudo vim /etc/systemd/system/frp.service
- 3.2在其中填写下列内容
[Unit]
Description=frp startup script
After=network.target
After=systemd-user-sessions.service
After=network-online.target
[Service]
(在服务端填写下面这一行)
ExecStart=/home/{此处替换为你的用户名}/frp/frps -c /home/{此处替换为你的用户名}/frp/frps.ini
(在客户端填写下面这一行)
ExecStart=/home/{此处替换为你的用户名}/frp/frpc -c /home/{此处替换为你的用户名}/frp/frpc.ini
[Install]
WantedBy=multi-user.target
-
3.3保存并退出
-
3.4设置其权限为775
sudo chmod 775 /etc/systemd/system/frp.service
- 3.5输入如下命令使 frp 服务开机启动
sudo systemctl enable --now frp
附:1.nginx.conf
server {
# 监听的80端口
listen 80;
# 域名配置 记得一定要加上*.frp.xxx.net这个,只加frp.xxx.net是不行的,某运维大坑张XX在这坑我2天的时间
server_name * .frp.xxx.net frp.xxx.net;
location / {
proxy_pass http: //127.0.0.1:8080;
# 这个Host的header一定要加,不然转发后frp拿不到通过哪个域名访问的,导致转发失败
proxy_set_header Host $host;
}
}
2.用nginx转发后无法连接websocket
#将/xcloud-api请求转发给http://127.0.0.1:8012处理
location /xcloud-api {
proxy_pass http://127.0.0.1:8012/xcloud-api; #这里的端口记得改成项目对应的哦
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Origin "";
proxy_redirect off;
}
主要是这三个配置
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “upgrade”;
proxy_set_header Origin “”;