pipuwong.com2025-04-06 21:35

如何用公网ipv6/ipv4安全地访问Homelab服务

文章摘要

这篇博文讲述了作者如何安全地将私有化服务从云服务器迁移到自建的HomeLab,并实现外网访问。作者通过结合域名解析和Nginx Proxy Manager,实现了仅允许通过域名访问内网服务的目的,有效防止恶意扫描公网IP进行攻击。 核心在于Docker Compose端口配置,通过限制特定局域网IP地址才能访问宿主机端口,从而增强安全性。文章强调了记录并正确配置本机IP的重要性,以及不同端口配置方式的区别。 作者分享了自己的实践经验,旨在帮助其他HomeLab爱好者搭建安全可靠的私有化服务,让技术更有趣、更实用。

外网访问私有化服务安全.webp

前言

今年给自己组装了一台 DIY 的 All in one 服务器,底层系统是Unraid(详情可查看 2024年终总结 ),在此期间,我开始将云服务器的私有化服务,迁移到HomeLab,如何让外网访问更安全,是我一直考虑的问题,现在就完善它。


前提

家庭服务器的私有化服务和nginx proxy manager 部署在同一台服务器。

如私有化服务和nginx proxy manager 在不同服务器也可以,道理也是一样。



实现效果

✅ 域名访问

❌ IP+端口

只有匹配的域名的才会转发请求到服务器端口(只有使用域名才能访问到内网部署的服务),如果别人通过扫描公网IP找到我这个端口是打开的,而且他的不是https请求,会被nginx服务器拒绝。


本文假设

  • 域名是example.com,域名服务商在腾讯云
  • Nginx Proxy Manager的https的访问端口为11200
  • 家庭宽带为动态公网IP

项目的 Docker Compose 端口配置

内网的服务器,我一般通过docker compose 部署 端口要设置成“允许指定局域网 IP 访问”,端口号要这样写:本机IP+端口

假如1panel的本机IP为192.168.10.3,可以这样配置:

ports:
- 192.168.10.3:12900:80 

解读

  • 将容器内部的 80 端口映射到宿主机 192.168.10.2 的 12900 端口上
  • 只有来自 192.168.10.2 这个 IP 地址的 12900 端口的连接才会被转发到容器

重点回顾

要知道本机的IP,并且将它写到docker compose.yml文件里


顺便了解下

不同的端口配置,这次我们使用的是允许指定局域网 IP 访问

#只允许本机访问 
ports: - 127.0.0.1:12900:80 

# 允许指定局域网 IP 访问
ports: - 192.168.10.2:12900:80 

# 允许所有网络接口访问(包括公网,如果有的话)
ports: - 12900:80

Nginx Proxy Manager反向代理配置

  • 域名绑定到内网的服务 —> 192.168.10.12:12900
  • 申请SSL证书,并且打开 强制跳转到https

1743927809506.webp

1743927833270.webp

1743927848046.webp

自动获得公网IP

1panel 安装 DDNS-GO,实现自动获取动态的公网 IPv4 或 IPv6 地址(因为家宽公网IP都是动态的),并解析到对应的域名。

1743927861504.webp

1743927928141.webp

此时,已实现效果:一但公网IP发生变动,就会自动地、及时地更新域名解析。

完成

此时,可通过abc.example.com:11200访问服务了!

温馨提示:公网ipv6不需要打开端口,如果是公网ipv4,就需要设置端口转发。


如果此时通过 ipv6+端口 或者ipv4+端口,是访问不了内网的服务的,这大大提高了安全性。