一、准备工作
1、硬件设备
1)要暴露给外网做服务器的电脑一台,系统:Win/Linux/Mac均可(服务器)
本例中服务器使用Windows 10 x64系统。
2)公网服务器电脑一台,系统:Win/Linux/Mac均可 (中转机)
本例中中转机使用CentOS 7.4 x64系统。
2、软件程序
1)frp软件,根据两台电脑的硬件和系统选择下载对应最新版本 :https://github.com/fatedier/frp/releases
2)Nginx:https://nginx.org/en/download.html
3)Apache:https://httpd.apache.org/download.cgi
4)WinSW(Windows系统cmd命令转服务工具):https://github.com/kohsuke/winsw/releases
5)acme.sh(
Let’s Encrypt SSL证书签发自动化脚本):https://github.com/Neilpang/acme.sh
6)phpStudy(本机服务器集成环境)http://phpstudy.php.cn/download.html
3、其他
1)域名,顶级或N级均可。
二、部署
1、域名解析
本文以frp.gg.dev
为例:
登录域名的解析后台,在gg.dev
下增加两条A记录: frp
和 *.frp
,记录值为部署frp服务端的中转机(公网服务器)ip。代表frp.gg.dev
下的所有的子域名,会全部指向此台中转机。
2、中转机Nginx或Apache反向代理配置
1)Nginx配置,配置完成后重启Nginx服务:service nginx restart
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
server { listen 80; listen 443 ssl; server_name frp.gg.dev; server_name *.frp.gg.dev; #不需要开启https请注释或删除以下ssl开头的参数,注意证书路径替换为你自己的,如何通过acme.sh申请免费证书请看我之前写的文章。 ssl_certificate /opt/ssl/acme/frp.gg.dev.cer; ssl_certificate_key /opt/ssl/acme/frp.gg.dev.key; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4; ssl_prefer_server_ciphers on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_session_cache shared:SSL:5m; ssl_session_timeout 5m; #http强制跳转到https,不需要请使用#注释或删除 if ($scheme = http) { return 301 https://$host$request_uri; } location / { proxy_pass http://127.0.0.1:7071; proxy_set_header Host $host:80; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_connect_timeout 7d; proxy_send_timeout 7d; proxy_read_timeout 7d; } } |
2)Apache配置 ,配置完成后重启Apache服务:service httpd restart
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#http站点 <VirtualHost *:80> ServerName frp.gg.dev ServerAlias *.frp.gg.dev ProxyPreserveHost On ProxyPass / http://127.0.0.1:7071/ ProxyPassReverse / http://127.0.0.1:7071/ </VirtualHost> #https站点,证书路径请替换为自己的,需要强制http跳转https请自行GG。 <VirtualHost *:443> ServerName frp.gg.dev ServerAlias *.frp.gg.dev SSLEngine on SSLCertificateFile "/ssl/acme/frp.gg.dev.cer" SSLCertificateKeyFile "/ssl/acme/frp.gg.dev.key" ProxyPreserveHost On ProxyPass / http://127.0.0.1:7071/ ProxyPassReverse / http://127.0.0.1:7071/ </VirtualHost> |
3、中转机(公网服务器)frps配置
1)假设已经在中转机上将frp下载解压到路径/home/frp
,以下为frps.ini
的配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[common] # frp监听的端口,用作服务端和客户端通信 bind_port = 7000 # 服务端通过此端口接监听和接收公网用户的http请求 vhost_http_port = 7071 # frp提供了一个控制台,可以通过这个端口访问到控制台。可查看frp当前有多少代理连接以及对应的状态 dashboard_port = 7100 # 服务端的subdomain_host需要和客户端配置文件中的subdomain、local_port配合使用,可通过{subdomain}.{subdomain_host}的域名格式来访问自己本地的 web 服务。 # 假如服务端的subdomain_host为frp.gg.dev,客户端某个配置组中的 # subdomain为a,local_port为8585, # 则: # 访问 a.frp.gg.dev,等同于访问本地的localhost:8585 subdomain_host = frp.gg.dev |
使用./frps -c frps.ini
命令启动服务器监听,注意,关闭终端,服务将停止。
使用nohup ./frps -c frps.ini >/dev/null 2>&1 &
命令后台启动服务器监听,此命令运行后关闭终端服务不会停止。
2)注册为服务,开机自动启动(可选,该步骤非必须)
以CentOS 7.4为例创建文件:/etc/systemd/system/frps.service
1 2 3 4 5 6 7 8 9 10 11 12 |
[Unit] Description=fraps service After=network.target syslog.target Wants=network.target [Service] Type=simple #启动服务的命令(此处写你的frps的实际安装目录) ExecStart=/root/frp/frps -c /root/frp/frps.ini [Install] WantedBy=multi-user.target |
然后可通过以下命令控制服务状态
1 2 3 4 5 6 7 8 9 10 11 12 |
#启动frps sudo systemctl start frps #自启动 sudo systemctl enable frps #卸载自启动 sudo systemctl disable frps #重启 sudo systemctl restart frps #停止 sudo systemctl stop frps #查看日志 sudo systemctl status frps |
3)如有防火墙需要设置防火墙放行7000、7071、7000端口,注意,除了机子本身的防火墙,IDC主机商处如有防火墙也需要设置放行,具体操作自行GG。
4、服务器(要暴露给外网的电脑)frpc配置
1) 假设已经在服务器电脑上将frp下载解压到路径D:\soft\frp
,以下为frpc.ini
的配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[common] # 部署中转机frps的公网服务器的ip server_addr = 114.115.116.117 # 和中转机frps的bind_port保持一致 server_port = 7000 # http代理服务一 ,[]内的代理服务名称在全局范围内确保唯一,每个代理服务不能重名,否则会影响正常使用。 [http-a] type = http # local_port代表你想要暴露给外网的本地web服务端口 local_port = 8585 # subdomain 在全局范围内要确保唯一,每个代理服务的subdomain不能重名,否则会影响正常使用。 # 客户端的subdomain需和中转机的subdomain_host配合使用,组成a.frp.gg.dev这个访问网址。 subdomain = a # http代理服务二 ,各项配置说明请参考配置组一 [http-b] type = http local_port = 8686 subdomain = b |
在frp解压目录下右键打开 powershell 或者cmd,执行如下命令./frpc.exe -c ./frpc.ini
如果窗口提示 『start proxy success
』 ,则代表frp服务端和frp客户端的通信隧道建立成功。
2)注册为Windows服务,开机自动启动
将之前下载的WinSW.NET4.exe放到frpc目录改名winsw.exe
创建winsw.xml文件,写入以下内容
1 2 3 4 5 6 7 8 |
<service> <id>frp</id> <name>frp</name> <description>frp客户端</description> <executable>frpc</executable> <arguments>-c frpc.ini</arguments> <logmode>reset</logmode> </service> |
管理员权限打开CMD或PowerShell执行以下命令以控制服务状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#安装服务 winsw install #开启服务 winsw start #重启服务 winsw restart #停止服务 winsw stop #卸载服务 winsw uninstall |
三、测试访问
在浏览器里面访问 http://a.frp.gg.dev
或 https://a.frp.gg.dev
测试你的电脑web服务外网是否能够访问!
四、其他说明
1、本机Web环境请自行使用phpStudy等集成环境搭建。
2、不同系统配置大同小异,了解frp内网穿透原理会让事情变得简单。
3、事实上本就很简单。加油吧,少年。