- 内网穿透需求
有一台在局域网内的服务器,外网无法访问,利用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.gztar -zxvf frp_0.36.2_linux_amd64.tar.gzmv 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.xserver_port = 9999token = rQ/48M.t[ssh]type = tcplocal_ip = 127.0.0.1local_port = 22remote_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=trueuser=rootdirectory=/opt/frppriority=999environment=MAIN_CLASS="frps"command=/bin/bash -c './${MAIN_CLASS} -c ${MAIN_CLASS}.ini'autostart = truestderr_logfile=/var/log/supervisor/frp/frps_stderr.logstdout_logfile=/var/log/supervisor/frp/frps_stdout.logstopsignal=INTTenguWang
ftpc
cat << TenguWang > /etc/supervisord.d/frps.conf[program:frpc]autorestart=trueuser=rootdirectory=/opt/frppriority=999environment=MAIN_CLASS="frpc"command=/bin/bash -c './${MAIN_CLASS} -c ${MAIN_CLASS}.ini'autostart = truestderr_logfile=/var/log/supervisor/frp/frpc_stderr.logstdout_logfile=/var/log/supervisor/frp/frpc_stdout.logstopsignal=INTTenguWang
配置项详情
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 = 443vhost_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-50000max_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地址;支持IPv6server_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 = 3token = 12345678 # 客户端与服务端通信的身份验证令牌# 设置管理地址,用于通过http api控制frpc的动作,如重新加载;admin_addr = 127.0.0.1admin_port = 7400admin_user = adminadmin_passwd = adminpool_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 # 使用httplocal_ip = 127.0.0.1local_port = 80use_encryption = falseuse_compression = truehttp_user = admin # 访问web01页面启用认证,用户名adminhttp_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;
