家庭服务器网络访问方案
小冰 • 2 天前 • 17 次点击 •
我在家庭内部运行这一台服务器和一台 NAS 设备,其中提供着不少对外的服务,需要从公网能访问到这些服务。之前由于我的家庭宽带中提供公网的 IPV4 的服务,所以一直用的方案是 阿里云域名 + 光猫桥接路由器拨号 +TPLINK 自带的 DDNS+TPLINK 的端口转发 ,就能把内网的接口映射到公网上去,其中还有不少的细节问题,感兴趣的可以找我私聊。
但是由于现在电信的宽带逐步回收了公网的 IPV4 服务,所以这个方案现在不攻自破了。这里要吐槽一下电信是真的坑,毫无征兆的回收,导致我的服务宕机了好几天,这几天掉的头发都快织毛衣了。
折腾的这几天也有一些被 pass 掉的方案,简单说一说。
方案一 ipv6
第一个就是保持原来的方案不动,开启 IPV6 的转发,由于 IPV6 现在给的都是公网的,所以也能解决外网访问的问题,实测是可以走通的,但是过程中遇到的几个问题让我放弃了这个方案。
问题一是如果我使用 IPV6 来转发网页的话,那我所有访问的地方也得支持 IPV6,不然就无法访问(主要是 DNS 的问题)。
问题二是 IPV6 的安全性问题,我的路由器只要开启了 IPV6,就会给子网的所有设备都获取一个公网的 IPV6,毫无防护,这也迫使我没有采纳这个方案。
方案二 LUCKY内网穿透
可以先看看教程保姆级教程:用Docker安装Lucky进行STUN内网穿透_网络存储_什么值得买 对lucky有所了解,LUCKY非常强大,几乎涵盖了这一块的全部内容。在没有公网的情况下还可以用STUN内网穿透让外部访问内网。虽然很强,但是STUN模式的端口会不时的变化,变化之后就要自己去重新配置一下,能用,但是不优雅。抛弃。
Frp:RMB的力量
首先说个大前提,要用Frp,需要有 一台有公网IP的服务器 ,大部分情况是需要花钱买的,看到这没兴趣的可以直接下一篇了。
一定要记得开放服务器的安全组。
Frp分为frps(服务端) 和frpc(客户端) 两部分,简单来说就是把在有公网ip的服务器上部署frps,然后在内网的设备中部署frpc,这样就能把内网设备中的端口映射到服务器上,再访问服务器上的相应的转发端口,就能实现外部网络访问内网服务了。
我这边选择用docker来安装,这样移植性更高一些,主要是我的每台机器中都有docker。
首先在服务端安装frps。
同目录下创建docker-compose.yml
和frps.toml
两个文件,用docker-compose up -d
命令运行,frps.toml的具体配置可以看官网的参考。
# docker-compose.yml
version: '3'
services:
frps:
image: snowdreamtech/frps:latest
container_name: frps
restart: always
network_mode: host
volumes:
- ./frps.toml:/etc/frp/frps.toml
# frps.toml
# 客户端与服务连接端口
bindPort = 7777
# 客户端连接服务端时认证的密码
auth.token = "123"
# http协议监听端口
vhostHTTPPort = 82
# https 协议监听端口
vhostHTTPSPort = 83
# web界面配置
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin"
然后安装frpc
frpc的运行和frps大致相同,改改配置文件就行。
# docker-compose.yml
version: '3'
services:
frpc:
image: snowdreamtech/frpc:latest
container_name: frpc
restart: always
network_mode: host
volumes:
- ./frpc.toml:/etc/frp/frpc.toml
# 填写服务器的公网ip
serverAddr = "111.111.111.111"
# frps中的bindPort
serverPort = 7777
# frps中的auth.token
auth.token = "123"
[[proxies]]
name = "xxx-https"
type = "https"
localIP = "127.0.0.1"
localPort = 183
customDomains = ["xxx.top","*.xxx.top"]
[[proxies]]
name = "xxx-http"
type = "http"
localIP = "127.0.0.1"
localPort = 182
customDomains = ["xxx.top","*.xxx.top"]
小Tips
由于我这个人很懒,并不想记那么多东西,但是我内网中又有很多的服务要透传出去,所以我基于上述的方案有一个解决流程。
首先注册一个自己的域名,我在阿里云注册的.top,很便宜几乎白嫖。
然后把这个把这个域名解析很多二级域名(自己用得到的,比如av.xxx.top)这种,解析到frps的ip上,无脑解析就行,更懒一点的可以直接解析一个*.xxx.top,以后就不用管这个东西了,但是这个容易被扫,还是自己配置不比较方便。
接下来就是在frpc的那台机器上,用我上面的配置方案来配置https和http的转发,记住写customDomains
。我配置的localIP和localPort指向的是我本地的nginx
,我这边用的是**Nginx UI** ,这个工具就是一个可视化的nginx配置工具,我主要用到里面的站点和证书,感兴趣的后面我会再出一篇来讲解一下。
在nginx ui中,可以用通配符给域名配置证书,然后在站点功能中配置自己相应的站点引用这个证书,就能开启全站https了。
总结
经过上述流程的折腾,后续我再有新站点新增,我需要动的地方就很有限了。
- 先在域名解析的地方,解析出一个我需要的二级域名。
- 然后在nginx ui中配置我这个二级域名需要转发的服务。
搞定,收工。
推荐阅读: