缘起
公司搬家,新家不能装专线,静态ip消失,改为动态IP了,这样内部服务器在外网就没法访问了,所幸我们有一台云服务器,有公网ip。这里只提示写这篇博客的原因,下面的操作是在我个人腾讯云服务器(带公网ip)和个人PC上测试使用,亲测通过。公司阿里云服务器是生产环境,拿来测试会影响线上。
环境准备
- 已备案的域名一个
- 带公网ip的云服务器
- pc一个
- frp0.30.0 frp github下载地址
- nginx1.10.3
云服务器安装nginx和frp
- 安装 frp
这里简单说一下frp,frp是用go语言开发的内网穿透工具,分为frpc,frps。frpc是客户端,安装在内网,frps是服务端,安装在具有公网ip的服务器上,frpc和frps协商一个通讯端口,frpc启动的时候会通过这个通讯端口去连接frps,实现内网穿透(并没有去看源码,只是大致猜测是这样)。frps可以配置vhost_http_port来实现虚拟主机服务,浏览器请求
[公网ip]:[vhost_http_port]
,frps会把这个请求转发给frpc,frpc接收到后再转发给服务提供者,可以实现内网服务访问,具体请看:frp中文文档 从github上下载frp,放在/home下,打开frps.ini添加如下配置:[common]
frp连接的端口
bind_port = 7000
http监听端口
vhost_http_port = 8080
https监听端口
vhost_https_port = 8443
frp客户端连接服务端时的token 为了安全 建议添加
token = tPaALZKtCBfN6IAp
二级域名 后面访问的格式是a.frp.xxx.net或b.frp.xxx.net
subdomain_host = frp.xxx.net
使用命令启动:
```shell
./frps -c ./frps.ini
ps:如果云服务器有防火墙或者云安全组策略(阿里云有,在控制台),需要开放你上面用到的端口。
域名解析
解析两条A记录:frp.xxx.net
和 *.frp.xxx.net
,都指向你的云服务器ip,稍等一会,ping frp.xxx.net
,如果能ping
通说明解析成功
配置frpc
- 下载frp到本地,解压
- 进入解压完成的目录,修改frpc.ini为下:
[common] # 公网ip 就是frps所在的服务器的ip server_addr = xxx.xxx.xxx.xxx # frps规定的连接端口 server_port = 7000 # 连接token 与frps中的token token = tPaALZKtCBfN6isP # 定义第一个转发 [web01] type = http # 本地(内网)服务的端口 local_port = 8001 # 与frps中的subdomain_host连接起来就是a.frp.xxx.net subdomain = a
定义第二个转发
[web02] type = http
本地(内网)服务的端口
local_port = 8002
与frps中的subdomain_host连接起来就是b.frp.xxx.net
subdomain = b
然后启动:
```shell
./frpc -c ./frpc.ini
如果没有报错就是启动成功。
至此,访问地址a.frp.xxx.net:8080
会被转发到本地(内网)的8001端口,而访问地址b.frp.xxx.net:8080
会被转发到本地(内网)的8002端口
配置nginx
我们不想要url a.frp.xxx.net:8080
这类似地址中的端口怎么办?那只能使用默认端口80了,这里可以用nginx进行转发,首先在云服务器安装nginx,这个不再赘述,网上有的是资料,然后配置nginx的conf文件,名字为nginx.conf,在nginx文件夹或者/etc/nginx里面,至于在哪,取决于你用的什么安装方式,此文件中添加一个server节点,配置如下:
server {
# 监听的80端口
listen 80;
# 域名配置 记得一定要加上*.frp.xxx.net这个,只加frp.xxx.net是不行的,某运维大坑张XX在这坑我2天的时间
server_name * .frp.xxx.net frp.xxx.net;
location / {
proxy_pass http: //127.0.0.1:8080;
# 这个Host的header一定要加,不然转发后frp拿不到通过哪个域名访问的,导致转发失败
proxy_set_header Host $host;
}
}
然后重启nginx,大功告成。