红米AC2100路由器原官方固件关闭IPv6防火墙
问题背景
我家里宽带开通了IPv6,并且获得了公网的IPv6地址。在同一Wi-Fi内部,可以使用公网IPv6正常访问。
但是,当我切换为手机流量,也就是公网环境,访问就失败了。
问题排查
怀疑是路由器设置了防火墙,但红米2100路由器后台没有关闭IPv6防火墙的地址,于是就有了下面的内容
操作步骤
- 升级/降级至官方固件版本: 2.0.23 稳定版。操作入口在路由器常用设置-系统状态-升级检测处。
-
开启SSH权限。F12打开浏览器的开发者模式,并切换至控制台选项卡,复制以下代码至终端处,并敲回车执行:
function getSTOK() { let match = location.href.match(/;stok=(.*?)\//); if (!match) { return null; } return match[1]; } function execute(stok, command) { command = encodeURIComponent(command); let path = `/cgi-bin/luci/;stok=${stok}/api/misystem/set_config_iotdev?bssid=SteelyWing&user_id=SteelyWing&ssid=-h%0A${command}%0A`; console.log(path); return fetch(new Request(location.origin + path)); } function enableSSH() { stok = getSTOK(); if (!stok) { console.error('stok not found in URL'); return; } console.log(`stok = "${stok}"`); password = prompt('Input new SSH password'); if (!password) { console.error('You must input password'); return; } execute(stok, ` nvram set ssh_en=1 nvram commit sed -i 's/channel=.*/channel=\\"debug\\"/g' /etc/init.d/dropbear /etc/init.d/dropbear start ` ) .then((response) => response.text()) .then((text) => console.log(text)); console.log('New SSH password: ' + password); execute(stok, `echo -e "${password}\\n${password}" | passwd root`) .then((response) => response.text()) .then((text) => console.log(text)); } enableSSH();
此时会弹出一个对话框,要求输入密码,请输入并记住这个密码,敲回车提交。
-
使用Putty 或 Xshell 终端连接路由器,MIWIFI默认网关地址为 192.168.31.1,用户名为 root,密码为上一步设定的密码。
-
使用 Vim 修改防火墙配置文件:
vim /etc/config/firewall
-
将文件中
defaults
闭包下disable_ipv6
的值改为0
,zone
闭包下forward
的值改为ACCEPT
-
在原有的
Rule
中添加一个闭包,允许IPv6外网访问路由器下游设备config rule option name 'Allow-IPv6' option target 'ACCEPT' option family 'ipv6' list proto 'all' option src '*' option dest '*'
修改完毕,保存文件并退出修改。
-
-
终端执行命令,重启路由器防火墙:
1/etc/init.d/firewall restart
-
进入路由器后台常用设置——上网设置——最底部IPv6设置,打开上方开关,上网方式修改为
Native
。 -
使用路由器进行拨号上网,确保拨号成功。
此时,外网即可访问路由器下游设备。
参考文章:https://www.cnblogs.com/wx2020/p/16028098.html