FRP 内网穿透,支持通过域名访问内部服务器资源
如果你想通过外网访问家里的服务,希望这篇文章对你有帮助。
背景:
我自己的很多服务,例如博客,bitwarden,heimdall,哪吒监控等都是安装在家里的软路由openwrt或者windows服务器上的;现在使用的电信宽带分配了公网IPV4地址,但是80端口和443端口是被封闭的。即使我在路由器上打开,外部无法直接访问。
为什么专门要说80端口和443端口呢?因为80端口是http默认端口,443端口是https默认端口。也就是说,你平时访问一个网页,实际上是默认访问的80/443两个端口,只是你访问的时候不需要加入例如192.164.XXX.XXX:80的后缀罢了;对80和443端口封闭的场景来说,也可以通过将服务的端口转发到别的端口号,例如81/444等;那么在访问的时候,只需要输入192.164.XXX.XXX:81,也能达到目标,因为这些端口运营商一般不会封;
我不希望通过后面增加:XX的端口号来进行访问,一是容易被人扫描端口,如果有漏洞可能会收到网络攻击;二是每次输入网址还要加端口号,非常的不方便;
有两种方式能解决这个问题。第一种是通过反向代理,例如NGINX,因为某些别的原因我没有选择这种方式;第二种是通过FRP内网穿透,这种方式的好处在于,即使你家里的带宽没有公网IPV4地址,也能达到访问家庭资源的目的;
最后,这篇博客blog.overstic.top既是我在家宽的openwrt上使用docker创建,然后在另一个阿里云服务器上通过FRP穿透,最终达到的效果。通过域名访问的是阿里云的服务器,但是呈现的信息却是另一台服务器上的资源,这就是内网穿透达到的效果;
效果:
最终达成的目标既是:通过访问一个域名,例如blog.overstic.top, 我能访问到在家里路由器上部署的docker服务,并且没有暴露我家里的IPV4地址和我实际转发的端口号;
前提要求:
1.一台云服务器,包含IPV4的公网IP;服务器可以在云服务商处购买。资源要求很小,我自己使用的阿里云服务器是1核心,0.5G内存,20G硬盘的;云服务的好处是一般阿里云/腾讯云/华为云的VPS服务器不会将80/443端口封闭;
2.一个域名,域名需要提前购买,可以在服务商处购买域名,例如我的overstic.top就是一个域名;baidu.com也是一个域名,可以选择自己喜欢的名称。
3.内网服务器,对应服务的载体;比如我的博客安装在openwrt上,也可以安装在NAS/WINDOWS电脑上。
操作:
1.首先,在云服务器上安装FRPS,FRPS值得是FRP的Server端。我们通过如下命令安装:
export VERSION_FRP="0.34.0"
cd /usr/local/bin
sudo wget https://github.com/fatedier/frp/releases/download/v"$VERSION_FRP"/frp_"$VERSION_FRP"_linux_amd64.tar.gz
sudo tar -xf frp_"$VERSION_FRP"_linux_amd64.tar.gz -C /usr/local/bin
sudo mv frp_"$VERSION_FRP"_linux_amd64 frp
sudo rm frp_"$VERSION_FRP"_linux_amd64.tar.gz
意思是在目录user/local/bin中下载frp的软件包,解压然后删除压缩包;
2.然后,我们配置frps的配置文件
sudo nano /usr/local/etc/frp/frps.ini
在文件中,添加如下配置:
[common]
bind_port = 7501
token = XXX
dashboard_port = 7500
dashboard_user = XXX
dashboard_pwd = XXX
vhost_http_port = 80
vhost_https_port = 443
subdomain_host= xxx
其中,token是连接FRPC和FPRS的密码,尽量复杂;user是你登录的账户,pwd是你登录的账户名密码,也尽量设置复杂一点;subdomain_host是你绑定在云服务上的域名,例如我的是overstic.top
然后,我们需要将FRPS配置成服务,让它在服务器重启/开机的时候也能自启动,而不需要你手动打开:
sudo nano /etc/systemd/system/frps.service
在文件中,添加如下配置:
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/frp/frps -c /usr/local/etc/frp/frps.ini
[Install]
WantedBy=multi-user.target
配置好后,启动服务:
sudo systemctl restart frps
然后你就可以访问云服务器的7500端口,进入FRPS的页面了,如下所示:
如果访问失败,可能有几个原因:
1.你的7500端口被防火墙挡住了,因为你用家里的网络访问云服务器的端口;很多运营商会默认关闭端口,需要手动打开。这部分请google查阅打开方式
2.你的80/443端口不支持FRP的配置。想要确定有无问题,将frps.ini里的80和443端口改成高端口例如8000,8001;然后重启服务再看是否能进入网页;如果可以的话,说明是这个问题;
针对问题2,需要让系统允许FRP使用80/443端口,运行如下命令
sudo apt install libcap2-bin -y
sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/frp/frps
然后重启服务即可;
3.最后,我们配置frpc
因为我使用的openwrt中的frp内网穿透,包含可视化界面。如果你使用其他的frpc,也可以大致参考;
在openwrt的服务中,找到Frp内网穿透
按照上图配置,其中服务器既是你云服务器绑定的域名(也可以是服务器的ipv4地址);端口与frps.ini的bin_port对应;令牌与token对应;用户名自己填,HTTP/HTTPS端口与vhost_http_port/vhost_https_port对应;然后点击保存应用;查看日志中是否显示login to servert success;
如果失败,需要注意上面的FRPS是否成功运行,token,服务器是否能够对应,7501端口是否能够外网访问;
4.配置要内网穿透的服务端口
在服务列表中点击添加按钮
然后补充你服务的信息,如下:
其中可以配置HTTP或者HTTPS,子域名对应你想配置的名字,例如我的服务是一个博客,我就用blog.overstic.top来访问;如果你是一个电影系统,可以用movie.overstic.top访问;内网主机地址和端口填写服务对应的主机和端口(即你在本地的哪个ip中的哪个端口部署的服务)
最终保存后,查看日志,会显示例如下面的日志,表示配置成功
2025/02/16 09:40:01 [I] [control.go:169] [110efdf52b7d88a8] [overstic.blog] start proxy success