小米路由器原生固件防火墙放行单个设备动态公网IPV6方法探讨
小米路由器原生固件防火墙放行单个设备动态公网IPV6方法探讨
卖桃子的小女孩该方法适用于**各种家庭有机器,没有V4却有V6公网的伙伴。**部署一些业务,需要放行IPV6,但不想全部放行所有设备IPV6防火墙,只想单独放行某个设备以保证安全,并且路由器已经拥有SSH。
这里的全部IPV6设备均放行防火墙是以下规则:
ip6tables -Fip6tables -Xip6tables -P INPUT ACCEPTip6tables -P OUTPUT ACCEPTip6tables -P FORWARD ACCEPT
注意:这种方法是关闭全部IPV6防火墙,并不安全!这里是红米AC2100小米AX1800AX3600AC2100官方固件SSH和Telnet开放链接 其他型号自己百度,或者其他厂商的有SSH也是可以的,更复杂的梅林固件\openwrt固件可自带规则。
ubuntu/debian:
-
需要的依赖
-
sshpass
-
crontab
可apt-get install sshpass
其他linux 如centos可yum install sshpass
-
-
在目录创建一个bash脚本,例如命名为
example.sh
打开该sh用nano或vim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 配置参数
ROUTER_IP="192.168.31.1"
ROUTER_USER="root"
ROUTER_PASSWORD="123456"
LOG_FILE="/var/log/update_firewall.log"
LAST_IPV6_FILE="/var/log/last_ipv6_address.log"
# 获取上一次使用的IPv6地址
if [ -f "$LAST_IPV6_FILE" ]; then
LAST_IPV6_ADDRESS=$(cat $LAST_IPV6_FILE)
fi
# 获取当前的公网IPv6地址
IPV6_ADDRESS=$(curl -s https://v6.ident.me)
# 记录日志信息
echo "[$(date)] Updating firewall rules for IPv6 address: $IPV6_ADDRESS" >> $LOG_FILE
# 通过SSH登录到路由器并更新防火墙规则
sshpass -p "$ROUTER_PASSWORD" ssh -o StrictHostKeyChecking=no $ROUTER_USER@$ROUTER_IP "
if [ ! -z \"$LAST_IPV6_ADDRESS\" ]; then
ip6tables -D INPUT -s $LAST_IPV6_ADDRESS -j ACCEPT 2>/dev/null;
ip6tables -D OUTPUT -d $LAST_IPV6_ADDRESS -j ACCEPT 2>/dev/null;
ip6tables -D FORWARD -s $LAST_IPV6_ADDRESS -j ACCEPT 2>/dev/null;
ip6tables -D FORWARD -d $LAST_IPV6_ADDRESS -j ACCEPT 2>/dev/null;
fi
ip6tables -I INPUT -s $IPV6_ADDRESS -j ACCEPT;
ip6tables -I OUTPUT -d $IPV6_ADDRESS -j ACCEPT;
ip6tables -I FORWARD -s $IPV6_ADDRESS -j ACCEPT;
ip6tables -I FORWARD -d $IPV6_ADDRESS -j ACCEPT;
" >> $LOG_FILE 2>&1
# 记录日志信息
echo "[$(date)] Firewall rules updated successfully" >> $LOG_FILE
# 打印日志信息
echo "[$(date)] Firewall rules updated successfully"
# 保存当前使用的IPv6地址
echo "$IPV6_ADDRESS" > $LAST_IPV6_FILE
这里的
ROUTER_IP
、ROUTER_USER
、ROUTER_PASSWORD
替换成自己获取路由器访问IP、路由器的SSH用户名与密码。
LOG_FILE
与LAST_IPV6_FILE
可以自定义路径,用来记录日志以及上次获取的动态IPV6。
解析:这里的思路是通过sshpass去自动把网址获取到的动态IPV6去加入到路由防火墙规则,用以该设备放行。并且记录每次获取到的IPV6地址,用以下次运行该脚本时删除旧的已经无效的IPV6。
-
利用CRON自动每10分钟更新该防火墙规则
例如
example.sh
保存路径为/home
,则1
*/10 * * * * /home/example.sh
该方法适用于需要用动态公网ipv6连接的:开游戏服务器如mc等、网站服务、私人网盘等等用处。
因为ipv6的特性,以上服务部署在哪个设备或者哪个虚拟机,或没映射到母系统的容器等等场景就在那里运行该脚本,否则会用错设备的ipv6地址
如若用在路由器,想只把路由器的IPV6通行,则不需要ssh,直接去掉
ROUTER_IP="192.168.31.1" ROUTER_USER="root" ROUTER_PASSWORD="123456"
并去掉
sshpass -p "<span data-type="inline-math code" data-subtype="math" data-content="ROUTER_PASSWORD" ssh -o StrictHostKeyChecking=no " contenteditable="false" class="render-node"></span>ROUTER_USER@$ROUTER_IP "
即可。但其他设备想通过路由器访问,则需要通过别的方法先定义其他设备的固定本地IPV6链路,并且路由器端口转发到该本地链路的ipv6
(官方路由器前端目前不支持该转发,可自行通过winscp,ssh后编辑配置文件修改)
[目前不推荐其他用户使用这种麻烦方法,直接在服务器部署即可,此思路仅给支持docker版的小米路由器参考使用]
Windows:
-
需要的软件:
-
Putty
-
Curl(win10 bulid 17063开始自带)
-
如果您的 Windows 系统中没有内置
curl
,您可以从官方网站下载并安装它。以下是安装步骤:- 访问
curl
官方网站并根据您的系统类型(32 位或 64 位)下载相应的二进制文件。 - 将下载的文件解压缩到您喜欢的位置,例如
C:\curl
。 - 将
curl
的安装目录添加到PATH
环境变量中。这样,您就可以在命令行中直接使用curl
命令了。(添加PATH不用我教了吧^^,不懂可自己百度)
如果您不想更改
PATH
环境变量,也可以在命令行中使用完整路径来调用curl
,例如C:\curl\curl.exe
。
- 访问
-
-
在任意目录创建bat文件,例如命名
example.bat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41@echo off
setlocal enabledelayedexpansion
REM 配置参数
set ROUTER_IP=192.168.31.1
set ROUTER_USER=root
set ROUTER_PASSWORD=123456
set LOG_FILE=C:\update_firewall.log
set LAST_IPV6_FILE=C:\last_ipv6_address.log
REM 获取上一次使用的IPv6地址
if exist %LAST_IPV6_FILE% (
set /p LAST_IPV6_ADDRESS=<%LAST_IPV6_FILE%
)
REM 获取当前的公网IPv6地址
for /f "delims=" %%a in ('curl -s https://v6.ident.me') do set IPV6_ADDRESS=%%a
REM 记录日志信息
echo [!date! !time!] 更新 IPv6 地址的防火墙规则: !IPV6_ADDRESS! >> %LOG_FILE%
REM 通过SSH登录到路由器并更新防火墙规则
(
echo if not "!LAST_IPV6_ADDRESS!"=="" (
echo ip6tables -D INPUT -s !LAST_IPV6_ADDRESS! -j ACCEPT 2^>NUL;
echo ip6tables -D OUTPUT -d !LAST_IPV6_ADDRESS! -j ACCEPT 2^>NUL;
echo ip6tables -D FORWARD -s !LAST_IPV6_ADDRESS! -j ACCEPT 2^>NUL;
echo ip6tables -D FORWARD -d !LAST_IPV6_ADDRESS! -j ACCEPT 2^>NUL;
echo )
echo ip6tables -I INPUT -s !IPV6_ADDRESS! -j ACCEPT;
echo ip6tables -I OUTPUT -d !IPV6_ADDRESS! -j ACCEPT;
echo ip6tables -I FORWARD -s !IPV6_ADDRESS! -j ACCEPT;
echo ip6tables -I FORWARD -d !IPV6_ADDRESS! -j ACCEPT;
) | plink %ROUTER_USER%@%ROUTER_IP% -pw %ROUTER_PASSWORD% >> %LOG_FILE% 2>&1
REM 记录日志信息
echo [!date! !time!] 防火墙规则更新成功 >> %LOG_FILE%
REM 打印日志信息
echo [!date! !time!] 防火墙规则更新成功
REM 保存当前使用的IPv6地址
echo !IPV6_ADDRESS! > %LAST_IPV6_FILE%set ROUTER_IP=192.168.31.1
set ROUTER_USER=root
set ROUTER_PASSWORD=123456
需要替换成自己路由的IP、路由SSH后的用户名与密码
set LOG_FILE=C:\update_firewall.log
set LAST_IPV6_FILE=C:\last_ipv6_address.log
可替换成自己自定义的目录
解析:这里的思路是通过putty的plink去自动把网址获取到的动态IPV6去加入到路由防火墙规则,用以该windows的设备放行。
并且记录每次获取到的IPV6地址,用以下次运行该脚本时删除旧的已经无效的IPV6。所以日志目录必须有,否则不会删除已添加过的ipv6,并且报错。
-
使用任务计划程序进行每10分钟放行设备动态IPV6到路由器
- 打开“开始”菜单,搜索并打开“任务计划程序”。
- 在右侧操作窗格中,单击“创建基本任务”。
- 在“名称”字段中输入任务的名称,例如“运行脚本”,然后单击“下一步”。
- 选择“每天”,然后单击“下一步”。
- 在“开始”字段中选择任务的开始时间,然后将“重复任务间隔”设置为“10 分钟”,将“持续时间”设置为“无限期”,然后单击“下一步”。
- 选择“启动程序”,然后单击“下一步”。
- 在“程序或脚本”字段中,浏览并选择您的
.bat
文件。在“启动于(可选)”字段中,输入脚本所在目录的路径,然后单击“下一步”。 - 检查设置是否正确,然后单击“完成”。
- 现在,您的
.bat
文件将每 10 分钟运行一次。您可以随时返回任务计划程序来修改或删除此任务。
该方法适用于需要用动态公网ipv6连接的Windows设备上:开游戏服务器如mc等、网站服务、私人网盘等等用处。
因为ipv6的特性,以上服务部署在哪个设备或者哪个虚拟机的windows,就在那里运行该脚本,否则会用错设备的ipv6地址。
以上教程完成以后,在浏览器输入自己的IPV6地址,例如
[xxx:xxx:xxx:xxx]:端口
即可成功访问首先先fuck一下不够V4公网地址与公网收费后的运营商,让大伙那么麻烦。
如若觉得每次IPV6动态更新麻烦。需要DDNS进行域名绑定该动态IPV6来完成预期可以跳转另外一个教程 DDNSV6教程