记录FRP+NGINX内网穿透

3年前 10

一直以来的想法,本地架设服务器,直接通过域名访问即可。

就是这样如此简单的想法需要花费很多钱、技术和时间。其实现在的网站搭建已经是很简单了,空间+域名搞定!可因为电信网络的问题,我们的宽带不能直接被外网访问,而且更可恶的是还封闭了我们的80端口和443端口。所以即便我们的网络被外网访问,也不能直接访问,还得加个端口。这样多难看啊!曾几何时,尝试了多少次,如今才勉强搞定一个站点。

如今在网络上说到内网穿透,frp成了代名词。也确实,frp做内网穿透确实很专业。可惜官网的配置我就是看不懂,一定是的技术不专业!查了很多资料,慢慢尝试才搞定了,这种心情很难用言语形容的。

好了,现在说说我咋做到的!

首先,我们需要几个条件:域名(liuyuanlin.com)、服务器(可以支持Nginx反向代理,所以vps这种最好了,空间应该不行吧)、本地架设服务器(这个简单,很多软件都可以做到)、frp软件(免费开源的,放心使用,frp内网穿透官网)。

其次,配置服务端。
服务端是外网服务器,也就是可以直接被外网访问的vps。
在frp软件里,frps是服务端,frps.ini是配置文件,我们只需要编辑这个文件即可。

[common]
bind_port = 7000 #监听服务端端口,这个必须要和客户端配置里的server_port端口一致
token = 123456 #token验证,这个必须是和客户端一致
vhost_http_port = 8080 #这个是监听http的端口,下面需要设置的端口跟这个一样
vhost_https_port = 9999 #这个是监听https的端口,下面需要设置的端口跟这个一样
log_file = ./frps.log #这个是错误日志的存储位置
log_level = info #这个是显示错误日志的类型,trace, debug, info, warn, error这几个可以选一个
log_max_days = 7 #这个顾名思义,存储日志最长天数

vps我用的是阿里云ecs,缺点是需要备案,如果你用国外的或者香港的,那就不需要备案了。为了不影响其他站点,我装了lnmp,这样添加一个主机空间,修改对应的.conf配置也就不影响了。

server {
listen 80;
listen 443 ssl;
server_name liuyuanlin.com www.liuyuanlin.com;
root /wwwroot/liuyuanlin.com;
index index.html index.htm index.php default.html default.htm default.php;
ssl_certificate /wwwroot/keys/liuyuanlin.com.crt; #如果证书和此配置文件不在同一目录,需写上路径,例如/home/wwwroot/ssl.pem
ssl_certificate_key /wwwroot/keys/liuyuanlin.com.key; #同上
ssl_session_timeout 5m;

ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_prefer_server_ciphers on;

location / {
proxy_pass http://127.0.0.1:8080; #这个端口很重要,填写frps配置文件里的vhost_http_port端口
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_max_temp_file_size 0;
proxy_redirect off;
proxy_read_timeout 240s;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

这个反向代理配置很关键,道理就是要将我们监听的8080端口,也就是本地服务器的8080端口映射到外网的80端口,这样就不用再域名后面加端口那么难看了。
lnmp restart重启lnmp,./frps -c ./frps.ini 启动服务端。

第三,配置客户端。
客户端就是我们的本地服务器,不能被外网访问的可怜的服务器。如果你的内网有公网动态或者静态IP,那就不需要内网穿透了。
在frp软件里frpc是内网客户端软件,frpc.ini是配置文件,编辑此文件:

[common]
# 这里填写 服务端 机器的 IP 或者域名
server_addr = X.X.X.X
# 填写 服务端 机器开放的 frp 服务端口,也就是 frps.ini 配置文件中 bind_port 的值
server_port = 7000
token = 123456

[liuyuanlin_http]
# 依然支持 http 访问
type = http
# 本地 Web 服务的端口
local_port = 8080
# 需要反向代理的域名(当访客通过此域名访问 A 机器时,才会将请求反向代理到此 Web 服务)
custom_domains = liuyuanlin.com, www.liuyuanlin.com

[liuyuanlin_https]
# 配置 https 访问
type = https
# 本地 Web 服务的端口(与前面的配置一样,都对应同一个 Web 服务)
local_port = 9999
# 需要反向代理的域名(当访客通过此域名访问 A 机器时,才会将请求反向代理到此 Web 服务)
custom_domains = liuyuanlin.com, www.liuyuanlin.com

# 接下来的配置是支持 https 的重点配置
# 配置插件,将 https 请求转换成 http 请求后再发送给本地 Web 服务程序
plugin = https2http
# 转换成 http 后,发送到本机的 9999端口
plugin_local_addr = 127.0.0.1:9999
# 可能是 frp 的 Bug?这里必须写成 127.0.0.1,稍后解释
plugin_host_header_rewrite = 127.0.0.1
# 指定代理方式为 frp
plugin_header_X-From-Where = frp
# 指定成你在前面部分导出的证书的路径
plugin_crt_path = /wwwroot/keys/liuyuanlin.com.crt
plugin_key_path = /wwwroot/keys/liuyuanlin.com.key

而客户端的服务器Nginx不需要怎么配置,只是把端口设置为服务端监听的端口即可。譬如:

server {
listen 8080;
listen 9999 ssl;
............
}

因为我本地架设的服务器也是lnmp,所以直接用lnmp restart重启lnmp即可,./frpc -c ./frpc.ini 启动客户端。
如果需要在后台长期运行,建议结合其他工具使用,例如 systemd 和 supervisor,这个frp软件里都有。

最后,有兴趣的朋友试试吧!这些配置只不过根据网上大神的经验修改而来的,或许代码可以更加精炼。请多多指教!
这样的话,我们服务端的主机就不需要很高的配置了,只要能正常运行Nginx就可以了。所以流量不高的朋友,可以尝试定制vps主机,把带宽设置高一些,访问的速度就快多了。

最最最后,本文介绍的反向代理如果不好弄,本人也放弃了,可以看这篇文章,比较直接!


在网上找到一个方法,本站未测试,但对方测试了,看起来貌似很有用。记录下来或许以后会用到。

第一步:修改服务器中nginx.conf配置文件

在nginx.conf中http{ }里添加以下参数

server {
listen 80;
server_name xiaoyue.ml www.xiaoyue.ml;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect http://$host/ http://$http_host/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
}

如下图,设置好后保存,重启nginx

FRP+nginx反向代理
FRP+nginx反向代理

第二步:修改frp服务端配置文件

既然反向代理到了8080端口,那么frp服务端的配置文件也需要进行设置

frps.ini配置文件中vhost_http_port = 8080端口

frps配置
frps配置

第三步:修改frp客户端配置文件

第一步配置中:server_name xiaoyue.ml www.xiaoyue.ml; 这里填写对应域名。

也支持泛解析,例如:server_name *.xiaoyue.ml;需要域名同时进行泛解析才行。

那么frpc.ini怎么修改呢,很简单

对应穿透服务配置里配置好对应域名,custom_domains = xiaoyue.ml

e907b 2020032403534785.jpeg

第四步:

服务器中重启frps,本地电脑中启动frpc,就可以在浏览器中通过80端口直接访问xiaoyue.ml了。

xiaoyue.ml是解析到我的服务器中,而这个网站是搭建在局域网里面我自己的电脑中。

也就是首先保证你电脑上访问127.0.0.1,是有内容的哦。

其实本文核心就一步,那就是将比如你访问xiaoyue.ml(默认情况下,我们访问网站都是80端口),反向代理到xiaoyue.ml:8080端口而已。

那这样做有什么意义呢,就是想直接通过域名访问,而不是通过域名:端口号访问网站。

此方法由http://blog.hux6.com/archives/326.html分享。

10 条评论

  1. #1

    不错不错!强大 !

  2. #2

    frp 还是影响网站速度,最好还是省去这一步,搞个有公网IP的宽带。

    • @木木 这个速度应该感觉不出来把
      如果带宽比较大的话 会更快

  3. #3

    frp是起到一个承接中转的作用吧,外网的访问流量,上传下载都要从frp服务器上过,自己的电脑成了一个空间。只是对frp服务器来说,核心和内存要求不高,但要想访问快,流量得高,主机流量也算是服务商们卖价最贵的了,不过也有优点,就是数据都掌握在自己手里,备份也简单。
    按博主的配置,是属于自己有公网IP的,只是没有开80端口吧。
    现在很多家庭宽带,不但封了80端口,而且还是内网IP,得双穿透才行。
    外网的VPS,没发现什么流量大还便宜的,对于国内访客来说,像百度云腾讯云阿里云在双十一的时候,几百元三年的还是很合算的,毕竟自己电脑开机也是要电费的。
    当然问题在于,网站放在国内对网站内容限制很严,是真的严,说觉得你的不合适就下备案了。

  4. #4

    曾经也想过把网站放到本地服务器,自主可控。但是从稳定性来考虑还是没有云服务器可靠。

    • @天一生水 其实我感觉是一样的,反而在本地感觉比较安全一些。
      所以下一步我想找一款合适的微型电脑充当服务器。