frp 内网穿透 Github 地址 https://github.com/fatedier/frp
下载机型对应的版本
或者 Linux上执行(版本号 0.36.0 自行更换) --no-check-certificate 参数是取消 HTTPS 的证书验证
wget https://github.com/fatedier/frp/releases/download/v0.36.0/frp_0.36.0_linux_amd64.tar.gz --no-check-certificate
解压后:
tar -zxvf frt_xxxxx.tar.gz
服务端放在公网上,保证 网络中能访问
服务端配置详解:
[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 # 心跳检测超时时间,不建议修改默认配置,默认值为90;? heartbeat_timeout = 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只对同意客户端的连接进行复用;
如: 阿里云中配置服务端:
[common] bind_port=7000 # frp服务端可视化界面管理控制面板相关配置 dashboard_port=9527
# 可视化管理界面的登录用户 dashboard_user=behelpful
# 可视化管理界面的登录密码 dashboard_pwd=behelpful9527
# 客户端与服务端连接认证密码 token = behelpful@8888
启动:在启动文件当前路径下
nohup /opt/frp/frps -c /opt/frp/frps.ini >/dev/null 2>&1 &
[root@izj6chfur6qfa919i2o7shz frp]# nohup ./frps -c frps.ini >/dev/null 2>&1 &
客户端配置详解
[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
如本地 Linux 电脑配置 ES 分享给外网使用,为了方便管理,被代理的 机器 服务的端口号映射外界的端口号为一致,方便记忆使用
[common]
# 服务端的链接信息,密码,IP ,端口 token = behelpful@8888 server_addr = 192.168.xx.xxx server_port = 7000 # 客户端可视化管理界面的 IP (127.0.0.1 就行了,当然如下写具体 IP 也是可以的) 端口 admin_addr = 192.168.xx.xxx admin_port = 9527
# 代理 ES [behelpful-es] type = tcp local_ip = 192.168.xx.xxx local_port = 9200 remote_port = 9200
# 代理 Kibana [kibana] type = tcp local_ip = 192.168.xx.xxx local_port = 5601 remote_port = 5601
启动:在启动文件当前路径下执行
[root@agent2 frp]# nohup ./frpc -c frpc.ini >/dev/null 2>&1 &
添加开机启动
在路径:/etc/init.d 添加一个启动脚本,如: frpc
解释:服务必须在运行级2,3,4,5下被启动或关闭,启动的优先级是90,关闭的优先级是10。优先级范围是0-100,数字越大,优先级越低;
# chkconfig: 2345 90 10 # description: 内网穿透frpc 客户端启动 nohup /opt/frp/frpc -c /opt/frp/frpc.ini >/dev/null 2>&1 &
授权:
[root@behelpful]# chmod +x /etc/init.d/frpc
添加到chkconfig,开机自启动
[root@behelpful]# chkconfig --add frpc
Windows 系统下使用案例( Windows系统中的禅道分享公网使用)
[common] # FRP 服务端密码 token = behelpful@8888# 服务端连接地址 server_addr = xx.xx.xx.xx # 服务端端口号 server_port = 7000 # 管理用的 admin_addr = 127.0.0.1 admin_port = 9527 [zentao] type = tcp local_ip = 127.0.0.1 local_port = 10086 remote_port = 10086
启动:在启动文件当前路径下
C:\FRP>.\frpc.exe -c c:\FRP\frpc.ini
服务端 管理视图化界面: http://xxx.xxx.xxx:9527 ---->>> 输入配置文件中配置的 用户名:behelpful,密码:behelpful@8888
客户端管理界面(局域网中访问):http://192.168.0.1:9527 / http://192.168.0.12:9527
补充:Windows 开机自启动 frp 服务 (推荐方式: https://diannaobos.com/post/405.html)
在目录 : C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 下创建一个开机启动脚本 frp.vbs (名字自定义,拓展名 必须 .vbs)
内容为 运行 frp 命令:
run "cmd /c 启动程序的路径 -c 启动程序配置文件的路径"
Set ws = CreateObject("Wscript.Shell") ws.run "cmd /c D:\Tools\FRP\frpc.exe -c D:\Tools\FRP\frpc.ini",vbhide
重点:
docker版运行 frp:
方式一:
手动下载 GitHub 上的 frp tar包文件上传到 Linux 系统中(网络环境不佳的方式,一段时间GitHub访问特别困难,使用此方式)
将下载好的 tar 包文件,和编写好的配置文件 frps.ini(服务端为例子)放入 Dockerfile 同一个目录下,切记同一个目录下,或者只要符合 COPY 的原则即可
编写Dockerfile (手动下载的 0.36.0 版本)
FROM centos MAINTAINER Alay<chxlay@gmail.com> # 将GitHub 下载的 frp 文件拷贝到 Dockerfile 同一个路径下 COPY frp_0.36.0_linux_amd64.tar.gz /opt/frp_0.36.0_linux_amd64.tar.gz RUN set -x \ && cd /opt \ && tar -zxvf frp_0.36.0_linux_amd64.tar.gz \ && mv frp_0.36.0_linux_amd64 frp/ # 由于运行时配置文件加载位置为:./conf 路径下,所以为以下COPY 配置文件准备配置文件目录 RUN mkdir /opt/frp/conf/ -p \ # 服务端配置文件由本地拷贝到容器(二选一即可) # COPY frps.ini /opt/frp/conf/frps.ini # 挂载配置文件路径到宿主机,挂载与上面的复制配置文件到容器内(二选一即可)推荐 VOLUME /opt/frp/conf # 设置当前工作目录 WORKDIR /opt/frp # 服务端暴露的端口号 EXPOSE 7000 # 管理页面暴露的端口号 EXPOSE 9527 # 启动 frp 服务的命令,客户端则改为 frpc即可 ENTRYPOINT ./frps -c frps.ini
构建:
docker build -t="behelpful/frps" .
运行(不挂载与挂载二选一)
docker run -d --name frps --restart=always -p 7000:7000 -p 9527:9527 a77a0e3bd382
docker run -it --name frps --restart=always -v /opt/frp:/opt/frp/conf -p 7000:7000 -p 9527:9527 a77a0e3bd382
方式二:
联网下载 GitHub 上的 frp tar包(网络环境不错的方式)
任意目录下均可执行
FROM centos MAINTAINER Alay<chxlay@gmail.com> ARG FRP_VERSION=0.36.0 # 安装工具,下面用完后移除 RUN yum -y install wget # 安装此工具是解决 wget https 时 Unable to establish SSL connection.报错 # 同时 wget 需要携带参数:--no-check-certificate RUN yum -y install openssl # 创建临时工作目录,下载 frp tar包文件的 WORKDIR /tmp RUN set -x \ && wget https://github.com/fatedier/frp/releases/download/v${FRP_VERSION}/frp_${FRP_VERSION}_linux_amd64.tar.gz --no-check-certificate \ && tar -zxvf frp_${FRP_VERSION}_linux_amd64.tar.gz \ && mv frp_${FRP_VERSION}_linux_amd64 /opt/frp/ \ && yum remove -y wget \ && yum remove -y openssl \ && yum autoremove -y # 由于运行时配置文件加载位置为:./conf 路径下,所以为以下COPY 配置文件准备配置文件目录 RUN mkdir /opt/frp/conf/ -p # 服务端配置文件由本地拷贝到容器(二选一即可) # COPY frps.ini /opt/frp/conf/frps.ini # 挂载配置文件路径到宿主机,挂载与上面的复制配置文件到容器内(二选一即可)推荐 VOLUME /opt/frp/conf # 服务端暴露的端口号 EXPOSE 7000 # 管理页面暴露的端口号 EXPOSE 9527 # 设置当前工作目录 WORKDIR /opt/frp ENTRYPOINT ./frps -c ./conf/frps.ini
构建、运行 等和方式同步执行
方式三(强烈推荐):
docker-compose 方式,这里以网络方式下载 GitHub 中 frp 的 tar 包文件(网络环境不好的自行改为本地 COPY 模式)
编写 Dockerfile
FROM centos MAINTAINER Alay<chxlay@gmail.com> ARG FRP_VERSION=0.36.0 # 安装工具,下面用完后移除 RUN yum -y install wget # 安装此工具是解决 wget https 时 Unable to establish SSL connection.报错 # 同时 wget 需要携带参数:--no-check-certificate RUN yum -y install openssl # 创建临时工作目录,下载 frp tar包文件的 WORKDIR /tmp RUN set -x \ && wget https://github.com/fatedier/frp/releases/download/v${FRP_VERSION}/frp_${FRP_VERSION}_linux_amd64.tar.gz --no-check-certificate \ && tar -zxvf frp_${FRP_VERSION}_linux_amd64.tar.gz \ && mv frp_${FRP_VERSION}_linux_amd64 /opt/frp/ \ && yum remove -y wget \ && yum remove -y openssl \ && yum autoremove -y # 由于运行时配置文件加载位置为:./conf 路径下,所以为以下COPY 配置文件准备配置文件目录 RUN mkdir /opt/frp/conf/ -p # 服务端配置文件由本地拷贝到容器(二选一即可) # COPY frps.ini /opt/frp/conf/frps.ini # 挂载配置文件路径到宿主机,挂载与上面的复制配置文件到容器内(二选一即可)推荐 VOLUME /opt/frp/conf # 设置当前工作目录 WORKDIR /opt/frp VOLUME /opt/frp ENTRYPOINT ./frps -c ./conf/frps.ini
创建 docker-compose.yml 文件进行管理容器(以下是 Dockerfile 和 docker-compose.yml 在同一个目录下 context: ./ )
version: '2' services: frps: # 构建 Docker 镜像 build: # 构建的上下文参数路径,相对 docker-compose.yml 的路径 context: ./ # 指定Dockerfile 文件相当于 docker build -f 只有一个Dockerfile 的时候可以省略不写 dockerfile: Dockerfile image: alay/frps:latest container_name: frps ports: # 服务端的端口号,需要容器重映射到宿主机 - 7000:7000 # 服务端管理页面的端口号,需要容器重映射到宿主机 - 9527:9527 # 每增加一个客户端代理的端口都需要进行映射暴露给宿主机 - 20031:20031 # 这里没有其他容器访问,不需要暴露 link 端口号给其他容器 # expose: # - 80 # - 443 # 挂载容器卷给宿主机 volumes: - /opt/frp:/opt/frp/conf # 开机自动启动容器 restart: always # 如果没有域名绑定的,需要删除下面的配置 environment: # 指定需要绑定的域名 VIRTUAL_HOST: ''
运行 指定运行 frps ,如果不指定则 docker-compose.yml 文件中所有的 service 全部启动, -d 是不打印日志后台启动,省略 -d 的话打印日志依然后台启动
docker-compose up -d frps
客户端依葫芦画瓢,frps --- 改为 ---->>> frpc ,其他的大同小异,自行实现即可