小米路由器原生固件防火墙放行单个设备动态公网IPV6方法探讨

该方法适用于**各种家庭有机器,没有V4却有V6公网的伙伴。**部署一些业务,需要放行IPV6,但不想全部放行所有设备IPV6防火墙,只想单独放行某个设备以保证安全,并且路由器已经拥有SSH。

  • 这里的全部IPV6设备均放行防火墙是以下规则:

    ip6tables -F
    ip6tables -X
    ip6tables -P INPUT ACCEPT
    ip6tables -P OUTPUT ACCEPT
    ip6tables -P FORWARD ACCEPT
    注意:这种方法是关闭全部IPV6防火墙,并不安全!
  • 这里是红米AC2100小米AX1800AX3600AC2100官方固件SSH和Telnet开放链接 其他型号自己百度,或者其他厂商的有SSH也是可以的,更复杂的梅林固件\openwrt固件可自带规则。

ubuntu/debian:

  • 需要的依赖

    • sshpass

    • crontab

      apt-get install sshpass

      其他linux 如centosyum 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
    #!/bin/bash

    # 配置参数
    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_IPROUTER_USERROUTER_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​,您可以从官方网站下载并安装它。以下是安装步骤:

      1. 访问 curl官方网站并根据您的系统类型(32 位或 64 位)下载相应的二进制文件。
      2. 将下载的文件解压缩到您喜欢的位置,例如 C:\curl​。
      3. 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到路由器

  1. 打开“开始”菜单,搜索并打开“任务计划程序”。
  2. 在右侧操作窗格中,单击“创建基本任务”。
  3. 在“名称”字段中输入任务的名称,例如“运行脚本”,然后单击“下一步”。
  4. 选择“每天”,然后单击“下一步”。
  5. 在“开始”字段中选择任务的开始时间,然后将“重复任务间隔”设置为“10 分钟”,将“持续时间”设置为“无限期”,然后单击“下一步”。
  6. 选择“启动程序”,然后单击“下一步”。
  7. 在“程序或脚本”字段中,浏览并选择您的 .bat​ 文件。在“启动于(可选)”字段中,输入脚本所在目录的路径,然后单击“下一步”。
  8. 检查设置是否正确,然后单击“完成”。
  • 现在,您的 .bat​ 文件将每 10 分钟运行一次。您可以随时返回任务计划程序来修改或删除此任务。

该方法适用于需要用动态公网ipv6连接的Windows设备上:开游戏服务器如mc等、网站服务、私人网盘等等用处。

因为ipv6的特性,以上服务部署在哪个设备或者哪个虚拟机的windows,就在那里运行该脚本,否则会用错设备的ipv6地址。


以上教程完成以后,在浏览器输入自己的IPV6地址,例如[xxx:xxx:xxx:xxx]:端口​ 即可成功访问

首先先fuck一下不够V4公网地址与公网收费后的运营商,让大伙那么麻烦。

如若觉得每次IPV6动态更新麻烦。需要DDNS进行域名绑定该动态IPV6来完成预期可以跳转另外一个教程 DDNSV6教程