朋也的博客 » 首页 » 文章

利用frp内网穿透实现用自家电脑发布网站(不用买服务器了)

作者:朋也
日期:2018-10-18
类别:golang学习笔记 


版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证

一直想总结一下使用frp的经验,今天来写一下

我的yiiu.co域名的网站都是用frp做的内网穿透实现的,服务器就在我身边,发布的网站服务外网都访问,下面就来说说我的配置方法

下载frp

这个不多说,选择好自己的平台就可以了,注意版本号一定要一致,下载地址

打开可以看到 linux 平台有很多版本,386, amd64, arm, arm64 等等,这里说一下,如果你服务器是32位,就下载 386,如果你服务器是64位的,而且你又不能分清cpu是arm架构的还是amd架构的,那也选386

总之一句话,对系统架构分不清的就只下载386的就对了

解压下载好的压缩包,可以看到几个文件

.
├── LICENSE
├── frpc
├── frpc.ini
├── frpc_full.ini
├── frps
├── frps.ini
└── frps_full.ini

各文件说明

frp运行流程

做内网穿透需要事先准备的

  1. 一台外网服务器
  2. 一台内网服务器

一次请求的经过,最简单的流程

用户请求(浏览器) -> 外网服务器ip -> 外网服务器上部署的frps -> 内网服务器上部署的frpc -> 内网服务器上部署的服务

请求成功后,响应过程与请求过程相反

这个过程中还可以加上 nginx 来做不同域名共用80端口的转发工作,那样就会变成

用户请求(浏览器) -> 外网服务器ip -> 外网服务器nginx -> 外网服务器上部署的frps -> 内网服务器上部署的frpc -> 内网服务器nginx -> 内网服务器上部署的服务

好了明白这些了,就可以来做配置了

配置frps

想办法把 frps frps.ini 拷贝到外网服务器上

我这假设放在 /opt/frp/ 下,假设外网服务器ip是 10.10.10.10, 假设网站域名是 example.com

修改 frps.ini

[common]
bind_port = 7000
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = 123123
token = 123123
vhost_http_port = 8000
subdomain_host = example.com

然后启动 frps

# 给frps附上可执行权限
sudo chmod +x frps
# 在后台运行并将日志写入到当前目录下的 log.file 里
./frps -c frps.ini > log.file 2>&1 &

配置frpc

想办法把 frpc frpc.ini 拷贝到内网服务器上

我这假设放在 /opt/frp/ 下, 假设要配置的网站域名是 example.com bbs.example.com blog.example.com 三个域名

修改 frpc.ini

[common]
server_addr = 10.10.10.10
server_port = 7000
token = 123123

[example]
type = http
local_ip = localhost
local_port = 8080
use_encryption = false
use_compression = true
subdomain = example.com

[bbs]
type = http
local_ip = localhost
local_port = 8081
use_encryption = false
use_compression = true
subdomain = bbs

[blog]
type = http
local_ip = localhost
local_port = 8082
use_encryption = false
use_compression = true
subdomain = blog

相关配置说明

启动 frpc

# 给frps附上可执行权限
sudo chmod +x frpc
# 在后台运行并将日志写入到当前目录下的 log.file 里
./frpc -c frpc.ini > log.file 2>&1 &

注意:内网服务器上要启动三个web服务,分别端口对应 8080, 8081, 8082

映射ssh

如果我们不在内网服务器旁边,web服务要是出问题了,会比较麻烦,这时可以通过frp映射一个ssh,这样就可以随时随地的操作内网了

只需要配置frpc.ini 即可

[common]
...

[ssh]
type = tcp
local_ip = localhost
local_port = 22
remote_port = 7001

[example]
...

同样的方法还可以映射游戏,同样的使用 type = tcp 把端口改成游戏的端口就可以了,比如Minecraft的端口是25565,是不是相当的方便,快跟小伙伴组队吧

重启 frpc , 然后就可以使用命令 ssh -p 7001 root@10.10.10.10 来连接内网的终端了

总结

  1. 你可以通过访问 http://10.10.10.10:7500 然后输入 frps.ini 里配置的 dashboard_user dashboard_pwd 来查看frp的运行情况
  2. 在启动frpc之前,你要在域名提供商那把域名解析到外网服务器上
  3. 如果ssh映射连接总是超时,要看一下外网服务器是否把7001端口开放了,有可能是外网服务器的防火墙拦住了
  4. 关于nginx配置https,参见:https://atjiu.github.io/2016/08/28/letsencrypt-nginx-https/

问题

如果使用nginx反代frp的话,有时候会碰到这样的错误 [W] [http.go:95] do http proxy request error: no such domain: 127.0.0.1

这个问题我在issues里找到了解决办法,在nginx代理的时候,加上一个配置 proxy_set_header Host $host; 写在 proxy_pass 这一层就可以了

参见:https://github.com/fatedier/frp/issues/1521

参考