零成本内网自定义域名 + Nginx 建站完整教程|家用路由 + Debian 本地搭建

一、先说核心:这套方案到底好在哪?

不用花钱买公网域名、不用租云服务器,手里有闲置电脑装 Debian + 普通家用路由器,就能实现全屋局域网设备用自定义域名(含中文域名)访问本地网站。 电脑、手机、平板连同一个 WiFi,直接输域名就能打开自己搭的站点,完全零额外开销。

整套架构分工(各司其职,无付费组件)

  1. 水星 MAC1200R 路由器:负责全屋 DHCP 下发内网 DNS,把所有设备域名解析指向本地 Linux 主机
  2. Debian13(无图形化)+ dnsmasq:内网 DNS 核心,实现 IP 与自定义域名映射,拦截私有后缀避免和公网冲突
  3. Nginx:虚拟主机分发,一台机器绑定多个内网域名,区分不同本地站点

二、第一步:路由器前置配置(必做)

1. 登录路由器后台

翻路由器机身,查看配置地址、管理员账号密码,浏览器输入地址登录管理后台。 登录后找到顶部【高级设置】,进入网络参数板块。

2. IP 与 MAC 绑定(固定服务器内网 IP)

进入「IP 与 MAC 绑定」页面:

  • 找到你的 Debian 主机 MAC 地址,固定分配静态 IP(示例:192.168.101.110)
  • Windows 笔记本等设备按需绑定,方便 SSH 远程连接

3. DHCP 服务器修改 DNS(全屋自动生效)

核心区分两个 DNS,千万别填错:

  • WAN 口 DNS:路由器自身上网用,保持默认,禁止填写内网 IP

  • DHCP 服务器 DNS(关键): 首选 DNS 填 Debian 主机固定 IP:192.168.101.110

    你需要看你的路由器对应的地址池开始地址和结束地址,确保你填写的固定IP地址在其范围内噢~ 备用 DNS 填公共兜底:223.5.5.5 保存设置,所有设备断开重连 WiFi,自动获取内网 DNS 配置。

三、第二步:Debian 安装配置 dnsmasq(内网域名解析核心)

1. 安装工具

bash 复制代码
sudo apt update && sudo apt install dnsmasq ufw

2. 防火墙放行 DNS 53 端口

DNS 默认走 UDP53 端口,局域网设备才能正常解析:

bash 复制代码
sudo ufw allow 53/udp
sudo ufw reload

3. 域名映射文件 /etc/dnsmasq.hosts

作用:绑定内网 IP 和域名,中文域名必须转 Punycode 编码 在线工具可一键转码中文域名,避免 Linux 配置乱码:

示例配置:

Plain 复制代码
192.168.101.110 xn--3pr45eyv6axfbb07ayjt.xn--kbt444f potato.nb
  • xn--3pr45eyv6axfbb07ayjt.xn--kbt444f = 爱吃红烧土豆。官网(中文域名转码后)
  • potato.nb = 英文内网域名

4. 主配置 /etc/dnsmasq.conf

完整可直接复制模板:

ini 复制代码
addn-hosts=/etc/dnsmasq.hosts
listen-address=0.0.0.0
bind-interfaces

# 私有内网后缀,仅内网解析,不转发公网
local=/xn--kbt444f/
local=/nb/

# 外网兜底公共DNS
server=223.5.5.5
server=114.114.114.114

5. 配置校验 + 生效

  1. 语法检测(出错直接报错,避免服务崩溃)
bash 复制代码
sudo dnsmasq --test
# 输出 dnsmasq: syntax check OK. 代表配置无误
  1. 重载服务(不中断现有解析)
bash 复制代码
sudo systemctl reload dnsmasq
  1. 查看运行状态确认正常
bash 复制代码
systemctl status dnsmasq

四、第三步:Nginx 搭建多域名本地站点

1. Nginx 站点配置

下载Nginx

bash 复制代码
sudo apt update && sudo apt install nginx -y

新建站点配置文件 /etc/nginx/sites-available/web

nginx 复制代码
server {
    listen 80;
    # 转码后的域名,多个域名空格隔开
    server_name xn--3pr45eyv6axfbb07ayjt.xn--kbt444f potato.nb;
    root /var/www/html;
    index index.html;
    charset utf-8; # 解决页面中文乱码
}

2. 网站目录权限修复(远程编辑不报错)

bash 复制代码
# 将当前用户加入Nginx运行组www-data
sudo usermod -aG www-data eofer

# 修正目录归属
sudo chown -R www-data:www-data /var/www/html

# 批量设置文件夹、文件权限
sudo find /var/www/html -type d -exec chmod 775 {} \;
sudo find /var/www/html -type f -exec chmod 664 {} \;

# 新建文件自动继承用户组(关键)
sudo chmod g+s /var/www/html

3. VS Code SSH 远程连接开发(不用 root 登录)

用 Remote-SSH 插件直连 Debian 主机,直接编辑网页文件:

连接命令模板:

bash 复制代码
ssh eofer@192.168.101.110 -A

连接后打开/var/www/html,新建 index.html,粘贴如下内容

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <!-- 这里的UTF-8编码不能少,不然网站显示中文可能出现乱码问题 -->
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>我的第一个Nginx页面,嘿嘿嘿~</h1>
    <p><a href="https://www.baidu.com">百度首页</a>,也是成功实现内网网站搭建嘞~</p>
</body>
</html>

或者好看点

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>🎉 我的 Nginx 服务器</title>
    <style>
        /* ---------- 全局重置 & 基础 ---------- */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            background: linear-gradient(145deg, #0b1120 0%, #1a253a 100%);
            font-family: 'Segoe UI', system-ui, -apple-system, 'PingFang SC', 'Microsoft YaHei', sans-serif;
            padding: 20px;
            position: relative;
            overflow-x: hidden;
        }

        /* ---------- 背景装饰光晕 ---------- */
        body::before {
            content: '';
            position: fixed;
            top: -40%;
            left: -20%;
            width: 80%;
            height: 80%;
            background: radial-gradient(circle, rgba(99, 140, 255, 0.12) 0%, transparent 70%);
            pointer-events: none;
            z-index: 0;
        }

        body::after {
            content: '';
            position: fixed;
            bottom: -30%;
            right: -20%;
            width: 70%;
            height: 70%;
            background: radial-gradient(circle, rgba(0, 255, 200, 0.08) 0%, transparent 70%);
            pointer-events: none;
            z-index: 0;
        }

        /* ---------- 主卡片 ---------- */
        .card {
            position: relative;
            z-index: 1;
            max-width: 780px;
            width: 100%;
            padding: 60px 50px;
            background: rgba(255, 255, 255, 0.05);
            backdrop-filter: blur(20px);
            -webkit-backdrop-filter: blur(20px);
            border-radius: 48px;
            border: 1px solid rgba(255, 255, 255, 0.08);
            box-shadow:
                0 40px 80px rgba(0, 0, 0, 0.6),
                inset 0 1px 0 rgba(255, 255, 255, 0.06);
            text-align: center;
            transition: transform 0.3s ease, box-shadow 0.4s ease;
        }

        .card:hover {
            transform: translateY(-6px);
            box-shadow:
                0 50px 100px rgba(0, 0, 0, 0.7),
                inset 0 1px 0 rgba(255, 255, 255, 0.08);
        }

        /* ---------- 徽标 / 图标 ---------- */
        .icon-wrapper {
            display: inline-block;
            font-size: 72px;
            line-height: 1;
            margin-bottom: 18px;
            animation: float 3.5s ease-in-out infinite;
            filter: drop-shadow(0 8px 24px rgba(99, 140, 255, 0.25));
        }

        @keyframes float {
            0%,
            100% {
                transform: translateY(0px);
            }
            50% {
                transform: translateY(-10px);
            }
        }

        /* ---------- 标题 ---------- */
        h1 {
            font-size: 2.8rem;
            font-weight: 700;
            color: #ffffff;
            letter-spacing: -0.02em;
            margin-bottom: 16px;
            background: linear-gradient(135deg, #f0f4ff 0%, #a8c8ff 100%);
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
            background-clip: text;
        }

        /* ---------- 状态标签 ---------- */
        .status-badge {
            display: inline-block;
            background: rgba(0, 255, 180, 0.12);
            border: 1px solid rgba(0, 255, 180, 0.20);
            padding: 6px 20px;
            border-radius: 100px;
            font-size: 0.85rem;
            font-weight: 500;
            color: #7ae6cf;
            letter-spacing: 0.3px;
            margin-bottom: 28px;
            backdrop-filter: blur(4px);
        }

        .status-badge .dot {
            display: inline-block;
            width: 8px;
            height: 8px;
            background: #3dffb6;
            border-radius: 50%;
            margin-right: 10px;
            animation: pulse-dot 2s ease-in-out infinite;
            box-shadow: 0 0 12px rgba(61, 255, 182, 0.5);
        }

        @keyframes pulse-dot {
            0%,
            100% {
                opacity: 1;
                transform: scale(1);
            }
            50% {
                opacity: 0.5;
                transform: scale(0.85);
            }
        }

        /* ---------- 描述文字 ---------- */
        .desc {
            font-size: 1.15rem;
            line-height: 1.8;
            color: rgba(255, 255, 255, 0.70);
            max-width: 520px;
            margin: 0 auto 34px;
            font-weight: 400;
        }

        .desc strong {
            color: rgba(255, 255, 255, 0.92);
            font-weight: 600;
        }

        /* ---------- 链接按钮 ---------- */
        .btn-link {
            display: inline-flex;
            align-items: center;
            gap: 12px;
            padding: 16px 40px;
            background: linear-gradient(135deg, #4a7cff, #6c5ce7);
            color: #ffffff;
            font-size: 1.1rem;
            font-weight: 600;
            text-decoration: none;
            border-radius: 60px;
            border: none;
            box-shadow: 0 8px 32px rgba(74, 124, 255, 0.35);
            transition: all 0.3s ease;
            letter-spacing: 0.3px;
            position: relative;
            overflow: hidden;
        }

        .btn-link::before {
            content: '';
            position: absolute;
            inset: 0;
            background: linear-gradient(135deg, #6c5ce7, #4a7cff);
            opacity: 0;
            transition: opacity 0.4s ease;
            border-radius: 60px;
        }

        .btn-link:hover::before {
            opacity: 1;
        }

        .btn-link:hover {
            transform: translateY(-3px) scale(1.02);
            box-shadow: 0 12px 44px rgba(74, 124, 255, 0.50);
        }

        .btn-link:active {
            transform: scale(0.97);
        }

        .btn-link span {
            position: relative;
            z-index: 1;
            display: flex;
            align-items: center;
            gap: 10px;
        }

        .btn-link .arrow {
            display: inline-block;
            transition: transform 0.3s ease;
        }

        .btn-link:hover .arrow {
            transform: translateX(6px) rotate(-4deg);
        }

        /* ---------- 页脚信息 ---------- */
        .footer-meta {
            margin-top: 38px;
            padding-top: 24px;
            border-top: 1px solid rgba(255, 255, 255, 0.06);
            display: flex;
            justify-content: center;
            gap: 28px;
            flex-wrap: wrap;
            font-size: 0.85rem;
            color: rgba(255, 255, 255, 0.30);
            letter-spacing: 0.3px;
        }

        .footer-meta span {
            display: flex;
            align-items: center;
            gap: 6px;
        }

        .footer-meta .badge-nginx {
            background: rgba(0, 150, 100, 0.15);
            color: #5ddfb0;
            padding: 2px 14px;
            border-radius: 100px;
            font-weight: 500;
            font-size: 0.75rem;
            border: 1px solid rgba(0, 200, 150, 0.10);
        }

        /* ---------- 响应式 ---------- */
        @media (max-width: 600px) {
            .card {
                padding: 38px 24px;
                border-radius: 32px;
            }

            h1 {
                font-size: 2.0rem;
            }

            .icon-wrapper {
                font-size: 54px;
            }

            .desc {
                font-size: 1.0rem;
            }

            .btn-link {
                padding: 14px 28px;
                font-size: 1.0rem;
                width: 100%;
                justify-content: center;
            }

            .footer-meta {
                flex-direction: column;
                align-items: center;
                gap: 12px;
            }
        }

        @media (max-width: 400px) {
            .card {
                padding: 28px 16px;
            }

            h1 {
                font-size: 1.6rem;
            }

            .icon-wrapper {
                font-size: 44px;
            }
        }
    </style>
</head>
<body>

    <div class="card">

        <!-- 图标(带浮动动画) -->
        <div class="icon-wrapper">🚀</div>

        <!-- 主标题 -->
        <h1>我的第一个 Nginx 页面</h1>

        <!-- 状态标签 -->
        <div class="status-badge">
            <span class="dot"></span>
            服务运行中 · 内网已部署
        </div>

        <!-- 描述文字 -->
        <p class="desc">
            嘿,真棒! 🎉 你已成功在<strong>内网环境</strong>搭建了自己的 Web 服务,
            这是属于你的第一个 Nginx 页面。
        </p>

        <!-- 链接按钮 -->
        <a href="https://www.baidu.com" class="btn-link" target="_blank">
            <span>
                前往百度首页
                <span class="arrow">→</span>
            </span>
        </a>

        <!-- 底部信息 -->
        <div class="footer-meta">
            <span>🖥️ 内网 IP · 192.168.x.x</span>
            <span class="badge-nginx">Nginx / 1.27</span>
            <span>⚡ 2026 · 自部署</span>
        </div>

    </div>

</body>
</html>

保存直接生效,无需反复输 sudo。

4. Nginx 配置校验 & 重载

bash 复制代码
# 语法检测
sudo nginx -t
# 重载服务
sudo systemctl reload nginx

五、完整落地操作流程(按顺序走不踩坑)

  1. 路由器修改 DHCP DNS 为 Debian 内网 IP,设备重连 WiFi

  2. Debian 安装 dnsmasq + 防火墙放行 53 端口,配置域名映射、私有后缀拦截

  3. 校验 dnsmasq 语法,重载服务

  4. 安装 Nginx,配置虚拟主机绑定域名,修复网站目录权限

  5. VS Code SSH 远程编写网页

  6. 客户端刷新 DNS 缓存,浏览器测试域名访问

六、这套方案 4 大核心优势

  1. 完全零成本:无域名租赁费、无云服务器开销,复用现有家用硬件

  2. 全设备兼容:电脑、手机、平板同一局域网,直接域名访问本地网站

  3. 公网隔离不冲突 :自定义.nb/.官网私有后缀,不会跳转到外网同名站点

  4. 拓展灵活:新增站点只需要在 hosts 追加域名、Nginx 补充 server_name 即可

七、高频踩坑避坑清单(90% 人都会出错)

  1. 路由器 WAN DNS 不能填内网 IP,否则路由直接联网报错,仅 DHCP DNS 填服务器 IP

  2. Linux 配置不支持原生中文域名,必须用 Punycode 转码后填写

  3. Windows ping 无法识别中文域名,测试解析用nslookup 转码域名 内网DNSIP,浏览器可直接输入中文域名打开

  4. 修改 dnsmasq/Nginx 配置后,先校验语法再重载,避免服务直接挂掉

  5. 终端中文乱码解决方案

bash 复制代码
# 安装中文字体
sudo apt install fonts-noto-cjk -y
# 临时编码修复
export LANG=C.UTF-8
  1. sudo 命令失效修复
bash 复制代码
su - # 切换root
apt update && apt install sudo
visudo
# 添加权限行:你的用户名 ALL=(ALL:ALL) ALL
# nano保存Ctrl+O,退出Ctrl+X;vim Esc :wq!
exit
  1. 修改域名后不生效,按这个顺序操作: ① sudo dnsmasq --test sudo nginx -t校验配置 ② sudo systemctl reload dnsmasq sudo systemctl reload nginx重载 ③ 查看服务状态确认运行 ④ Windows 管理员 PowerShell 清缓存:ipconfig /flushdns ⑤ 手机开关 WiFi 重连刷新缓存

  2. 下载速度太慢,配置国内源 清华源的使用说明 我这里给一个中科大的镜像源配置仅作参考,

(1)备份原有源文件

在修改源文件之前,建议先备份默认的源配置:

bash 复制代码
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

(2)替换为国内镜像源

根据需要选择合适的国内镜像源(如清华、中科大、阿里云等)。以下以清华镜像为例:

传统格式(/etc/apt/sources.list)

编辑 sources.list 文件:

bash 复制代码
sudo nano /etc/apt/sources.list

(3)完整配置内容如下:

bash 复制代码
#deb cdrom:[Debian GNU/Linux 13.6.0 _Trixie_ - Official amd64 NETINST with firmware 20260711-09:42]/ trixie contrib main non-free-firmware

deb http://mirrors.ustc.edu.cn/debian/ trixie main non-free-firmware contrib non-free
# deb-src http://mirrors.ustc.edu.cn/debian/ trixie main non-free-firmware

deb http://security.debian.org/debian-security trixie-security main non-free-firmware contrib non-free
# deb-src http://security.debian.org/debian-security trixie-security main non-free-firmware

# trixie-updates, to get updates before a point release is made;
# see https://www.debian.org/doc/manuals/debian-reference/ch02.en.html#_updates_and_backports
deb http://mirrors.ustc.edu.cn/debian/ trixie-updates main non-free-firmware contrib non-free
# deb-src http://mirrors.ustc.edu.cn/debian/ trixie-updates main non-free-firmware

# This system was installed using removable media other than
# CD/DVD/BD (e.g. USB stick, SD card, ISO image file).
# The matching "deb cdrom" entries were disabled at the end
# of the installation process.
# For information about how to configure apt package sources,
# see the sources.list(5) manual.

结尾碎碎念

整套流程全部是开源免费工具,没有任何付费环节,适合想玩本地网盘、静态博客、内网工具站的玩家。 新增站点只需要两行配置,维护起来特别省心,再也不用记一串数字 IP 访问本地服务。 有哪一步配置报错可以直接留言,我看到之后,挨个给你排查~😎

相关推荐
自进化Agent智能体1 小时前
Hermes Agent 消息网关——连接 20+ 聊天平台
后端
你为她披上外套时我正站在窗外1 小时前
subtitler v2.0:从稳健到极致
后端
吃饱了得干活2 小时前
实时弹幕应该怎么搞?一篇带你从入门到生产级实战
java·后端
用户0207199207722 小时前
WebSocket 从建立连接到稳定运行
后端
你为她披上外套时我正站在窗外2 小时前
subtitler v2.0 的零拷贝设计:从 2000 次分配到 0 次
后端
IT_陈寒2 小时前
Vite的静态资源路径搞得我头秃,原来这样配才对
前端·人工智能·后端
小刘数字化2 小时前
告别PPT:AR数据呈现如何重塑商业汇报体验
后端·restful
程序员爱钓鱼3 小时前
Rust match 模式匹配详解:比 if 更强大的条件分支
后端·rust
Java面试题总结3 小时前
Vue3流式调用大模型接口完整实践
后端·python