ImmortalWrt使用记录
安装virt-viewer
Section titled “安装virt-viewer”UTM使用SPICE共享剪切板
# 安装virt-vieweropkg install virt-viewer# virt-viewer 连接到 UTM 虚拟机# virt-viewer -c spice://127.0.0.1:5900virt-viewer spice://192.168.1.100:5900# virt-viewer没有的话, 可以使用tidy-viewerbrew install tidy-viewer# 连接到 UTM 虚拟机tidy-viewer -c spice://192.168.1.100:5900# 编辑网络配置文件vi /etc/config/network# 修改 LAN 接口设置config interface 'lan' option type 'bridge' option ifname 'eth0' option proto 'static' option ipaddr '192.168.5.1' # 修改为适合你的网段 option netmask '255.255.255.0' option gateway '192.168.5.254' # 设置网关 option dns '8.8.8.8 8.8.4.4' # 设置DNS# 重启服务/etc/init.d/network restart安装Argon主题
Section titled “安装Argon主题”# 更新软件包列表opkg update# 安装Argon主题opkg install luci-theme-argon安装基础磁盘管理
Section titled “安装基础磁盘管理”# 安装基础磁盘管理工具# opkg install block-mount kmod-fs-ext4opkg install block-mount
# 重启Web服务/etc/init.d/uhttpd restart安装高级磁盘管理 Web 界面
Section titled “安装高级磁盘管理 Web 界面”# 安装DiskMan及其依赖opkg install luci-app-diskman
# 安装必要的依赖包opkg install parted blkid e2fsprogs btrfs-progs smartmontools
# 重启Web服务/etc/init.d/uhttpd restart
# 要是有问题Failed to connect to ubus
# 安装 uhttpd-mod-ubus 模块opkg install uhttpd-mod-ubus
# 重启 uhttpd/etc/init.d/uhttpd restart# 再不行重启就好了在页面上操作吧[系统->挂载点], 不用下面的命令了
# 查看所有磁盘设备lsblk# 或者查看详细的磁盘信息fdisk -l# 或者查看详细的磁盘信息fdisk -l /dev/vda# 安装分区工具opkg install parted resize2fsopkg install losetup# 找到根文件系统的实际设备# 查找或创建循环设备LOOP_DEV=$(losetup -f)losetup "$LOOP_DEV" /dev/vda2
# 强制扩展文件系统resize2fs -f "$LOOP_DEV"
# 验证结果df -h
# 查看文件系统详细信息tune2fs -l /dev/vda2
# 重启系统reboot
# 查看当前分区情况parted /dev/vda print
# 扩展分区(假设根分区是第2个分区)parted /dev/vda resizepart 2 100%
# 扩展文件系统resize2fs /dev/vda2resize2fs /dev/root# 验证扩展df -h# 优化系统性能
# 清理临时文件rm -rf /tmp/*
# 清理opkg缓存rm -rf /var/cache/opkg/*# 要是下次update有lock文件不存在的问题mkdir -p /var/lock
# 清理日志文件rm -rf /var/log/*
# 优化文件系统e2fsck -f /dev/vda2resize2fs -f /dev/vda2# 问题 1:无法运行 e2fsck 检查# 配置启动时自动检查(推荐)
# 设置文件系统检查标志tune2fs -c 1 /dev/vda2
# 重启系统,系统会在启动时自动检查reboot
# 优化ext4文件系统tune2fs -o journal_data_writeback /dev/vda2tune2fs -m 1 /dev/vda2 # 设置预留空间为1%
# 监控磁盘健康状态
# 安装smartmontoolsopkg install smartmontools
# 检查磁盘健康状态smartctl -H /dev/vda安装 e2fsprogs 包来获取 tune2fs 工具
Section titled “安装 e2fsprogs 包来获取 tune2fs 工具”# 安装 e2fsprogs 包(包含 tune2fs)opkg install e2fsprogs
# 验证安装tune2fs --version
# 如果 e2fsprogs 不可用# 安装 parted 工具(替代方案)opkg install parted
# 使用 parted 查看磁盘信息parted -l /dev/vda- 浏览器访问
http://192.168.5.1(或你设置的IP) - 登录用户名:
root,密码:password(默认)
配置成旁路由
Section titled “配置成旁路由”[网络-接口-lan-DHCP服务器-忽略此接口]打勾-保存-保存并应用
将自己电脑的网关改成ImmortalWRT的IP(客户端将wifi/有线网络的网关设置成ImmortalWRT的IP地址即可)
不想手动修改网关的话,可以直接把主路由器的dhcp功能关闭,这样ImmortalWRT的dhcp就会介入分配局域网IP,只要连上主路由的设备都会自动将ImmortalWRT设为网关,但是这样的前提是mbp要24小时都开机
添加科学上网功能
搜索openclash,点击安装luci-app-openclash
让指定设备走旁路由
Section titled “让指定设备走旁路由”# 安装必要工具opkg install nmap arping iputils-ping dnsmasq iptables# 创建 IP 地址监控脚本cat > /root/monitor-ip.sh << 'EOF'#!/bin/bash
# 日志配置LOG_FILE="/var/log/network-manager.log"
# 日志函数log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"}
mkdir -p /etc/dnsmasq.d
# 配置文件路径DHCP_CONF="/etc/dnsmasq.d/dynamic-dhcp.conf"ARP_SCRIPT="/root/start-spoof.sh"IP_FILE="/tmp/current_ip.txt"
# 获取当前IP地址get_current_ip() { ip addr show br-lan | grep 'inet ' | awk '{print $2}' | cut -d'/' -f1}
# 初始化IP文件current_ip=$(get_current_ip)echo $current_ip > $IP_FILE
log "初始IP地址: $current_ip"log "启动IP监控服务..."
while true; do new_ip=$(get_current_ip) old_ip=$(cat $IP_FILE)
if [ "$new_ip" != "$old_ip" ] && [ -n "$new_ip" ]; then log "检测到IP地址变化: $old_ip -> $new_ip"
# 更新IP文件 echo $new_ip > $IP_FILE
# 更新DHCP配置 sed -i "s/dhcp-option=3,$old_ip/dhcp-option=3,$new_ip/g" $DHCP_CONF sed -i "s/dhcp-option=6,$old_ip/dhcp-option=6,$new_ip/g" $DHCP_CONF
# 更新ARP欺骗脚本 sed -i "s/PROXY_IP=\"$old_ip\"/PROXY_IP=\"$new_ip\"/g" $ARP_SCRIPT
# 重启相关服务 /etc/init.d/dnsmasq restart /root/restart-spoof.sh
log "IP地址已更新为: $new_ip" fi
sleep 30 # 每30秒检查一次doneEOF
chmod +x /root/monitor-ip.sh# 创建智能 IP 扫描脚本cat > /root/scan-network.sh << 'EOF'#!/bin/bash
# 日志配置LOG_FILE="/var/log/network-manager.log"
# 日志函数log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"}
# 网络配置# 获取完整的IP/CIDRIP_CIDR=$(ip addr show $(ip route show default | awk '{print $5}') | grep 'inet ' | awk '{print $2}')
# 拆分IP和CIDRIP=$(echo $IP_CIDR | cut -d'/' -f1)CIDR=$(echo $IP_CIDR | cut -d'/' -f2)
# 获取IP前缀IP_PREFIX=$(echo $IP | cut -d '.' -f 1-3)'.'
# 替换最后一位为0NETWORK=$(echo $IP | awk -F. '{print $1"."$2"."$3".0/"CIDR}')PROXY_IP=$(cat /tmp/current_ip.txt)GATEWAY=$(ip route show default | awk '{print $3}')
touch /tmp/used_ips.txt
mkdir -p /etc/dnsmasq.d
# 扫描结果文件SCAN_RESULT="/tmp/network_scan.txt"USED_IPS="/tmp/used_ips.txt"AVAILABLE_IPS="/tmp/available_ips.txt"
# 清理旧文件rm -f $SCAN_RESULT $USED_IPS $AVAILABLE_IPS
log "开始扫描网络: $NETWORK"
# 1. 使用nmap扫描活跃主机nmap -sn $NETWORK -oG $SCAN_RESULT > /dev/null 2>&1
# 2. 从扫描结果中提取IP地址grep "Up$" $SCAN_RESULT | awk '{print $2}' > $USED_IPS
# 3. 添加已知的重要IPecho $GATEWAY >> $USED_IPSecho $PROXY_IP >> $USED_IPS
# 4. 去重并排序sort -u $USED_IPS -o $USED_IPS
# 5. 生成可用IP范围($IP_PREFIX100-$IP_PREFIX250)for ip in $(seq 100 250); do current_ip="$IP_PREFIX$ip" if ! grep -q "$current_ip" $USED_IPS; then echo $current_ip >> $AVAILABLE_IPS fidone
# 6. 显示结果log "扫描完成:"log "已使用IP数量: $(wc -l < $USED_IPS)"log "可用IP数量: $(wc -l < $AVAILABLE_IPS)"
# 7. 更新DHCP配置if [ -s $AVAILABLE_IPS ]; then first_ip=$(head -n1 $AVAILABLE_IPS) last_ip=$(tail -n1 $AVAILABLE_IPS)
log "更新DHCP范围: $first_ip - $last_ip"
# 更新DHCP配置 - 添加手机MAC地址 cat > /etc/dnsmasq.d/dynamic-dhcp.conf << DHCP_EOFinterface=br-lanbind-interfacesdhcp-range=$first_ip,$last_ip,255.255.252.0,1hdhcp-option=3,$PROXY_IPdhcp-option=6,$PROXY_IPdhcp-authoritative
# 手机配置(固定IP)dhcp-host=d4:a3:65:89:69:9c,10.0.4.124,MyPhoneDHCP_EOF
# 重启DHCP服务 /etc/init.d/dnsmasq restart log "DHCP服务已重启"else log "警告: 没有可用IP地址!"fi
log "智能IP管理完成"EOF
chmod +x /root/scan-network.sh# 创建 ARP 监控脚本cat > /root/monitor-arp.sh << 'EOF'#!/bin/bash
# 日志配置LOG_FILE="/var/log/network-manager.log"
# 日志函数log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"}
# 监控间隔(秒)INTERVAL=60
# 临时文件ARP_CACHE="/tmp/arp_cache.txt"NEW_DEVICES="/tmp/new_devices.txt"
log "启动ARP监控服务..."
while true; do # 获取当前ARP缓存 ip neigh show | awk '/^10\.0\.4\./ {print $1" "$3}' > $ARP_CACHE
# 检查新设备 if [ -f /tmp/previous_arp.txt ]; then grep -Fxvf /tmp/previous_arp.txt $ARP_CACHE > $NEW_DEVICES
if [ -s $NEW_DEVICES ]; then log "发现新设备:" cat $NEW_DEVICES | while read line; do log " $line" done
# 触发IP扫描更新 log "触发网络扫描更新" /root/scan-network.sh fi fi
# 保存当前ARP缓存用于下次比较 cp $ARP_CACHE /tmp/previous_arp.txt
sleep $INTERVALdoneEOF
chmod +x /root/monitor-arp.sh# 创建 IP 冲突检测脚本cat > /root/check-conflict.sh << 'EOF'#!/bin/bash
# 日志配置LOG_FILE="/var/log/network-manager.log"
# 日志函数log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"}
# 检查IP冲突check_ip() { local ip=$1 arping -c 1 -w 1 $ip > /dev/null 2>&1 return $?}
# 检查DHCP分配的IPcheck_dhcp_leases() { LEASES_FILE="/var/lib/misc/dnsmasq.leases"
if [ -f $LEASES_FILE ]; then while read lease; do ip=$(echo $lease | awk '{print $3}') mac=$(echo $lease | awk '{print $2}') hostname=$(echo $lease | awk '{print $4}')
if check_ip $ip; then # 发现冲突,释放该IP log "发现IP冲突: $ip (MAC: $mac, 主机名: $hostname)" # 可以在这里实现自动释放和重新分配 fi done < $LEASES_FILE fi}
# 主程序log "检查IP冲突..."check_dhcp_leaseslog "冲突检查完成"EOF
chmod +x /root/check-conflict.sh# 设置定时任务# 使用 sleep 循环脚本cat > /root/start-monitors.sh << 'EOF'#!/bin/bash
# 日志配置LOG_FILE="/var/log/network-manager.log"
# 日志函数log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"}
log "启动监控服务主程序..."
# 初始扫描log "执行初始网络扫描"/root/scan-network.sh
# 主循环while true; do # 每小时执行一次网络扫描 log "执行定时网络扫描" /root/scan-network.sh
# 每10分钟检查一次IP冲突 for i in {1..6}; do log "检查IP冲突" /root/check-conflict.sh sleep 600 # 10分钟 donedoneEOF
chmod +x /root/start-monitors.sh# 添加 ARP 欺骗脚本cat > /root/start-spoof.sh << 'EOF'#!/bin/bash
# 日志配置LOG_FILE="/var/log/network-manager.log"
# 日志函数log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"}
# 网络配置INTERFACE="br-lan"GATEWAY=$(ip route show default | awk '{print $3}')PROXY_IP=$(cat /tmp/current_ip.txt)TARGET_IPS="10.0.4.124" # 手机IP
log "启动ARP欺骗服务..."log "接口: $INTERFACE"log "网关: $GATEWAY"log "旁路由IP: $PROXY_IP"log "目标设备: $TARGET_IPS"
# 启动ARP欺骗for ip in $TARGET_IPS; do arpspoof -i $INTERFACE -t $ip $GATEWAY & arpspoof -i $INTERFACE -t $GATEWAY $ip & log " 欺骗设备: $ip"done
log "ARP欺骗服务已启动"EOF
chmod +x /root/start-spoof.sh
cat > /root/restart-spoof.sh << 'EOF'#!/bin/bash
# 日志配置LOG_FILE="/var/log/network-manager.log"
# 日志函数log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"}
# 停止现有ARP欺骗进程killall arpspoof 2>/dev/nulllog "停止现有ARP欺骗进程"
# 获取当前配置PROXY_IP=$(cat /tmp/current_ip.txt)GATEWAY=$(ip route show default | awk '{print $3}')INTERFACE="br-lan"TARGET_IPS="10.0.4.124" # 手机IP
log "重启ARP欺骗服务..."log "当前IP: $PROXY_IP"log "网关: $GATEWAY"
# 启动新的ARP欺骗进程for ip in $TARGET_IPS; do arpspoof -i $INTERFACE -t $ip $GATEWAY & arpspoof -i $INTERFACE -t $GATEWAY $ip & log " 欺骗设备: $ip"done
log "ARP欺骗服务已重启"EOF
chmod +x /root/restart-spoof.sh# 启用 IP 转发echo "net.ipv4.ip_forward=1" >> /etc/sysctl.confsysctl -p# 配置防火墙# 允许IP转发# 配置防火墙转发uci set firewall.@zone[0].forward=ACCEPTuci set firewall.@zone[0].masq=1uci commit firewall/etc/init.d/firewall restart# 添加 NAT 规则# 创建NAT规则配置文件cat > /etc/nftables.d/nat-rules.nft << 'EOF'table ip nat { chain postrouting { type nat hook postrouting priority 100; policy accept; oifname "br-lan" masquerade; }}EOF
# 应用配置nft -f /etc/nftables.d/nat-rules.nft
/etc/init.d/firewall restart# 设置开机自启cat > /etc/rc.local << 'EOF'#!/bin/sh -e
# 等待网络就绪sleep 10
# 启动IP地址监控服务/root/monitor-ip.sh &
# 启动网络扫描/root/scan-network.sh &
# 启动ARP欺骗服务/root/start-spoof.sh &
# 启动ARP监控/root/monitor-arp.sh &
# 启动IP冲突检测/root/start-monitors.sh &
# 应用NAT规则nft -f /etc/nftables.d/nat-rules.nft
exit 0EOF
chmod +x /etc/rc.localcat > /root/start-all.sh << 'EOF'#!/bin/bash
echo "启动智能网络服务..."
# 启动IP监控/root/monitor-ip.sh &
# 启动网络扫描/root/scan-network.sh &
# 启动ARP监控/root/monitor-arp.sh &
echo "所有服务已启动"echo "当前IP: $(cat /tmp/current_ip.txt)"EOF
chmod +x /root/start-all.sh# 创建日志文件touch /var/log/network-manager.logchmod 666 /var/log/network-manager.log# 检查IP转发是否启用sysctl net.ipv4.ip_forward
# 检查nftables规则nft list ruleset
# 检查防火墙状态/etc/init.d/firewall status
# 检查NAT规则是否生效nft list table ip nat
# 测试网络连接ping -c 3 8.8.8.8
# 检查防火墙状态/etc/init.d/firewall status
# 测试旁路由功能# 检查所有服务是否正常运行ps | grep -E 'monitor-ip|scan-network|arpspoof|dnsmasq'
# 查看DHCP租约cat /var/lib/misc/dnsmasq.leases
# 查看ARP表arp -a
# 查看日志tail -f /var/log/network-manager.log# 日志查看方法# 实时查看日志tail -f /var/log/network-manager.log
# 查看特定服务日志grep "IP监控" /var/log/network-manager.loggrep "ARP欺骗" /var/log/network-manager.loggrep "DHCP" /var/log/network-manager.log# 测试和验证# 手动运行测试/root/scan-network.sh/root/start-spoof.sh
# 查看状态ps | grep -E 'monitor-ip|scan-network|arpspoof'cat /tmp/network_config.txtcat /etc/dnsmasq.d/dynamic-dhcp.conf# 可以看到IP和网关# 执行以下命令,直接查看当前路由表的默认网关ip route show default如果lan口获取失败
[服务-OpenClash-插件设置-流量控制-LAN 接口名称]选择系统可用的lan接口, 比如eth0或者br-lan