解决方法
– 在一级路由(OpenWrt)上通过 DHCP 静态绑定给二级路由分配 IP
– 不要在二级路由上直接配置静态 IP
– 配置好后重启二级路由
OpenWrt 防火墙规则(命令行方式)
如果你习惯用命令行配置 OpenWrt 防火墙,可以使用以下命令:
uci -q delete firewall.mdns
uci set firewall.mdns="rule"
uci set firewall.mdns.name="Allow-mDNS"
uci set firewall.mdns.src="*"
uci set firewall.mdns.src_port="5353"
uci set firewall.mdns.dest_ip="224.0.0.251"
uci set firewall.mdns.dest_port="5353"
uci set firewall.mdns.proto="udp"
uci set firewall.mdns.target="ACCEPT"
uci commit firewall
/etc/init.d/firewall restart
后
配置完 mDNS 已经几个月了,现在回想起来,这是我在 Homelab 中做的最有价值的优化之一。
带来的改变
管理效率提升
– 不再需要维护一个 IP 地址清单
– 设备迁移或重启后不用担心 IP 变化
– 写配置文件时直接用域名,可读性大大提升
实际案例
最近我重装了一台服务器,以前的流程是:
1. 安装系统
2. 登录路由器配置静态 IP 绑定
3. 更新所有相关配置文件中的 IP
4. 重启依赖这台服务器的其他服务
这篇文章介绍了在istoreos软路由中实现DoH(DNS over HTTPS)的步骤。由于系统仅支持IP形式的DNS,需通过安装https-dns-proxy及相关luci界面包实现。完成后可在网页“HTTPS DNS代理”中删除默认实例,新增如阿里和腾讯的服务提供商,并分别设置不同端口。引导DNS仅用于解析DoH地址,实际配置可在/etc/config/https-dns-proxy查看。文章提醒是否开启强制路由器DNS要根据实际需求决定,一般建议关闭。同时说明无需修改WAN、LAN DNS,因设备最终解析均通过DoH完成,从而实现加密安全的DNS服务。
这台路由器使用 Type-C 供电,拥有一个 2.5Gbps 的 WAN 口和一个 1Gbps 的 LAN 口,在此基础上还有一个 USB 口可用于打印机共享、挂载外接存储、安卓手机 USB 共享网络等多种用途。更让我心动的地方在于其小巧的体型,非常适合出差、旅行、短期租房等场景。考虑到接下来一段实习可能会有租房需求,于是便趁此机会果断下单了。
官方系统是基于 openwrt 定制的,功能比较单一,因此考虑刷入 openwrt 原版系统增加可玩性。在恩山无限论坛上发现已经有人编译了基于 Linux 6.6 版本的 OpenWRT 系统,这已经满足了 dae 的 Bind to LAN 功能的内核版本要求( >= 5.17 ),且 512MB 的内存大小刚好达到了推荐的最小内存大小,于是这 dae 肯定是要试着吃一吃的。如果成功了,这就是我手上第一台吃上大鹅的硬路由。
bdata set boot_wait=on bdata commit nvram set ssh_en=1 nvram set telnet_en=1 nvram set uart_en=1 nvram set boot_wait=on nvram commit sed -i 's/channel=.*/channel="debug"/g' /etc/init.d/dropbear /etc/init.d/dropbear restart
cat <<EOF > auto_ssh.sh #!/bin/sh auto_ssh_dir="/data/auto_ssh" host_key="/etc/dropbear/dropbear_rsa_host_key" host_key_bk="${auto_ssh_dir}/dropbear_rsa_host_key" unlock() { # Restore the host key. [ -f \$host_key_bk ] && ln -sf \$host_key_bk \$host_key # Enable telnet, ssh, uart and boot_wait. [ "\$(nvram get telnet_en)" = 0 ] && nvram set telnet_en=1 && nvram commit [ "\$(nvram get ssh_en)" = 0 ] && nvram set ssh_en=1 && nvram commit [ "\$(nvram get uart_en)" = 0 ] && nvram set uart_en=1 && nvram commit [ "\$(nvram get boot_wait)" = "off" ] && nvram set boot_wait=on && nvram commit [ "\$(uci -c /usr/share/xiaoqiang get xiaoqiang_version.version.CHANNEL)" != 'stable' ] && { uci -c /usr/share/xiaoqiang set xiaoqiang_version.version.CHANNEL='stable' uci -c /usr/share/xiaoqiang commit xiaoqiang_version.version 2>/dev/null } channel=\$(/sbin/uci get /usr/share/xiaoqiang/xiaoqiang_version.version.CHANNEL) if [ "\$channel" = "release" ]; then sed -i 's/channel=.*/channel="debug"/g' /etc/init.d/dropbear fi if [ -z "\$(pidof dropbear)" -o -z "\$(netstat -ntul | grep :22)" ]; then /etc/init.d/dropbear restart 2>/dev/null /etc/init.d/dropbear enable fi } install() { # unlock SSH. unlock # host key is empty, restart dropbear to generate the host key. [ -s \$host_key ] || /etc/init.d/dropbear restart 2>/dev/null # Backup the host key. if [ ! -s \$host_key_bk ]; then i=0 while [ \$i -le 30 ] do if [ -s \$host_key ]; then cp -f \$host_key \$host_key_bk 2>/dev/null break fi let i++ sleep 1s done fi # Add script to system autostart uci set firewall.auto_ssh=include uci set firewall.auto_ssh.type='script' uci set firewall.auto_ssh.path="\${auto_ssh_dir}/auto_ssh.sh" uci set firewall.auto_ssh.enabled='1' uci commit firewall echo -e "\033[32m SSH unlock complete. \033[0m" } uninstall() { # Remove scripts from system autostart uci delete firewall.auto_ssh uci commit firewall echo -e "\033[33m SSH unlock has been removed. \033[0m" } main() { [ -z "\$1" ] && unlock && return case "\$1" in install) install ;; uninstall) uninstall ;; *) echo -e "\033[31m Unknown parameter: \$1 \033[0m" return 1 ;; esac } main "\$@" EOF
chmod +x auto_ssh.sh
# 设置自动启动 uci set firewall.auto_ssh=include uci set firewall.auto_ssh.type='script' uci set firewall.auto_ssh.path='/data/auto_ssh/auto_ssh.sh' uci set firewall.auto_ssh.enabled='1' uci commit firewall
# 从文件中恢复MAC地址 restore_mac() { if [ -f "$MAC_FILE" ]; then SAVED_MAC=$(cat"$MAC_FILE") echo"从文件恢复MAC地址: $SAVED_MAC" ip linkset dev eth0 down ip linkset dev eth0 address "$SAVED_MAC" ip linkset dev eth0 up echo"已恢复MAC地址到eth0" else echo"MAC文件不存在,无法恢复MAC地址" fi }
# 检查参数并执行对应的操作 if [ "$1" = "save" ]; then save_mac elif [ "$1" = "restore" ]; then restore_mac else echo"用法: $0 {save|restore}" echo"save: 保存当前的MAC地址" echo"restore: 恢复之前保存的MAC地址" fi