- 内网穿透需求
有一台在局域网内的服务器,外网无法访问,利用VPS或者具有公网IP的实体机进行转发,实现局域网外访问该服务器。本次配置局域网和公网系统均为Linux(ubuntu 16.04)。 - 需要准备VPS和frp软件
Server 1:校内服务器,外网无法访问;
Server 2:具有公网IP的VPS(腾讯云、华为云或阿里云等);
frp软件:可在其GitHub按照系统版本下载。 - 软件下载与安装
在服务端(server 1)和客户端(server 2)两个ubuntu系统均下载和解压frp。wget https://github.com/fatedier/frp/releases/download/v0.36.2/frp_0.36.2_linux_amd64.tar.gz
tar -zxvf frp_0.36.2_linux_amd64.tar.gz
mv frp_0.36.2_linux_amd64 frp
服务端(server 1)需要配置“frps.ini”文件;客户端(server 2)需要配置“frpc.ini”文件。
部署服务端
- 服务端配置
按照以下配置修改“frps.ini”文件: ```shell [common] bind_port = 9999 token = rQ/48M.t vhost_http_port = 10001 vhost_https_port = 10002
Web端口,账户、密码
dashboard_port = 10000 dashboard_user = admin dashboard_pwd = Tenng
> 如果没有必要,端口均可使用默认值,token、user和password项请自行设置。<br />-- “bind_port”表示用于客户端和服务端连接的端口,这个端口号我们之后在配置客户端的时候要用到。<br />-- “dashboard_port”是服务端仪表板的端口,若使用7500端口,在配置完成服务启动后可以通过浏览器访问 x.x.x.x:7500 (其中x.x.x.x为VPS的IP)查看frp服务运行信息。<br />-- “token”是用于客户端和服务端连接的口令,请自行设置并记录,稍后会用到。<br />-- “dashboard_user”和“dashboard_pwd”表示打开仪表板页面登录的用户名和密码,自行设置即可。
配置完成后,运行./frps -c frps.ini,会得到如下输出说明开启成功:
> 2021/03/29 03:02:05 [I] [root.go:200] frps uses config file: frps.ini
> 2021/03/29 03:02:05 [I] [service.go:192] frps tcp listen on 0.0.0.0:7000
> 2021/03/29 03:02:05 [I] [service.go:294] Dashboard listen on 0.0.0.0:7500
> 2021/03/29 03:02:05 [I] [root.go:209] frps started successfully
然后,可以运行nohup ./frps -c frps.ini &将程序放在后台。可以通过浏览器访问 x.x.x.x:7500 (其中x.x.x.x为VPS的IP)查看frp服务运行信息。
<a name="iO4P8"></a>
## 部署客户端
按照如下信息在server 2(内网)配置客户端:vim frpc.ini
```shell
[common]
server_addr = x.x.x.x
server_port = 9999
token = rQ/48M.t
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 20022
— “server_addr”为服务端IP地址,填入即可。
— “server_port”为服务器端口,填入你设置的端口号即可,如果未改变就是7000
— “token”是你在服务器上设置的连接口令,原样填入即可。
配置好后直接运行./frpc -c ./frpc.ini,输出如下说明运行成功。
2021/03/29 11:30:33 [I] [service.go:304] [d69b2a6a76e9aacd] login to server success, get run id [d69b2a6a76e9aacd], server udp port [0]
2021/03/29 11:30:33 [I] [proxy_manager.go:144] [d69b2a6a76e9aacd] proxy added: [ssh]
2021/03/29 11:30:33 [I] [control.go:180] [d69b2a6a76e9aacd] [ssh] start proxy success
然后直接nohup ./frpc -c frpc.ini &把程序放后台。
在外网时,直接运行ssh -oPort=20001 username_server1@x.x.x.x即可直接登录。
x.x.x.x 为服务端(server 2)的IP地址;username_server1为内网server 1中的用户名,输入的密码也为该用户密码。
supervisor管理
frps
cat << TenguWang > /etc/supervisord.d/frps.conf
[program:frps]
autorestart=true
user=root
directory=/opt/frp
priority=999
environment=
MAIN_CLASS="frps"
command=/bin/bash -c './${MAIN_CLASS} -c ${MAIN_CLASS}.ini'
autostart = true
stderr_logfile=/var/log/supervisor/frp/frps_stderr.log
stdout_logfile=/var/log/supervisor/frp/frps_stdout.log
stopsignal=INT
TenguWang
ftpc
cat << TenguWang > /etc/supervisord.d/frps.conf
[program:frpc]
autorestart=true
user=root
directory=/opt/frp
priority=999
environment=
MAIN_CLASS="frpc"
command=/bin/bash -c './${MAIN_CLASS} -c ${MAIN_CLASS}.ini'
autostart = true
stderr_logfile=/var/log/supervisor/frp/frpc_stderr.log
stdout_logfile=/var/log/supervisor/frp/frpc_stdout.log
stopsignal=INT
TenguWang
配置项详情
frps.ini配置文件详解
[common] # 通用配置段
bind_addr = 0.0.0.0 # 绑定的IP地址,支持IPv6,不指定默认0.0.0.0;
bind_port = 7000 # 服务端口;
bind_udp_port = 7001 # 是否使用udp端口,不使用删除或注释本行;
kcp_bind_port = 7000 # 是否使用kcp协议,不使用删除或注释本行;
# proxy_bind_addr = 127.0.0.1 # 代理监听地址,默认和bind_addr相同;
# 虚拟主机
vhost_http_port = 80 # 是否启用虚拟主机,端口可以和bind_port相同;
vhost_https_port = 443
vhost_http_timeout = 60 # 后端虚拟主机响应超时时间,默认为60s;
# 开启frps仪表盘可以检查frp的状态和代理的统计信息。
dashboard_addr = 0.0.0.0 # frps仪表盘绑定的地址;
dashboard_port = 7500 # frps仪表盘绑定的端口;
dashboard_user = admin # 访问frps仪表盘的用户;
dashboard_pwd = admin # 密码;
assets_dir = ./static # 仪表盘页面文件目录,只适用于调试;
# 日志配置文件
log_file = ./frps.log # 日志文件,不指定日志信息默认输出到控制台;
log_level = info # 日志等级,可用等级“trace, debug, info, warn, error”;
log_max_days = 3 # 日志保存最大保存时间;
token = 12345678 # 客户端与服务端通信的身份验证令牌
heartbeat_timeout = 90 # 心跳检测超时时间,不建议修改默认配置,默认值为90;?
# 指定允许客户端使用的端口范围,未指定则没有限制;
allow_ports = 2000-3000,3001,3003,4000-50000
max_pool_count = 5 # 每个客户端连接服务端的最大连接数;
max_ports_per_client = 0 # 每个客户端最大可以使用的端口,0表示无限制
authentication_timeout = 900 # 客户端连接超时时间(秒),默认为900s;
subdomain_host = frps.com # 自定义子域名,需要在dns中将域名解析为泛域名;
tcp_mux = true # 是否使用tcp复用,默认为true;
# frp只对同意客户端的连接进行复用;
frpc.ini配置文件详解
[common] # 通用配置段
server_addr = 0.0.0.0 # server的IP地址;支持IPv6
server_port = 7000 # server的端口;
# 如果要通过http或socks5代理连接frps,可以在此处或在全局环境变量中设置代理,只支持tcp协议;
# http_proxy = http://user:passwd@192.168.1.128:8080
# http_proxy = socks5://user:passwd@192.168.1.128:1080
# 客户端日志
log_file = ./frpc.log # 指定日志文件;
log_level = info # 指定日志等级;
log_max_days = 3
token = 12345678 # 客户端与服务端通信的身份验证令牌
# 设置管理地址,用于通过http api控制frpc的动作,如重新加载;
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_passwd = admin
pool_count = 5 # 初始连接池的数量,默认为0;
tcp_mux = true # 是否启用tcp复用,默认为true;
user = your_name # frpc的用户名,用于区别不用frpc的代理;
login_fail_exit = true # 首次登录失败时退出程序,否则连续重新登录到frps;
protocol = tcp # 用于连接服务器的协议,支持tcp、kcp、websocket;
dns_server = 8.8.8.8 # 为frp 客户端指定一个单独的DNS服务器;
# start = ssh,dns # 要启用的代理的名字,默认为空表示所有代理;
# 心跳检查
# heartbeat_interval = 30 # 失败重试次数
# heartbeat_timeout = 90 # 超时时间
# 配置示例
[ssh] # 代理配置段名称,如果配置user=your_name,则显示为your_name.ssh;
type = tcp # 协议默认tcp,可选tcp,udp,http,https,stcp,xtcp;
local_ip = 127.0.0.1 # 本地地址
local_port = 22 # 本地端口
use_encryption = false # 是否加密服务端和客户端的通信信息,默认为不加密;
use_compression = false # 是否开启压缩,默认不开启;
remote_port = 6001 # 在服务器端开启的远程端口;
# 负载均衡配置
group = test_group # 负载均衡组名,会将同一组内的客户端进行负载;
group_key = 123456 # 负载均衡组密钥;
# web示例
[web01]
type = http # 使用http
local_ip = 127.0.0.1
local_port = 80
use_encryption = false
use_compression = true
http_user = admin # 访问web01页面启用认证,用户名admin
http_pwd = admin # 密码
subdomain = web01 # 子域名,需要服务端配置了subdomain_host参数;
custom_domains = web02.example.com # web01的域名,和subdomain二选一
locations = /,/pic # 指定用于路由的URL前缀;
host_header_rewrite = example.com # 配置http包头域名重写;
header_X-From-Where = frp # 添加包头信息X-From-Where: frp;