记录 frp 穿透 http 以及 ssh 服务的相关配置,以及 nginx 反代理 frp 的 http 到三级域名。
我的环境:
- 阿里云ECS
- OS: Ubuntu20.04
1. 服务端
官方 repo: fatedier/frp
下载:
# 下载
wget https://github.com/fatedier/frp/releases/download/v0.30.0/frp_0.30.0_linux_amd64.tar.gz
# 解压与删除安装包
tar -xzvf frp_0.30.0_linux_amd64.tar.gz && rm frp_0.30.0_linux_amd64.tar.gz
# 删除不需要的客户端程序与配置
cd frp_0.30.0_linux_amd64 && rm -rf frpc*
配置:
[common]
# 服务端地址,客户端连接时需要同一端口
bind_addr = 0.0.0.0
bind_port = 7000
# 虚拟端口,用户访问客户端时的端口号
vhost_http_port = 8080
vhost_https_port = 8443
# dashboard地址,可以查看frp状态
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
# 日志文件目录、过滤等级、最大天数
log_file = ./frps.log
log_level = trace
log_max_days = 3
# token 客户端需要相同的值
token = 12345678
# 允许的端口,逗号间隔,端口区间-间隔???
#allow_ports = 10000-50000
# 每个代理可以创建的最大连接数量,客户端代理中使用 pool_count 指定预创建的连接数量。
max_pool_count = 5
# 每个客户端最大使用端口数量
max_ports_per_client = 0
# 自定义到子级域名
subdomain_host = frp.yourdomain.com
这样如果有客户端连接后,访问其 http 的 url 为:sub.yourdomain.com:8080
,如果按下下面配置了 http 的反代理,则 url 为:sub.yourdomain.com
,保持默认就好。
上面配置文件修改后还需要在云服务里开放对应的端口入方向,如上面的 7000 和 7500 以及虚拟端口(上面的dashboard端口、虚拟端口都可以通过nginx代理)。
如果使用了二级域名则还需要配置域名解析,将 *.yourdomain.com 解析到服务器公网 ip。
服务端运行:
./frps -c ./frps.ini
以服务运行:
cp systemd/frps.service /lib/systemd/system
systemctl enable frps
2. nginx 反代理 frp 的 http 到三级域名
nginx 反代理 frp 的 http 或者 https 有两个好处:一是不需要在云主机上开启对应的端口的出入规则,二是每次输入 url 时不需要更改默认端口。
由于我主机上二级域名还有 jupyterhub 等服务,所以本次将其反代理到三级域名,过程如下:
新建 nginx 配置文件
# 在 sites-available 下创建配置文件
touch /etc/nginx/sites-available/frpserver.conf
# 创建软连接到 site-enabled
ln -s /etc/nginx/sites-available/frpserver.conf /etc/nginx/sites-enabled/frpserver.conf
# 编辑文件配置如下信息
vim /etc/nginx/sites-enabled/frpserver.conf
配置文件内容:
# 代理 frp dashboard
server {
listen 80;
server_name frp.brothereye.cn;
access_log /var/log/nginx/frpadmin.access.log;
error_log /var/log/nginx/frpadmin.error.log;
location / {
proxy_pass http://127.0.0.1:7445; # frp web http port
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
if ($http_user_agent ~* ".*spider.*|.*bot.*") {
return 403;
}
}
# 代理 frp http 客户端
server {
listen 80;
server_name *.frp.brothereye.cn;
access_log /var/log/nginx/frp.access.log;
error_log /var/log/nginx/frp.error.log;
location / {
# add_header Content-Type text/plain; # debug
# return 200 http://$host:8080; # debug
proxy_pass http://127.0.0.1:8080; # vhost http port
proxy_set_header Host $host:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_connect_timeout 7d;
proxy_send_timeout 7d;
proxy_read_timeout 7d;
}
if ($http_user_agent ~* ".*spider.*|.*bot.*")
{
return 403;
}
}
2. 客户端
官方repo: fatedier/frp release 中下载与服务端相同的版本即可。
http 以及 ssh 配置(官方最全配置:frpc_full.ini),新建文件 frpc_http_ssh.ini
写入以下内容:
[common]
# 服务端地址,填自己服务器 ip 和上面服务端设置的端口
server_addr = xxx.xxx.xxx.xxx
server_port = 7000
# 日志文件目录、过滤等级、最大天数
log_file = ./frpc.log
log_level = info
log_max_days = 3
# token 需要与服务端相同
token = 12345678
# 查看客户端连接信息
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin
# 预建立的连接数量
pool_count = 2
# 代理名字前缀,实际代理名为 {user}.{proxy}
user = user01
# 首次登陆到服务端失败则终止客户端程序
login_fail_exit = true
# 连接服务端的传输层协议。支持tcp, kcp, websocket
protocol = tcp
[web01]
type = http
local_ip = 127.0.0.1
local_port = 80
# 是否加密流量。开启后可绕过防火墙
use_encryption = false
# 是否压缩,开启后可以压缩报文但消耗 cpu
use_compression = true
# 访问客户端代理的网页时验证
http_user = admin
http_pwd = admin
# 子级域名前缀
subdomain = web01
# 自定义域名,自定义域名不能属于子级域名或者泛域名
#custom_domains = web02.yourdomain.com
# URL 路由,根据此前缀过滤请求转发到客户端,逗号间隔,仅支持http
locations = /
# 更改用户访问到的 host,仅支持 http
#host_header_rewrite = example.com
# 更改用户访问到的请求头
#header_X-From-Where = frp
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 2222
use_encryption = true
use_compression = true
注意:
frpc 中的健康检查(health_check开头)有时会无法验证心跳包,导致穿透失败,故不推荐加健 康检查,除非确认过健康检查可用。
运行:
./frpc -c ./frpc_http_ssh.ini
加上上面配置过的反代理,访问的完整 url 为: http://web01.frp.brothereye.cn
。
如果未配置 nginx 反代理则需要加主机中配置的 vhost_http_port,这里的具体 url 为: http://web01.frp.brothereye.cn:8080
其实tmux没有必要…现在下载下来的压缩包解压后有个systemd,更改下frps.service的配置然后把frps.service放到/etc/systemd/system中就可以方便管理了。
好的,谢谢啦。