• 内网穿透需求
    有一台在局域网内的服务器,外网无法访问,利用VPS或者具有公网IP的实体机进行转发,实现局域网外访问该服务器。本次配置局域网和公网系统均为Linux(ubuntu 16.04)。
  • 需要准备VPS和frp软件
    Server 1:校内服务器,外网无法访问;
    Server 2:具有公网IP的VPS(腾讯云、华为云或阿里云等);
    frp软件:可在其GitHub按照系统版本下载。
  • 软件下载与安装
    在服务端(server 1)和客户端(server 2)两个ubuntu系统均下载和解压frp。
    1. wget https://github.com/fatedier/frp/releases/download/v0.36.2/frp_0.36.2_linux_amd64.tar.gz
    2. tar -zxvf frp_0.36.2_linux_amd64.tar.gz
    3. 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

  1. > 如果没有必要,端口均可使用默认值,tokenuserpassword项请自行设置。<br />-- bind_port”表示用于客户端和服务端连接的端口,这个端口号我们之后在配置客户端的时候要用到。<br />-- dashboard_port”是服务端仪表板的端口,若使用7500端口,在配置完成服务启动后可以通过浏览器访问 x.x.x.x:7500 (其中x.x.x.xVPSIP)查看frp服务运行信息。<br />-- token”是用于客户端和服务端连接的口令,请自行设置并记录,稍后会用到。<br />-- dashboard_user”和“dashboard_pwd”表示打开仪表板页面登录的用户名和密码,自行设置即可。
  2. 配置完成后,运行./frps -c frps.ini,会得到如下输出说明开启成功:
  3. > 2021/03/29 03:02:05 [I] [root.go:200] frps uses config file: frps.ini
  4. > 2021/03/29 03:02:05 [I] [service.go:192] frps tcp listen on 0.0.0.0:7000
  5. > 2021/03/29 03:02:05 [I] [service.go:294] Dashboard listen on 0.0.0.0:7500
  6. > 2021/03/29 03:02:05 [I] [root.go:209] frps started successfully
  7. 然后,可以运行nohup ./frps -c frps.ini &将程序放在后台。可以通过浏览器访问 x.x.x.x:7500 (其中x.x.x.xVPSIP)查看frp服务运行信息。
  8. <a name="iO4P8"></a>
  9. ## 部署客户端
  10. 按照如下信息在server 2(内网)配置客户端:vim frpc.ini
  11. ```shell
  12. [common]
  13. server_addr = x.x.x.x
  14. server_port = 9999
  15. token = rQ/48M.t
  16. [ssh]
  17. type = tcp
  18. local_ip = 127.0.0.1
  19. local_port = 22
  20. remote_port = 20022

— “server_addr”为服务端IP地址,填入即可。
— “server_port”为服务器端口,填入你设置的端口号即可,如果未改变就是7000
— “token”是你在服务器上设置的连接口令,原样填入即可。

配置好后直接运行./frpc -c ./frpc.ini,输出如下说明运行成功。

  1. 2021/03/29 11:30:33 [I] [service.go:304] [d69b2a6a76e9aacd] login to server success, get run id [d69b2a6a76e9aacd], server udp port [0]
  2. 2021/03/29 11:30:33 [I] [proxy_manager.go:144] [d69b2a6a76e9aacd] proxy added: [ssh]
  3. 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

  1. cat << TenguWang > /etc/supervisord.d/frps.conf
  2. [program:frps]
  3. autorestart=true
  4. user=root
  5. directory=/opt/frp
  6. priority=999
  7. environment=
  8. MAIN_CLASS="frps"
  9. command=/bin/bash -c './${MAIN_CLASS} -c ${MAIN_CLASS}.ini'
  10. autostart = true
  11. stderr_logfile=/var/log/supervisor/frp/frps_stderr.log
  12. stdout_logfile=/var/log/supervisor/frp/frps_stdout.log
  13. stopsignal=INT
  14. TenguWang

ftpc

  1. cat << TenguWang > /etc/supervisord.d/frps.conf
  2. [program:frpc]
  3. autorestart=true
  4. user=root
  5. directory=/opt/frp
  6. priority=999
  7. environment=
  8. MAIN_CLASS="frpc"
  9. command=/bin/bash -c './${MAIN_CLASS} -c ${MAIN_CLASS}.ini'
  10. autostart = true
  11. stderr_logfile=/var/log/supervisor/frp/frpc_stderr.log
  12. stdout_logfile=/var/log/supervisor/frp/frpc_stdout.log
  13. stopsignal=INT
  14. TenguWang

配置项详情

  1. frps.ini配置文件详解
  2. [common] # 通用配置段
  3. bind_addr = 0.0.0.0 # 绑定的IP地址,支持IPv6,不指定默认0.0.0.0;
  4. bind_port = 7000 # 服务端口;
  5. bind_udp_port = 7001 # 是否使用udp端口,不使用删除或注释本行;
  6. kcp_bind_port = 7000 # 是否使用kcp协议,不使用删除或注释本行;
  7. # proxy_bind_addr = 127.0.0.1 # 代理监听地址,默认和bind_addr相同;
  8. # 虚拟主机
  9. vhost_http_port = 80 # 是否启用虚拟主机,端口可以和bind_port相同;
  10. vhost_https_port = 443
  11. vhost_http_timeout = 60 # 后端虚拟主机响应超时时间,默认为60s;
  12. # 开启frps仪表盘可以检查frp的状态和代理的统计信息。
  13. dashboard_addr = 0.0.0.0 # frps仪表盘绑定的地址;
  14. dashboard_port = 7500 # frps仪表盘绑定的端口;
  15. dashboard_user = admin # 访问frps仪表盘的用户;
  16. dashboard_pwd = admin # 密码;
  17. assets_dir = ./static # 仪表盘页面文件目录,只适用于调试;
  18. # 日志配置文件
  19. log_file = ./frps.log # 日志文件,不指定日志信息默认输出到控制台;
  20. log_level = info # 日志等级,可用等级“trace, debug, info, warn, error”;
  21. log_max_days = 3 # 日志保存最大保存时间;
  22. token = 12345678 # 客户端与服务端通信的身份验证令牌
  23. heartbeat_timeout = 90 # 心跳检测超时时间,不建议修改默认配置,默认值为90;?
  24. # 指定允许客户端使用的端口范围,未指定则没有限制;
  25. allow_ports = 2000-3000,3001,3003,4000-50000
  26. max_pool_count = 5 # 每个客户端连接服务端的最大连接数;
  27. max_ports_per_client = 0 # 每个客户端最大可以使用的端口,0表示无限制
  28. authentication_timeout = 900 # 客户端连接超时时间(秒),默认为900s;
  29. subdomain_host = frps.com # 自定义子域名,需要在dns中将域名解析为泛域名;
  30. tcp_mux = true # 是否使用tcp复用,默认为true;
  31. # frp只对同意客户端的连接进行复用;
  1. frpc.ini配置文件详解
  2. [common] # 通用配置段
  3. server_addr = 0.0.0.0 # server的IP地址;支持IPv6
  4. server_port = 7000 # server的端口;
  5. # 如果要通过http或socks5代理连接frps,可以在此处或在全局环境变量中设置代理,只支持tcp协议;
  6. # http_proxy = http://user:passwd@192.168.1.128:8080
  7. # http_proxy = socks5://user:passwd@192.168.1.128:1080
  8. # 客户端日志
  9. log_file = ./frpc.log # 指定日志文件;
  10. log_level = info # 指定日志等级;
  11. log_max_days = 3
  12. token = 12345678 # 客户端与服务端通信的身份验证令牌
  13. # 设置管理地址,用于通过http api控制frpc的动作,如重新加载;
  14. admin_addr = 127.0.0.1
  15. admin_port = 7400
  16. admin_user = admin
  17. admin_passwd = admin
  18. pool_count = 5 # 初始连接池的数量,默认为0;
  19. tcp_mux = true # 是否启用tcp复用,默认为true;
  20. user = your_name # frpc的用户名,用于区别不用frpc的代理;
  21. login_fail_exit = true # 首次登录失败时退出程序,否则连续重新登录到frps;
  22. protocol = tcp # 用于连接服务器的协议,支持tcp、kcp、websocket;
  23. dns_server = 8.8.8.8 # 为frp 客户端指定一个单独的DNS服务器;
  24. # start = ssh,dns # 要启用的代理的名字,默认为空表示所有代理;
  25. # 心跳检查
  26. # heartbeat_interval = 30 # 失败重试次数
  27. # heartbeat_timeout = 90 # 超时时间
  28. # 配置示例
  29. [ssh] # 代理配置段名称,如果配置user=your_name,则显示为your_name.ssh;
  30. type = tcp # 协议默认tcp,可选tcp,udp,http,https,stcp,xtcp;
  31. local_ip = 127.0.0.1 # 本地地址
  32. local_port = 22 # 本地端口
  33. use_encryption = false # 是否加密服务端和客户端的通信信息,默认为不加密;
  34. use_compression = false # 是否开启压缩,默认不开启;
  35. remote_port = 6001 # 在服务器端开启的远程端口;
  36. # 负载均衡配置
  37. group = test_group # 负载均衡组名,会将同一组内的客户端进行负载;
  38. group_key = 123456 # 负载均衡组密钥;
  39. # web示例
  40. [web01]
  41. type = http # 使用http
  42. local_ip = 127.0.0.1
  43. local_port = 80
  44. use_encryption = false
  45. use_compression = true
  46. http_user = admin # 访问web01页面启用认证,用户名admin
  47. http_pwd = admin # 密码
  48. subdomain = web01 # 子域名,需要服务端配置了subdomain_host参数;
  49. custom_domains = web02.example.com # web01的域名,和subdomain二选一
  50. locations = /,/pic # 指定用于路由的URL前缀;
  51. host_header_rewrite = example.com # 配置http包头域名重写;
  52. header_X-From-Where = frp # 添加包头信息X-From-Where: frp;