用 J1900 小主机打造一台 All-in-One 校园网软路由:从零开始的完整记录
目录
- 背景与需求
- 硬件清单
- 无显示器安装 Debian:Mac + UTM 虚拟机直装物理硬盘
- 校园网 SRun 网页认证自动化
- 变身无线 AP:hostapd + dnsmasq
- IPv6 双栈与 NAT66
- DNS 分流:校内域名走校内 DNS
- 开机自启与持久化
- 挂载 1TB 移动硬盘作为数据盘
- 踩坑记录与经验总结
背景与需求
宿舍里有一台 J1900 小主机,原本只是准备做个轻量服务器。后来发现需求越来越多:
- 校园网接入:宿舍只有有线网口,且需要网页认证
- 无线共享:想要一个自己的 WiFi,让手机、平板都能上网
- IPv6 支持:现代网络环境不能只有 IPv4
- 私有存储:一块 1TB WD 移动硬盘想 24h 挂着当数据盘
- 远程管理:没有显示器,必须全程无头操作
最终目标:让这台小主机成为宿舍里的网络中枢。

硬件清单
| 组件 | 型号 | 备注 |
|---|---|---|
| 主机 | J1900 工控小主机 | 4 核 4 线程,DDR3L 内存 |
| 系统盘 | Vaseky V850 128G SSD | SATA 接口 |
| 无线网卡 | Intel Centrino Advanced-N 6205 | Mini PCIe,iwldvm 驱动 |
| 数据盘 | WD My Passport 1TB | USB 3.0,exFAT |
| 网络 | 宿舍有线网口 | 需 SRun 网页认证 |
⚠️ 关于 Intel 6205 的坑:这是 2011 年的老卡,固件层面锁死了 5GHz AP 模式和 HT40。如果你想要真正的双频 AP,建议换 Intel AX200/AX210。

无显示器安装 Debian
问题:没有显示器,怎么装系统?
小主机没有 VGA/HDMI 输出可用(虽然有接口,但没显示器),所以走的是 “拆硬盘 + Mac 虚拟机直装” 的路子。
方案:Mac + UTM 虚拟机 + 物理硬盘直通
核心思路:把目标硬盘通过 USB 硬盘盒接到 Mac,在 UTM 里跑一个 ARM Ubuntu 虚拟机,把硬盘直通给虚拟机,用 mmdebstrap 安装 x86_64 Debian 系统,装完再装回小主机。
关键步骤:
# 1. 在 ARM Ubuntu 虚拟机里安装必要工具sudo apt install -y mmdebstrap qemu-user-binfmt binfmt-support
# 2. 挂载目标硬盘sudo mount /dev/sda2 /mnt/targetsudo mount /dev/sda1 /mnt/target/boot/efi
# 3. 用 mmdebstrap 安装基础系统(ISO 作为源)sudo mmdebstrap --arch=amd64 --mode=root \ --skip=check/signed-by \ --hook-dir=/usr/share/mmdebstrap/hooks/file-mirror-automount \ --aptopt='Acquire::AllowInsecureRepositories "true";' \ --aptopt='APT::Get::AllowUnauthenticated "true";' \ trixie /mnt/target file:///mnt/debian-iso
# 4. chroot 进去配置sudo chroot /mnt/targetapt install -y linux-image-amd64 grub-efi-amd64 systemd-sysv \ openssh-server wpasupplicant sudo vim踩过的坑:
debootstrap在 Debian 13 上有 SHA512 校验 bug,改用mmdebstrap解决file://源在 chroot 内需要--hook-dir自动 bind-mount- 需要
Acquire::AllowInsecureRepositories才能绕过签名校验
装回小主机后
装好硬盘、接上网线、开机,通过 Mac 的互联网共享扫描网段找到小主机 IP,ssh diyanqi@192.168.x.x 就能进去了。
校园网 SRun 网页认证自动化
问题:校园网要网页认证,服务器怎么自动登录?
浙大宿舍有线网使用 SRun 深澜认证系统,需要访问 net3.zju.edu.cn 输入学号密码。
认证服务器的定位
先找到认证服务器 IP(从 Mac 上 nslookup net3.zju.edu.cn 获取),然后加静态路由:
echo "10.50.254.136 net3.zju.edu.cn" | sudo tee -a /etc/hostssudo ip route replace 10.50.254.136 via 10.171.128.1 dev enp2s0用开源脚本完成认证
GitHub 上有现成的 zju-web-login 脚本:
git clone https://github.com/Mythologyli/zju-web-login.git /opt/zju-web-loginsudo pip3 install --break-system-packages requests requests-toolbelt关键点:PC 网页认证的用户名不带 @a 后缀,直接用纯学号:
python3 weblogin.py login -u 3260104505 -p '你的密码' -i 10.171.201.10 --url "https://net3.zju.edu.cn"封装成 systemd 服务
[Unit]Description=ZJU SRun Web LoginAfter=network-online.targetWants=network-online.target
[Service]Type=oneshotExecStart=/usr/local/bin/zju-web-login.shRemainAfterExit=yes
[Install]WantedBy=multi-user.target再加上一个 watchdog timer 每 3 分钟检查一次:
[Timer]OnBootSec=2minOnUnitActiveSec=3min变身无线 AP
硬件确认
先确认网卡支持 AP 模式:
/usr/sbin/iw list | grep -A 12 "Supported interface modes"# 应该能看到 * AP配置 hostapd
interface=wlp1s0driver=nl80211ssid=ZJUWLAN-Dangeroushw_mode=gchannel=11ieee80211n=1wmm_enabled=1multicast_to_unicast=0macaddr_acl=0auth_algs=1ignore_broadcast_ssid=0wpa=2wpa_passphrase=jinitaimeiwpa_key_mgmt=WPA-PSKrsn_pairwise=CCMP信道选择:用手机 WiFi 分析 App 扫描周边,选择最空闲的信道。我们扫描结果里 Ch11 只有 1 个弱 AP,所以用信道 11。
配置 dnsmasq
interface=wlp1s0bind-dynamicdhcp-range=192.168.50.100,192.168.50.200,255.255.255.0,24hdhcp-option=3,192.168.50.1dhcp-option=6,192.168.50.1NAT 转发
sudo iptables -t nat -A POSTROUTING -o enp2s0 -j MASQUERADEsudo iptables -A FORWARD -i wlp1s0 -o enp2s0 -j ACCEPTsudo iptables -A FORWARD -i enp2s0 -o wlp1s0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# 开启转发echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-ipforward.confsudo sysctl -p /etc/sysctl.d/99-ipforward.conf让 NetworkManager 放手
这是最大的坑:NetworkManager 会周期性地扫描 WiFi,每次扫描都会重置接口,导致 hostapd 的 AP 被打断。
# 永久忽略 wlp1s0sudo tee /etc/NetworkManager/conf.d/99-unmanage-wlp1s0.conf <<'EOF'[keyfile]unmanaged-devices=interface-name:wlp1s0EOFIPv6 双栈与 NAT66
为什么需要 NAT66?
学校只给有线口分配了一个 /128 的 IPv6 地址(2001:da8:e000:9::ca1e/128),没有 /64 前缀可供分配。所以客户端只能用 ULA(Unique Local Address) 私有地址,通过小主机做 NAT66 出公网。
分配 ULA 地址
sudo ip -6 addr add fd00:50::1/64 dev wlp1s0sudo ip -6 addr add fe80::1/64 dev wlp1s0 scope link⚠️ 关键点:RA(Router Advertisement)的源地址必须是 link-local,没有
fe80::的话 RA 根本发不出去。这是折腾了很久才发现的根因。
dnsmasq 只管 DHCPv6,radvd 负责 RA
dhcp-range=fd00:50::100,fd00:50::200,64,24h# enable-ra ← 注释掉,交给 radvddhcp-option=option6:dns-server,[fd00:50::1]interface wlp1s0{ AdvSendAdvert on; MinRtrAdvInterval 3; MaxRtrAdvInterval 10;
prefix fd00:50::/64 { AdvOnLink on; AdvAutonomous on; };
RDNSS fd00:50::1 { AdvRDNSSLifetime 600; };};IPv6 NAT66
sudo ip6tables -t nat -A POSTROUTING -o enp2s0 -j MASQUERADEsudo ip6tables -A FORWARD -i wlp1s0 -o enp2s0 -j ACCEPTsudo ip6tables -A FORWARD -i enp2s0 -o wlp1s0 -m state --state RELATED,ESTABLISHED -j ACCEPT
echo "net.ipv6.conf.all.forwarding=1" | sudo tee /etc/sysctl.d/99-ipv6forward.confsudo sysctl -p /etc/sysctl.d/99-ipv6forward.conf客户端验证
Mac 上连上 AP 后:
ifconfig en0 | grep inet6# inet6 fd00:50::85a:3b3c:5b99:2202 prefixlen 64 autoconf secured
ping6 -c 3 2400:3200::1# 3 packets transmitted, 3 packets receivedDNS 分流
目标:访问 *.zju.edu.cn、*.cc98.org 这类校内域名时走校内 DNS,其他走公共 DNS。
# /etc/dnsmasq.d/mybox-ap.conf 追加server=/zju.edu.cn/10.10.0.21server=/zju.edu.cn/10.10.2.21server=/cc98.org/10.10.0.21server=/cc98.org/10.10.2.21server=223.5.5.5server=114.114.114.114验证:
nslookup www.zju.edu.cn# Address: 10.203.4.70 ← 校内 IP
nslookup www.baidu.com# Address: 153.3.238.28 ← 公网 IP开机自启与持久化
需要持久化的东西
| 项目 | 方式 |
|---|---|
| iptables/ip6tables 规则 | netfilter-persistent |
| wlp1s0 地址 + NM 放手 | 自定义 wlp1s0-setup.service |
| hostapd / dnsmasq / radvd | systemd enabled |
| 校园网认证 | systemd service + timer |
| fstab 挂载 | systemd mount unit |
wlp1s0-setup.service
[Unit]Description=Setup wlp1s0 for AP modeBefore=hostapd.service radvd.service
[Service]Type=oneshotRemainAfterExit=yesExecStart=/bin/bash -c '\ nmcli device set wlp1s0 managed no 2>/dev/null || true; \ ip link set wlp1s0 up; \ sleep 1; \ ip addr replace 192.168.50.1/24 dev wlp1s0; \ ip -6 addr replace fd00:50::1/64 dev wlp1s0; \ ip -6 addr replace fe80::1/64 dev wlp1s0 scope link'
[Install]WantedBy=multi-user.targethostapd 重启后自动补 IP
给 hostapd.service 加 drop-in:
[Service]ExecStartPost=/bin/bash -c 'sleep 2; systemctl restart wlp1s0-setup.service'这样重启 hostapd 后,IP 地址会自动补回,不会出现”有 WiFi 但没网”。
挂载移动硬盘
需求
一块 WD My Passport 1TB 移动硬盘(exFAT 格式),里面有 660G 重要数据,需要保留并 24h 挂载。
关键操作
1. 用 UUID 挂载(设备名会变,UUID 不变):
sudo blkid /dev/sdc2# UUID="D1D3-C2B3"2. 写入 fstab:
UUID=D1D3-C2B3 /mnt/wd exfat-fuse defaults,nofail,noatime,uid=1000,gid=1000,fmask=0007,dmask=0007,iocharset=utf8 0 23. 关于 exFAT 权限的坑:
内核 exFAT 驱动会忽略 fmask/dmask,无论如何都回退到默认的 0022(其他人可读)。要严格控制权限,必须换 exfat-fuse:
sudo apt install -y exfat-fuse exfatprogs# fstab 里文件系统类型改成 exfat-fuse4. 验证权限:
ls -ld /mnt/wd# drwxrwx--- ← 770,其他人无法进入几个注意点
nofail:硬盘不在也能正常开机,不会卡住noatime:减少写入,延长寿命uid=1000,gid=1000:让普通用户可以读写
踩坑记录
1. UTM 虚拟机 USB 直通不稳定
用 UTM 直通 USB 硬盘时,大量写入会触发 USB disconnect。解决:改用 VMware Fusion,或者在物理小主机上直接操作(不要经过虚拟机)。
2. debootstrap 在 Debian 13 上的校验 bug
debootstrap 会优先用 Release 文件里的 SHA512,但 DVD 的 Packages 文件只提供 SHA256,导致校验失败。解决:改用 mmdebstrap。
3. NetworkManager 干扰 AP
NM 会周期性扫描,每次扫描都重置接口,导致 AP 被打断。解决:/etc/NetworkManager/conf.d/99-unmanage-wlp1s0.conf 里永久忽略。
4. RA 发不出去
折腾了很久,抓包能看到客户端的 RS 请求,但小主机不回 RA。根因:wlp1s0 没有 fe80:: link-local 地址,RA 源地址必须是 link-local。解决:手动加 fe80::1/64。
5. hostapd 重启丢 IP
重启 hostapd 时内核会清掉接口上的 IPv4/IPv6 地址。解决:给 hostapd.service 加 ExecStartPost 自动补回。
6. exFAT 权限控制
内核 exFAT 驱动忽略 fmask/dmask,无法限制其他用户访问。解决:改用 exfat-fuse。
7. Intel 6205 的硬件限制
- 5GHz 所有信道都是
no IR,AP 模式不可用 - HT40 不支持
- 发射功率锁死 15 dBm
- 解决:换 Intel AX200/AX210
最终架构
┌─────────────────────────────────────────────────┐│ J1900 小主机 ││ ││ ┌──────────────┐ ┌────────────────┐ ││ │ wlp1s0 │ │ enp2s0 │ ││ │ AP 模式 │ │ 校园网有线 │ ││ │ 192.168.50.1 │ │ 10.171.201.10 │ ││ │ fd00:50::1 │ │ │ ││ └──────┬───────┘ └───────┬────────┘ ││ │ │ ││ │ ┌───────────────┐ │ ││ └───▶│ dnsmasq │ │ ││ │ DHCP + DNS │ │ ││ │ 分流 │ │ ││ └───────┬───────┘ │ ││ │ │ ││ ┌───────▼───────┐ │ ││ │ iptables │ │ ││ │ NAT66/NAT44 │◀────┘ ││ └───────┬───────┘ ││ │ ││ ┌───────▼───────┐ ││ │ 校园网出口 │ ││ │ (SRun 认证) │ ││ └───────────────┘ ││ ││ 数据盘:/mnt/wd (exFAT 1TB, 770) │└─────────────────────────────────────────────────┘总结
一台 2013 年的 J1900 小主机,在没有任何显示器的情况下,从装系统开始,一步步变成了:
- ✅ 校园网自动认证的软路由
- ✅ 支持 IPv4/IPv6 双栈的无线路由器
- ✅ 带 DNS 分流的智能网关
- ✅ 24h 挂载 1TB 数据盘的私有存储
- ✅ 完全无头、重启自动恢复的稳定服务器
整个过程踩了不少坑,但每一坑都对应一个明确的技术原理。最重要的经验是:
不要迷信”某项功能不支持”,先抓包、看日志、看内核参数。很多”玄学问题”其实都有明确的根因。
如果你也在折腾类似的项目,希望这篇记录能帮你少走点弯路。
附录:关键文件清单
/opt/zju-web-login/weblogin.py # SRun 认证核心/usr/local/bin/zju-web-login.sh # 认证封装脚本/etc/systemd/system/ ├── zju-web-login.service ├── zju-web-login-watchdog.{service,timer} ├── wlp1s0-setup.service └── hostapd.service.d/override.conf/etc/hostapd/hostapd.conf # AP 配置/etc/dnsmasq.d/ ├── mybox-ap.conf # IPv4 + DNS 分流 └── mybox-ap-ipv6.conf # IPv6 DHCPv6/etc/radvd.conf # IPv6 RA/etc/iptables/rules.v{4,6} # NAT 持久化/etc/NetworkManager/conf.d/99-unmanage-wlp1s0.conf/etc/fstab # 硬盘挂载本文记录于 2026 年 10 月,涉及 Debian 13 (trixie)、hostapd 2.10、dnsmasq 2.91。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或投喂支持!
无穷量?