使用frp以https方式穿透内网web服务 作者: 毕世平 时间: 2020-09-26 分类: 默认分类 > 前言:(摘自frp github readme)frp是一个专注于内网穿透的高性能的反向代理应用,支持tcp,udp,http和https等多种协议,可以将内网服务以安全、便捷的方式通过具有公网IP节点的中转服务器暴露到公网。 本文主要介绍使用`frp`将部署于内网机器下的`web http`服务通过公网机器以`https加密`的方式转发出去,即可以在外网下通过访问`https://frp.yourdomain.com:port`来访问到你部署于内网下的服务。 条件准备: - 一台内网下的linux设备,可以是树莓派、软路由 - 这台linux设备上已经部署好了http服务(比如路由器管理界面?) - 域名,且已经在cloudflare上添加解析,可以使用免费域名 - ssh客户端,winscp工具(传文件可能用到) # 一、获取ssl证书 这里假定你已经在cloudflare上添加了对域名的解析,假设域名是`frp.yourdomain.com`,假定你添加的A记录是`1.2.3.4`,也即你的公网机器是`1.2.3.4`。那么现在可以去获取cloudflare提供的免费证书了。 具体操作,如下图所示,cloudflare给分配的证书是支持`yourdomain.com和*.yourdomain.com`的: ![cf证书.png](https://shiping.date/usr/uploads/2020/09/3117688930.png) **说明**:将公钥内容复制下来,取名为`cf.crt`,私钥内容也复制下来,取名为`cf.key`,值得注意的是:cloudflare只会展示私钥内容这一次,下次打开只能看到公钥内容,所以一定要把私钥保存下来。 # 二、配置frp ## 2.1 配置frps服务端 你需要准备一个具有公网IP的机器,IP地址上面假设为`1.2.3.4`,下面是在这台机器上配置frps。 # 假定你的vps架构是x86_64,下载此包 wget https://github.com/fatedier/frp/releases/download/v0.34.0/frp_0.34.0_linux_amd64.tar.gz # 解压缩,可以使用Tab键补全 tar -zxf frp_0.34.0_linux_amd64.tar.gz # 切换目录 cd ./frp_0.34.0_linux_amd64 # 修改frps.ini配置文件 vim frps.ini #下面是配置文件示例 [common] bind_port = 7000 vhost_https_port = 443 privilege_token = password # 上面是配置文件示例 > frp releases地址是:https://github.com/fatedier/frp/releases **说明**:配置文件中`bind_port`是客户端与服务端沟通使用的端口号,你可以修改自己想要的端口号;`vhost_https_port`是你的frp程序提供https流量的映射端口,这个端口是要占用本公网机器的端口,所以使用443的话要保证vps上443没有被占用,且你frps运行的时候要给root权限;`privilege_token`相当于是一层鉴权吧,你可以设置个密码,知道你密码的人才可以配置`frpc和你的frps通信`。 # 运行测试 ./frps -c ./frps.ini ## 2.2 配置frpc客户端 执行下面命令前,请确保你的内网机器已经部署好了本地`http`服务,且在内网下可访问: # 假定你的内网机器是arm 32bit架构(arch命令获知),下载压缩包 wget https://github.com/fatedier/frp/releases/download/v0.34.0/frp_0.34.0_linux_arm.tar.gz # 解压缩 tar -zxf frp_0.34.0_linux_arm.tar.gz # 切换目录 cd frp_0.34.0_linux_arm > frp releases地址是:https://github.com/fatedier/frp/releases 下载好以后,下面具体配置`frpc.ini`文件: # 配置frpc.ini配置文件 # 下面是配置文件格式 [common] # 这里填写你公网机器的IP server_addr = 1.2.3.4 # 这里填你设置的frpc和frps沟通的端口,默认7000 server_port = 7000 # 这里填你设置的密码 privilege_token = password # 下面[...]名字自定义,比如我自定义的就是[frp_https_site] [frp_https_site] type = https #下面填你http服务的端口号 local_port = 80 # 下面填你的域名 custom_domains = frp.yourdomain.com # 调用内置的https2http插件 plugin = https2http plugin_local_addr = 127.0.0.1:80 # 下面填127.0.0.1,别填别的 plugin_host_header_rewrite = 127.0.0.1 plugin_header_X-From-Where = frp # 配置证书,记得把上面取得的证书scp传到/etc/frp目录下 plugin_crt_path = /etc/frp/cf.crt plugin_key_path = /etc/frp/cf.key ## 上面是配置文件示例 配置好以后,可以执行下面命令试运行: # 执行下面命令试运行 ./frpc -c ./frpc.ini **说明**:不出意外的话,现在你的内网机器已经通过frp暴露出去了,也就是你已经可以使用流量通过`https://frp.yourdomain.com:443`访问你内网下的服务了。 ## 2.3 frp的systemd服务 上面命令只是试运行,退出终端程序也退出了,这显然是我们不能接受的,细心的朋友应该已经发现`frp`作者已经写好了`systemd`配置,你只需要把它移动到合适的位置,然后就可以让它在后台跑起来,并添加开机自启动。不过需要注意的是服务端`frps.ini`配置文件里用到了443端口,而默认的systemd配置里用户身份是`nobody`,可能会无法监听此低位端口,你需要把它修改为`root`,然后再尝试使用。 ## 2.4 添加ssh穿透支持 在上面客户端配置文件`frpc.ini`配置文件下添加下面内容: [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 # 下面设定的port是远程机器的端口,请注意远程机器的防火墙设置 remote_port = 2222 添加此ssh块后,便可以通过`ssh -p 2222 user@1.2.3.4`的方式连接到你的内网机器了,从而进行管理。 ## 2.5 公网机器上frps与网站共存 如果你的vps上已经使用nginx做了网站,且`nginx`已经占用了443端口,那么你可以借助nginx的`stream`模块将`frp.yourdomain.com`跟你做站用的域名区分开来,实现443端口复用,那么具体修改如下: # 修改frps.ini配置文件,让nginx占用443端口 # 下面是示例 [common] bind_port = 7000 vhost_https_port = 8443 privilege_token = password # 上面是示例 修改完`frps`的配置文件以后,需要重新启动frps让修改生效,下面需要相应修改你的nginx主配置文件`nginx.conf`: # 修改nginx的主配置文件nginx.conf # 下面是修改示例 user nginx; ... http { ...; } stream { map $ssl_preread_server_name $name { frp.yourdomain.com frp; #映射你frp用到的域名到合适的后端名frp default web; #未匹配到任何域名时遵从此服务 } upstream frp { server 127.0.0.1:8443; #这里设置frp监听的用于映射https的端口为上游 } upstream web { server 127.0.0.1:2096; #如果你的https网站之前监听的443端口,那么你需要把它改成合适的端口,并填在这里(这里我修改为2096) } server { listen 443 reuseport; #nginx监听的对外的443端口 proxy_pass $name; #反代 ssl_preread on; #预读sni主机名 } } # 上面是配置文件示例 # 三、结语 本文是参考网上的相关教程,做了一点改动,实测可以成功,欢迎尝试,如有错误,欢迎留言指正。 ## 参考链接: - [frp github地址](https://github.com/fatedier/frp "frp github地址") - [frp完整文档](https://gofrp.org "frp完整文档") - [使用 Frp 为你的 Web 服务添加 https 支持](https://blog.walterlv.com/post/add-https-support-for-web-service-using-frp.html "使用 Frp 为你的 Web 服务添加 https 支持") 标签: none
stream和server不能同时使用443端口吧
stream里面server用443,upstream frp可以用127.0.0.1:port,port为frps.ini里面设置的vhost_https_port,当然这个端口不能是443了