很久前就搞定了光猫桥接,路由拨号,连网线电脑上能看组播,一直想实现全家设备都能看iptv,但由于没更新路由,就搁浅了,前端时间嫖了朋友二手的红米AX6000就开始折腾了,本来想刷open的,但想着官方固件本来就是open系统,正常情况下官方应该是最稳的,如果能在官方固件的基础上搞定组播转单播那不美哉,于是开始了一周的折腾之旅(以下都是基于红米AX6000官方固件,很多部分理论上红米、小米系列通用,请自测)。。。。。
首先解锁SSH
本帖隐藏的内容这部分搬用论坛里大佬的帖子
浏览器访问路由器设置
示例:
192.168.31.1/cgi-bin/luci/;stok=60522452fadf088a65c6bf93645282a1/web/home#router
复制出
http://192.168.31.1/cgi-bin/luci ... 88a65c6bf93645282a1
1.开启开发/调试模式 {示例复制的内容添加到下面命令行的前面}
/api/misystem/set_sys_time?timezone=%20%27%20%3B%20zz%3D%24%28dd%20if%3D%2Fdev%2Fzero%20bs%3D1%20count%3D2%202%3E%2Fdev%2Fnull%29%20%3B%20printf%20%27%A5%5A%25c%25c%27%20%24zz%20%24zz%20%7C%20mtd%20write%20-%20crash%20%3B%20
2.重启 {示例复制的内容添加到下面命令行的前面}
/api/misystem/set_sys_time?timezone=%20%27%20%3b%20reboot%20%3b%20
3.设置Bdata永久开启telnet
在浏览器上重新登陆路由器,再次复制浏览器部分添加到下面命令的前面
/api/misystem/set_sys_time?timezone=%20%27%20%3B%20bdata%20set%20telnet_en%3D1%20%3B%20bdata%20set%20ssh_en%3D1%20%3B%20bdata%20set%20uart_en%3D1%20%3B%20bdata%20commit%20%3B%20
4.重启 {示例复制的内容添加到下面命令行的前面}
/api/misystem/set_sys_time?timezone=%20%27%20%3b%20reboot%20%3b%20
此时重启后可以通过telnet连接192.168.31.1,无需密码即可登录
在Windows 10上使用Telnet连接到192.168.31.1,你可以按照以下步骤进行操作:
按下Win键 + R键,然后输入 control panel 并按 Enter 键来打开控制面板。
在控制面板中,选择 "程序" -> "程序和功能" -> "启用或关闭Windows功能"。
在弹出的窗口中,找到并勾选 "Telnet客户端",然后点击 "确定"。这样会安装Telnet客户端。
打开命令提示符:
按下Win键 + R键,输入 cmd 并按 Enter 键,打开命令提示符。输入telnet 192.168.31.1 回车
安卓手机上可下载JuiceSSH,点击快速连接,弹出框里类型改为telnet,输入192.168.31.1
开启SSH
1.修改root密码为admin(可以定义密码)
echo -e 'admin\nadmin' | passwd root
2.固化SSH
nvram set ssh_en=1
nvram set telnet_en=1
nvram set uart_en=1
nvram set boot_wait=on
nvram commit
4.永久开启SSH(重启不会关闭)
mkdir /data/auto_ssh && cd /data/auto_ssh
curl -O https://cdn.jsdelivr.net/gh/lemoeo/AX6S@main/auto_ssh.sh
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
5.修改时区设置
uci set system.@system[0].timezone='CST-8'
uci set system.@system[0].webtimezone='CST-8'
uci set system.@system[0].timezoneindex='2.84'
uci commit
6.关闭开发/调试模式
mtd erase crash
7重启
reboot
如果有问题在参考
https://www.right.com.cn/forum/thread-8253125-1-1.html
这个帖子来一遍
安装msd_lite
本帖隐藏的内容root根目录下执行命令
[color=rgb(51, 102, 153) !important]复制代码
(2024年8月12日更新至msd_lite至最新版1.11.0,播放更流畅)
msd_lite.conf配置文件说明
这段为监听的端口
<bind><address>0.0.0.0:9088</address><fAcceptFilter>y</fAcceptFilter></bind>
<bind><address>[::]:9088</address></bind>
这段的br-lan为组播的网卡接口,根据自己的情况修改
<ifName>br-lan</ifName> <!-- For multicast receive. -->
首先执行下./msd_lite看能不能成功执行,没问题后执行命令后台守护运行
/data/msd_lite/msd_lite -d -c /data/msd_lite/msd_lite.conf
命令ps确定下程序有没后台运行
最后把命令/data/msd_lite/msd_lite -d -c /data/msd_lite/msd_lite.conf设置为开机自运行(后面会讲到)
安装ddns-go
搞定了msd,内网能看iptv了,我外网也想看,怎么办?搞定安装ddns-go就行了
正常家庭网络都是有ipv6公网,想实现ipv6和ipv4双栈,联通可以打客服电话免费开通ipv4动态公网ip。
没有域名的可以先去dynv6注册号,用免费的二级域名,不建站的够用了,主打就是省钱!!
本帖隐藏的内容root根目录下执行命令
[color=rgb(51, 102, 153) !important]复制代码
首次启动命令
/data/ddns-go/ddns-go -l :9876 -f 80 -cacheTimes 40 -c /data/ddns-go/ddns-go.yaml -s install
参数说明
管理端口9876,每 80 秒检查一次本地 IP 变化, 40次后也就是3200秒和域名商对比一下 IP 变化,这些参数根据自己需求改
卸载命令
/data/ddns-go/ddns-go -s uninstall
访问192.168.31.9876进行配置
首次10分钟内要配置完,不然要卸载重装,具体配置这里不多说了,网上一堆教程
非首次启动
/data/ddns-go/ddns-go -l :9876 -f 80 -cacheTimes 40 -c /data/ddns-go/ddns-go.yaml
最后把命令/data/ddns-go/ddns-go -l :9876 -f 80 -cacheTimes 40 -c /data/ddns-go/ddns-go.yaml设置开机自自运行(后面会讲到)
下面说一个不用安装ddns-go 也能解析dynv6二级域名的简单方法,因为我主要是为了省那么一丢丢运存,老规矩先上脚本
vim /data/gengxin-dynv6.sh
脚本代码- # 下面的代码同时更新ipv6和ipv4地址,并且运行30次后强制更新一次(其实没必要强制更新)
- #!/bin/sh -e
- # 配置信息
- hostname='1234567' # 修改为你的 dynv6 注册的二级域名
- token='34567890' # 修改为你的 dynv6 token
- file_v6=/tmp/.dynv6.addr6
- file_v4=/tmp/.dynv6.addr4
- file_err=/tmp/.dynv6.addr.log
- file_count=/tmp/.dynv6.run_count
- # 初始化运行次数文件
- if [ ! -f "$file_count" ]; then
- echo 0 > $file_count
- fi
- # 读取运行次数
- run_count=$(cat $file_count)
- # 获取 IPv6 地址
- address_v6=$(ip -6 addr list scope global pppoe-wan | grep -v " fd" | sed -n 's/.*inet6 \([0-9a-f:]\+\).*/\1/p' | head -n 1)
- if [ -n "$address_v6" ]; then
- # 检查 IPv6 地址是否变化
- [ -e $file_v6 ] && old_v6=$(cat $file_v6)
- current_v6=$address_v6
- if [ "$old_v6" != "$current_v6" ]; then
- # 更新 dynv6 IPv6 记录
- curl -s "http://dynv6.com/api/update?hostname=$hostname&ipv6=$current_v6&token=$token"
- echo $current_v6 > $file_v6
- echo "$(date '+%Y-%m-%d %H:%M:%S'): 更新 IPv6 地址为 $current_v6" >> $file_err
- else
- echo "IPv6 地址未变化: $current_v6"
- fi
- else
- echo "$(date '+%Y-%m-%d %H:%M:%S'): 未找到 IPv6 地址"
- echo "$(date '+%Y-%m-%d %H:%M:%S'): 未找到 IPv6 地址" >> $file_err
- fi
- # 获取 IPv4 地址
- ipv4_sources="https://myip.ipip.net https://ddns.oray.com/checkip https://ip.3322.net https://4.ipw.cn"
- address_v4=""
- for url in $ipv4_sources; do
- address_v4=$(curl -s $url | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}')
- if [ -n "$address_v4" ]; then
- echo "通过 $url 成功获取到 IPv4 地址: $address_v4"
- break
- fi
- done
- if [ -z "$address_v4" ]; then
- echo "$(date '+%Y-%m-%d %H:%M:%S'): 未能获取有效的 IPv4 地址"
- echo "$(date '+%Y-%m-%d %H:%M:%S'): 未能获取有效的 IPv4 地址" >> $file_err
- exit 1
- fi
- # 检查 IPv4 地址是否变化
- [ -e $file_v4 ] && old_v4=$(cat $file_v4)
- current_v4=$address_v4
- if [ "$old_v4" != "$current_v4" ] && [ -n "$current_v4" ]; then
- # 更新 dynv6 IPv4 记录
- curl -s "http://dynv6.com/api/update?hostname=$hostname&ipv4=$current_v4&token=$token"
- echo $current_v4 > $file_v4
- echo "$(date '+%Y-%m-%d %H:%M:%S'): 更新 IPv4 地址为 $current_v4" >> $file_err
- else
- echo "IPv4 地址未变化: $current_v4"
- fi
- # 更新运行次数
- run_count=$((run_count + 1))
- echo $run_count > $file_count
- # 如果运行次数达到30次,则强制更新IPv6和IPv4地址,并将运行次数清零
- if [ $run_count -eq 30 ]; then
- echo "已达到30次运行,强制更新IPv6和IPv4地址"
- # 更新 IPv6 地址
- if [ -n "$current_v6" ]; then
- curl -s "http://dynv6.com/api/update?hostname=$hostname&ipv6=$current_v6&token=$token"
- echo $current_v6 > $file_v6
- echo "$(date '+%Y-%m-%d %H:%M:%S'): 强制更新 IPv6 地址为 $current_v6" >> $file_err
- fi
- # 更新 IPv4 地址
- if [ -n "$current_v4" ]; then
- curl -s "http://dynv6.com/api/update?hostname=$hostname&ipv4=$current_v4&token=$token"
- echo $current_v4 > $file_v4
- echo "$(date '+%Y-%m-%d %H:%M:%S'): 强制更新 IPv4 地址为 $current_v4" >> $file_err
- fi
- # 重置运行次数
- echo 0 > $file_count
- fi
[color=rgb(51, 102, 153) !important]复制代码
给脚本权限chmod +x /data/gengxin-dynv6.sh
最后,设置脚本开机自运行(后面会讲到)
远程访问路由器web管理页面
路由后台设置里把添加添加端口映射,把内部的8080端口映射到其他端口就行了,因端口映射只针对ipv4有效,此种方法只适合有ipv4公网ip的。如果只有ipv6暂时没找到办法,起初尝试nginx反代,但一直不成功,小米应该是把80和8080端口做有限制。
解决了ddns go, 为何用域名外网还是看不了?那是因为没开放路由器的端口
本帖隐藏的内容添加IPV6防火墙放行规则
- ip6tables -L | grep "tcp dpt:9088"; [ $? != 0 ] && echo "add port" && ip6tables -I INPUT -p tcp --dport 9088 -j ACCEPT
[color=rgb(51, 102, 153) !important]复制代码
把这个命令设置开机自自运行(后面会讲到)
ipv4比较简单,路由后台设置里把9088端口映射出去就行了。
最近有小伙伴私信我怕把单播转发到公网后被人撸的厉害,影响家里局域网的网速体验,有没有解决方案?
本帖隐藏的内容针对这个问题首先说明下,其实只要你平常不怎么公开分享就私人或者几个朋友用,宽带的上行有50m以上一般是没啥大问题的。
路由器的QOS限速只针对路由下游的设备有效,对路由本身是无效的,所有可以采用tc的方式限速。
新建脚本vim /data/msd_lite_xiansu.sh
脚本代码- #!/bin/sh
- /sbin/tc qdisc add dev pppoe-wan root handle 1: htb default 10
- /sbin/tc class add dev pppoe-wan parent 1: classid 1:1 htb rate 1000mbit ceil 1000mbit
- /sbin/tc class add dev pppoe-wan parent 1:1 classid 1:10 htb rate 20mbit ceil 30mbit # 限制msd_list公网上行20mbit(2.5m/s),峰值30mbit(3.8m/s)
- # 检查并添加 iptables 规则如果不存在
- if ! iptables -t mangle -C OUTPUT -p tcp --sport 9088 -j TOS --set-tos Minimize-Delay 2>/dev/null; then
- iptables -t mangle -I OUTPUT -p tcp --sport 9088 -j TOS --set-tos Minimize-Delay
- echo "已添加 iptables 规则:Minimize-Delay for TCP sport 9088"
- else
- echo "iptables 规则已存在:Minimize-Delay for TCP sport 9088"
- fi
- /sbin/tc filter add dev pppoe-wan protocol ip parent 1:0 prio 1 u32 match ip tos 0x10 0xff flowid 1:10
[color=rgb(51, 102, 153) !important]复制代码
9088为msd的端口,如果修改了记得代码里也修改下。
我这测试一个外网客户端播放单播所需网速为1.2m/s左右,所以我将msd_lite限制公网20mbit(2.5m/s),峰值30mbit(3.8m/s)的上行,该脚本只会限制公网设备播放速度,内网设备不受限制,每次重启运行一次脚本就行了,可以把这个脚本设置开机自运行一次(后面会讲到)。
接下来搞定开机自启动
本帖隐藏的内容官方固件开机自启动脚本或者程序的方法有好几种,重点说下自己用的。
首先编辑 vim /data/auto_ssh/auto_ssh.sh 最后一行,添加下面的代码,保存。
- sh /data/ziqidong.sh > /dev/null 2>&1 &
[color=rgb(51, 102, 153) !important]复制代码
新建一个启动脚本vim /data/ziqidong.sh 该脚本里可以写入你要开机后执行的命令或者脚本,最好加一点延迟,下面示例是我的,根据自己需求修改
- #!/bin/sh
- # 启动msd_list的命令
- sleep 65
- /data/msd_lite/msd_lite -d -c /data/msd_lite/msd_lite.conf > /dev/null 2>&1 &
- # 这里是给msd_lite端口放行的代码
- sleep 5
- ip6tables -L | grep "tcp dpt:9088"; [ $? != 0 ] && echo "add port" && ip6tables -I INPUT -p tcp --dport 9088 -j ACCEPT
- # 启动公网限速msd_lite的脚本
- sleep 5
- sh /data/msd_lite_xiansu.sh > /dev/null 2>&1 &
- # 启动dynv6更新的脚本,我没用ddns-go
- # 由于路由器重启有时快,有时慢,因此重启后每2分钟检查一次是否拨号成功,是否能联通网络,成功后才会开始执行更新dynv6的脚本
- max_attempts=15 # 最大尝试次数
- attempt=1 # 当前尝试次数
- while [ $attempt -le $max_attempts ]; do
- if [ -n "$(ip -6 addr list scope global pppoe-wan | grep -v " fd" | sed -n 's/.*inet6 \([0-9a-f:]\+\).*/\1/p' | head -n 1)" ] || ping -c 1 www.baidu.com &> /dev/null; then
- echo "路由器拨号成功,开始执行dynv6脚本"
- sh /data/gengxin-dynv6.sh > /dev/null 2>&1 &
- break
- else
- echo "没有网络,等待2分钟后继续检查..."
- sleep 120 # 等待2分钟,即120秒
- fi
- ((attempt++)) # 每次循环尝试次数加1
- done
- if [ $attempt -gt $max_attempts ]; then
- echo "达到最大尝试次数,仍然无法连接网络。"
- fi
[color=rgb(51, 102, 153) !important]复制代码
保存,给脚本权限chmod +x /data/ziqidong.sh
说明:我没用ddns-go,用的gengxin-dynv6.sh这个脚本执行的ipv4和v6更新,我们这ipv4和ipv6地址一周更新一次或者每次重启路由才会变一次,我路由设置的每天重启一次,所以我设置的是只把该脚本开机后执行一次,如果不清楚当地地址的更新情况,可以另外利用crontab定时任务5分钟执行该脚本一次,这样当地址有变化就会及时更新了。
crontab定时任务用法:命令crontab -e 然后添加任务
- */05 * * * /data/gengxin-dynv6.sh
[color=rgb(51, 102, 153) !important]复制代码
解决无线状态下播放单播有时会卡顿的问题
本帖隐藏的内容先说前提,我是光猫和路由双网线连接,光猫桥接,光猫应该只开启了组播功能,好像没绑定vlan,在路由不改任何配置情况下,路由任意lan口有线连接电脑可以看组播和上网,我们这的iptv也不需要鉴权和拨号,安装msd_lite后发现个奇怪的现象。无线状态下播放单播经常会卡顿,偶尔花屏,有时又特别流畅,一阵阵的。公网播放或者有线连接的情况下卡顿较少,起初我以为是路由器性能不够,就把msd_lite安装到nas上了,还是同样的问题,期间也尝试了udpxy,尝试调试msd各种配置参数,问题依旧。直到前两天无意间在论坛外看到一篇文章,抱着试试的想法,没想到解决了。播放非常丝滑。
注意:以下教程只适用于上述双线情况,路由1口必须连接光猫上网口,路由2口必须连接iptv口,内网播放经常卡顿情况下可尝试。
vim /etc/config/network
(可以看到这个配置里的vlan3对应路由的2号口,vlan5对应路由的1号口)
option ifname 'eth0.1 eth0.2 eth0.3 eth0.4 eth0.6'
改为
option ifname 'eth0.1 eth0.2 eth0.4 eth0.6'
把
config switch_vlan 'vlan3'
option device 'switch0'
option ports '3 6t'
option vlan '3'
option vid '3'
中的option ports值改为3 5t,也就是option ports '3 5t'
config interface 'eth0_3'
option ifname 'eth0.3'
改为
config interface 'eth1_3'
option ifname 'eth1.3'
修改完后保存
执行 /etc/init.d/network reload 重新加载配置(会断无线2秒)
记得修改msd的配置文件vi /data/msd_lite/msd_lite.conf
<ifName>br-lan</ifName> <!-- For multicast receive. -->
要改br-lan为eth1.3
然后ifconfig看eth1.3是否有数据
由于/etc/config/network文件开机会自动恢复,可以利用下面代码开机后自动修改。
- sleep 65
- uci set network.lan.ifname='eth0.1 eth0.2 eth0.4 eth0.6'
- uci set network.vlan3.ports='3 5t'
- uci set network.eth0_3.ifname='eth1.3'
- uci rename network.eth0_3=eth1_3
- uci commit network
- /etc/init.d/network reload
[color=rgb(51, 102, 153) !important]复制代码
代码放到ziqidong.sh脚本内的开头,让他开机后第一个执行。
修改完后,不管内外网都会流畅播放单播了,这种改法只有路由器里有组播数据,路由不会把组播数据转发给下游的设备。我个人还是比较推荐组播不转发的。
但是每个小伙伴的需求不一样,有小伙伴想局域网内还继续看组播,外网看单播,或者想把msd_lite安装到路由下游的nas里转单播,要实现这些需求那就需要路由继续转发组播,只需要把上面脚本中的
uci set network.lan.ifname='eth0.1 eth0.2 eth0.4 eth0.6'
改为
uci set network.lan.ifname='eth0.1 eth0.2 eth0.4 eth1.3 eth0.6'
对了,记得msd_lite.conf配置文件里,重新改回
<ifName>br-lan</ifName> <!-- For multicast receive. -->
以上思路来源
https://post.m.smzdm.com/p/akln6ewe/
https://www.right.com.cn/forum/thread-8383625-1-5.html
下面解决家里有nas,在不关闭ipv6防火墙的情况下需要单独给nas或者其他设备放行ipv6端口
本帖隐藏的内容
vim /etc/config/firewall
添加示例
- config rule '123'
- option name '123'
- option src 'wan'
- option proto 'tcp'
- option dest 'lan'
- option dest_port '9088'
- option family 'ipv6'
- option target 'ACCEPT'
- option dest_ip '::1q33:6af5:fw45:676f/::ffff:ffff:ffff:ffff'
[color=rgb(51, 102, 153) !important]复制代码
说明:
config rule、name可随便写,最好不要有中文,每组中的最好一致,不同组的不要相同,dest_port为开放的端口,option proto为 tcp或者udp,至于支不支持tcpudp,我没测试,option dest_ip为特定的设备ipv6地址后缀,如果设置了就只给该设备放行,不需要就删除该参数,如果需要最好在路由器后台绑定mac,
option dest_ip '::放行设备ipv6地址后缀(只填后4组)/::ffff:ffff:ffff:ffff'
可以命令查看设备v6地址
ip -6 neighbor show | grep "11:22:31:56:40:44" | grep -v fe80 | awk '{print $1}' | head
注意把11:22:31:56:40:44改成设备mac号在查看
至于v6能不能像v4一样外部访问和内部映射端口号不一样,我没尝试,有兴趣的自行添加option src_dport参数尝试
保存后执行/etc/init.d/firewall restart 立即生效,可以ip6tables -L -n 查看规则是否添加进去。(首次添加后执行/etc/init.d/firewall restart后可能有时会直接卡出终端,如果确定添加的内容或格式没错误,reboot重启下路由就好了,重启后等2分钟测试下规则是否生效,如果未生效手动执行下/etc/init.d/firewall restart)
这种方法比较好,重启规则还在,系统也不会删除规则
上面的方法由于我只有红米A6000,在该设备上测试有效,其他设备没验证,有兴趣的可以测试下,下面帖一个通用的方法,不仅仅局限在路由上,vps,nas等只要是linux系统基本上都可以
- #!/bin/ash
- mac_address="11:22:11:11:22:12" # 要放行的设备mac号
- ipv6_address=$(ip -6 neighbor show | grep "$mac_address" | grep -v fe80 | awk '{print $1}' | head )
- if [[ -n $ipv6_address ]]; then
- echo "设备 $mac_address 的ipv6地址为 $ipv6_address"
- ports="9876 9088" # 要放行的端口,支持多端口
- echo "Ports to open: $ports"
- for port in $ports; do
- if ! ip6tables -C FORWARD -p tcp -d "$ipv6_address" --dport "$port" -j ACCEPT &>/dev/null; then
- ip6tables -I FORWARD -p tcp -d "$ipv6_address" --dport "$port" -j ACCEPT
- echo "设备 $mac_address 的 $port 端口已放行"
- else
- echo "设备 $mac_address 的 $port 端口已放行,不必重复放行!"
- fi
- done
- else
- echo "未查询到设备 $mac_address 的ipv6地址"
- fi
[color=rgb(51, 102, 153) !important]复制代码
可以让这个脚本开机运行一次。(注意延迟10分钟执行,或者参考执行gengxin-dynv6.sh脚本的代码,确定路由器拨号成功后在执行)
这里科普下小知识,我在这个误区卡壳了2天(大佬勿喷)
ip6tables -I INPUT -p tcp --dport 9088 -j ACCEPT
ip6tables -I FORWARD -p tcp --dport 9088 -j ACCEPT
大家有没发现这两个规则的不同?undefined对,同样都是放行9088端口,一个是INPUT,一个是FORWARD。INPUT这个规则的意思是允许端口为9088的数据包进入本机,FORWARD这个规则的意思是允许端口为9088的数据包通过本机转发给下游的设备,通常路由器或者作为网络中继的设备上会用到这个防火墙配置。比如之前我们是把msd部署在路由上了,就需要用INPUT这个参数,如果我们把msd部署到路由器下面的nas上了,就需要用FORWARD参数放行。
解决ipv6偶尔丢失问题
用一段时间后发现设备的ipv6偶尔会不定时丢失,并且安卓手机无线连接后一段时间丢失ipv6,必须重现断开重连(据说这是安卓的bug,但挺奇怪的,未解决前我的小米10用5分钟就丢失v6了,备用机红米13和电视盒子一直没问题),经过尝试用下面的方法解决了
(备注:2024年8月24日最新发现,经过上面的“解决无线状态下播放单播有时会卡顿的问题”配置,如果不让路由转发组播流,不用看接下来的内容了,无线状态下ipv6也不会掉了,但如果组播转发了下游设备,只要下游设备观看了组播流,那么无线连接的设备的v6特别容易掉,可以继续按照下面的方法修改尝试。看来组播流确实对内网有那么一点影响)
vim /etc/config/dhcp
把config dhcp 'lan'那一组先复制出来备份,然后删除替换成
本帖隐藏的内容- config dhcp 'lan'
- option interface 'lan'
- option start '5'
- option limit '250'
- option leasetime '24h'
- option dhcpv6 'server'
- option ra 'server'
- option ra_slaac '1'
- list ra_flags 'managed-config'
- list ra_flags 'other-config'
- option ra_management '1'
- option force '1'
- option ndp 'hybrid'
- option ra_default '1'
- option ra_mininterval '10'
- option ra_maxinterval '60'
- option ra_useleasetime '1'
- option preferred_lifetime '5m'
[color=rgb(51, 102, 153) !important]复制代码
保存重启路由就行了。
我同上面的方法测试了2天没丢ipv6,后面就没继续测试了,因为我每天会重启路由,并且小米10无线状态下也一直不丢失了。如果上面方法还不行上终极方案,但这种方案不会根本上解决掉v6的问题,只会在检测不到v6地址后会及时重新下发地址,每次重新分配v6时会有短暂性的上不去网持续1-5秒钟,因此适合掉v6地址不是特别频繁并且上面的方案也没啥用的情况下临时采用的救济方案。
路由器里添加脚本,可以每10分钟执行一次
本帖隐藏的内容- #!/bin/ash
- # 指定一个设备mac号,小写,建议指定一个常在线的设备,会优先查询该设备是否有ipv6,因为有时路由能获取到v6,但是下面设备却分配不到,如果没指定设备,则在会进行整个路由v6的查询,如果都查询不到ipv6就杀死odhcp6c进程,系统会重新启动odhcp6c获取分配ipv6
- mac_address="11:22:33:44:55:11" # 常在线设备的mac号,比如nas
- # 首先清除下ipv6条目的缓存
- ip -6 neigh flush all
- # 等待15秒钟让他重新缓存才会只缓存最新的,如果不等待会查询不到
- sleep 15
- # 确保改设备存在在执行
- mac_sfcz=$(ip neighbor show | grep "$mac_address" | awk '{print $5}' | head -n 1)
- if [[ -n "$mac_sfcz" ]]; then
- # 有时会查询不到,为了减少误判,重复查询20次
- counter=0
- while [[ $counter -lt 20 ]]; do
- ipv6_address=$(ip -6 neighbor show | grep "$mac_address" | grep -v fe80 | awk '{print $1}' | head -n 1)
- if [[ -n "$ipv6_address" ]]; then
- break # 如果找到了IPv6地址,退出循环
- fi
- counter=$((counter + 1))
- echo "第 $counter 次查询失败"
- sleep 10 # 休眠10秒钟
- done
- if [ -z "$ipv6_address" ]; then
- echo "未查询到设备 $mac_address 的ipv6地址"
- ps | grep odhcp6c | grep -v grep | awk '{print $1}' | xargs kill
- echo "重启odhcp6c"
- fi
- else
- echo "设备 $mac_address 的ipv6地址为: $ipv6_address"
- fi
- else
- echo "$mac_address 该设备不存在,准备查询全网ipv6地址"
- if [[ -z "$(ip -6 addr show | grep inet6)" ]]; then
- echo "未找到ipv6地址,准备重启odhcp6c"
- ps | grep odhcp6c | grep -v grep | awk '{print $1}' | xargs kill
- else
- echo "已找到ipv6地址"
- fi
- fi
[color=rgb(51, 102, 153) !important]复制代码
好了以上就是近期折腾官方固件的心得,祝大家玩的愉快,最后声明,很多内容思路都是来源本论坛,感谢各位大佬的无私分享。。
最近有小伙伴私信我如何安装alist,science工具,去广告等一些程序,我记得论坛里有一篇alist,善用搜索,还有我其实更多的建议,路由要的就是稳定性,尽量少折腾,毕竟路由的配置都不怎么高,安装程序多影响稳定性,发热卡顿的问题一下都显现出来了,还有配置稍微出错整的全家断网,我更建议想折腾的,可以先尝试鱼上买个可以刷linux的二手的盒子,也不贵也就几十块钱,或者买刷好的,要求不是特别高的,跑跑脚本,安装docker等一些常用的够用了,随便折腾,折腾废了也不影响啥。
|