如果你想通过外网访问家里的服务,希望这篇文章对你有帮助。

背景:

我自己的很多服务,例如博客,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的页面了,如下所示:
FRPS.png
如果访问失败,可能有几个原因:
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内网穿透
FRPC1.png
按照上图配置,其中服务器既是你云服务器绑定的域名(也可以是服务器的ipv4地址);端口与frps.ini的bin_port对应;令牌与token对应;用户名自己填,HTTP/HTTPS端口与vhost_http_port/vhost_https_port对应;然后点击保存应用;查看日志中是否显示login to servert success;
FRPC2.png
如果失败,需要注意上面的FRPS是否成功运行,token,服务器是否能够对应,7501端口是否能够外网访问;

4.配置要内网穿透的服务端口

在服务列表中点击添加按钮
FRPC3.png
然后补充你服务的信息,如下:
FRPC4.png
其中可以配置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

标签: none

添加新评论