用 J1900 小主机打造一台 All-in-One 校园网软路由:从零开始的完整记录

2433 字
12 分钟
用 J1900 小主机打造一台 All-in-One 校园网软路由:从零开始的完整记录

目录#

  1. 背景与需求
  2. 硬件清单
  3. 无显示器安装 Debian:Mac + UTM 虚拟机直装物理硬盘
  4. 校园网 SRun 网页认证自动化
  5. 变身无线 AP:hostapd + dnsmasq
  6. IPv6 双栈与 NAT66
  7. DNS 分流:校内域名走校内 DNS
  8. 开机自启与持久化
  9. 挂载 1TB 移动硬盘作为数据盘
  10. 踩坑记录与经验总结

背景与需求#

宿舍里有一台 J1900 小主机,原本只是准备做个轻量服务器。后来发现需求越来越多:

  • 校园网接入:宿舍只有有线网口,且需要网页认证
  • 无线共享:想要一个自己的 WiFi,让手机、平板都能上网
  • IPv6 支持:现代网络环境不能只有 IPv4
  • 私有存储:一块 1TB WD 移动硬盘想 24h 挂着当数据盘
  • 远程管理:没有显示器,必须全程无头操作

最终目标:让这台小主机成为宿舍里的网络中枢。

网络架构拓扑图
网络架构拓扑图


硬件清单#

组件型号备注
主机J1900 工控小主机4 核 4 线程,DDR3L 内存
系统盘Vaseky V850 128G SSDSATA 接口
无线网卡Intel Centrino Advanced-N 6205Mini PCIe,iwldvm 驱动
数据盘WD My Passport 1TBUSB 3.0,exFAT
网络宿舍有线网口需 SRun 网页认证

⚠️ 关于 Intel 6205 的坑:这是 2011 年的老卡,固件层面锁死了 5GHz AP 模式和 HT40。如果你想要真正的双频 AP,建议换 Intel AX200/AX210。

neofetch 示意图
neofetch 示意图


无显示器安装 Debian#

问题:没有显示器,怎么装系统?#

小主机没有 VGA/HDMI 输出可用(虽然有接口,但没显示器),所以走的是 “拆硬盘 + Mac 虚拟机直装” 的路子。

方案:Mac + UTM 虚拟机 + 物理硬盘直通#

核心思路:把目标硬盘通过 USB 硬盘盒接到 Mac,在 UTM 里跑一个 ARM Ubuntu 虚拟机,把硬盘直通给虚拟机,用 mmdebstrap 安装 x86_64 Debian 系统,装完再装回小主机。

关键步骤:

Terminal window
# 1. 在 ARM Ubuntu 虚拟机里安装必要工具
sudo apt install -y mmdebstrap qemu-user-binfmt binfmt-support
# 2. 挂载目标硬盘
sudo mount /dev/sda2 /mnt/target
sudo 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/target
apt 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 获取),然后加静态路由:

Terminal window
echo "10.50.254.136 net3.zju.edu.cn" | sudo tee -a /etc/hosts
sudo ip route replace 10.50.254.136 via 10.171.128.1 dev enp2s0

用开源脚本完成认证#

GitHub 上有现成的 zju-web-login 脚本:

Terminal window
git clone https://github.com/Mythologyli/zju-web-login.git /opt/zju-web-login
sudo pip3 install --break-system-packages requests requests-toolbelt

关键点:PC 网页认证的用户名不带 @a 后缀,直接用纯学号:

Terminal window
python3 weblogin.py login -u 3260104505 -p '你的密码' -i 10.171.201.10 --url "https://net3.zju.edu.cn"

封装成 systemd 服务#

/etc/systemd/system/zju-web-login.service
[Unit]
Description=ZJU SRun Web Login
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/zju-web-login.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

再加上一个 watchdog timer 每 3 分钟检查一次:

/etc/systemd/system/zju-web-login-watchdog.timer
[Timer]
OnBootSec=2min
OnUnitActiveSec=3min

变身无线 AP#

硬件确认#

先确认网卡支持 AP 模式:

Terminal window
/usr/sbin/iw list | grep -A 12 "Supported interface modes"
# 应该能看到 * AP

配置 hostapd#

/etc/hostapd/hostapd.conf
interface=wlp1s0
driver=nl80211
ssid=ZJUWLAN-Dangerous
hw_mode=g
channel=11
ieee80211n=1
wmm_enabled=1
multicast_to_unicast=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=jinitaimei
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

信道选择:用手机 WiFi 分析 App 扫描周边,选择最空闲的信道。我们扫描结果里 Ch11 只有 1 个弱 AP,所以用信道 11。

配置 dnsmasq#

/etc/dnsmasq.d/mybox-ap.conf
interface=wlp1s0
bind-dynamic
dhcp-range=192.168.50.100,192.168.50.200,255.255.255.0,24h
dhcp-option=3,192.168.50.1
dhcp-option=6,192.168.50.1

NAT 转发#

Terminal window
sudo iptables -t nat -A POSTROUTING -o enp2s0 -j MASQUERADE
sudo iptables -A FORWARD -i wlp1s0 -o enp2s0 -j ACCEPT
sudo 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.conf
sudo sysctl -p /etc/sysctl.d/99-ipforward.conf

让 NetworkManager 放手#

这是最大的坑:NetworkManager 会周期性地扫描 WiFi,每次扫描都会重置接口,导致 hostapd 的 AP 被打断。

Terminal window
# 永久忽略 wlp1s0
sudo tee /etc/NetworkManager/conf.d/99-unmanage-wlp1s0.conf <<'EOF'
[keyfile]
unmanaged-devices=interface-name:wlp1s0
EOF

IPv6 双栈与 NAT66#

为什么需要 NAT66?#

学校只给有线口分配了一个 /128 的 IPv6 地址(2001:da8:e000:9::ca1e/128),没有 /64 前缀可供分配。所以客户端只能用 ULA(Unique Local Address) 私有地址,通过小主机做 NAT66 出公网。

分配 ULA 地址#

Terminal window
sudo ip -6 addr add fd00:50::1/64 dev wlp1s0
sudo ip -6 addr add fe80::1/64 dev wlp1s0 scope link

⚠️ 关键点:RA(Router Advertisement)的源地址必须是 link-local,没有 fe80:: 的话 RA 根本发不出去。这是折腾了很久才发现的根因。

dnsmasq 只管 DHCPv6,radvd 负责 RA#

/etc/dnsmasq.d/mybox-ap-ipv6.conf
dhcp-range=fd00:50::100,fd00:50::200,64,24h
# enable-ra ← 注释掉,交给 radvd
dhcp-option=option6:dns-server,[fd00:50::1]
/etc/radvd.conf
interface wlp1s0
{
AdvSendAdvert on;
MinRtrAdvInterval 3;
MaxRtrAdvInterval 10;
prefix fd00:50::/64
{
AdvOnLink on;
AdvAutonomous on;
};
RDNSS fd00:50::1 { AdvRDNSSLifetime 600; };
};

IPv6 NAT66#

Terminal window
sudo ip6tables -t nat -A POSTROUTING -o enp2s0 -j MASQUERADE
sudo ip6tables -A FORWARD -i wlp1s0 -o enp2s0 -j ACCEPT
sudo 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.conf
sudo sysctl -p /etc/sysctl.d/99-ipv6forward.conf

客户端验证#

Mac 上连上 AP 后:

Terminal window
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 received

DNS 分流#

目标:访问 *.zju.edu.cn、*.cc98.org 这类校内域名时走校内 DNS,其他走公共 DNS。

# /etc/dnsmasq.d/mybox-ap.conf 追加
server=/zju.edu.cn/10.10.0.21
server=/zju.edu.cn/10.10.2.21
server=/cc98.org/10.10.0.21
server=/cc98.org/10.10.2.21
server=223.5.5.5
server=114.114.114.114

验证:

Terminal window
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 / radvdsystemd enabled
校园网认证systemd service + timer
fstab 挂载systemd mount unit

wlp1s0-setup.service#

[Unit]
Description=Setup wlp1s0 for AP mode
Before=hostapd.service radvd.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/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.target

hostapd 重启后自动补 IP#

给 hostapd.service 加 drop-in:

/etc/systemd/system/hostapd.service.d/override.conf
[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 不变):

Terminal window
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 2

3. 关于 exFAT 权限的坑:

内核 exFAT 驱动会忽略 fmask/dmask,无论如何都回退到默认的 0022(其他人可读)。要严格控制权限,必须换 exfat-fuse:

Terminal window
sudo apt install -y exfat-fuse exfatprogs
# fstab 里文件系统类型改成 exfat-fuse

4. 验证权限:

Terminal window
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。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或投喂支持!

投喂
用 J1900 小主机打造一台 All-in-One 校园网软路由:从零开始的完整记录
https://www.infvar.com/posts/j1900/
作者
Dignite
发布于
2026-10-18
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
Dignite
技术,学习,生活,旅行。
公告
欢迎来到我的博客!这是一则示例公告。
分类
标签
站点统计
文章
160
分类
5
标签
290
总字数
342,074
运行时长
0 天
最后活动
0 天前

目录