OpenWRT 为局域网设备设置IPv6 DDNS

3

运营商支持IPv6网络的情况,局域网设备可以分配到公网IPv6地址,但是如果手动的为每一台需要外网访问的设备配置DDNS就非常麻烦,需要各个平台的客户端或者脚本,其实通过OpenWRT就可以在路由器上完成这项工作.

下面分享一下我写的依托OpenWRT自带DDNS功能的脚本方案

新建 /usr/lib/ddns/dynamic_dns_iphelper.sh

#!/bin/sh
 
get_ip(){
    MAC=$1
    if [ "$MAC" = "" ]
    then
        exit 0
    fi
    IP=$(ip -6 neigh | grep -i $MAC | grep -v "fe80:" | grep -E "REACHABLE|STALE" | cut -d" " -f1 | grep -m 1 -E -o "([0-9a-fA-F]{1,4}(:?)){8}")
    if [ "$IP" = "" ]
    then
        IP=$(mac_to_ipv6_ll $MAC $(get_ip_prefix))
    fi
    echo $IP
}
 
mac_to_ipv6_ll() {
    PREFIX="fe80::"
    if [ "$#" = 2 ]; then
        PREFIX=$2
    fi
    IFS=':'; set $1; unset IFS
    echo "$PREFIX$(printf %02x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6"
}
 
get_ip_prefix() {
    IP_PREFIX=$(ip -6 addr | awk '{print $2}' | grep '::1' | grep -m 1 -E -o "([0-9a-fA-F]{1,4}(:?)){4}")
    echo $IP_PREFIX
}
 
if [ "$1" != "" ]; then
    echo `get_ip $1`
fi

新建 /usr/lib/ddns/getip_demo.sh

#!/bin/sh
 
. /usr/lib/ddns/dynamic_dns_iphelper.sh
# 遵循 EUI-64 的设备使用这个方式 可以获取到静态后缀的IPv6地址
# 修改为目标设备的MAC地址
echo $(mac_to_ipv6_ll "00:00:00:00:00:00" $(get_ip_prefix))
#!/bin/sh
 
. /usr/lib/ddns/dynamic_dns_iphelper.sh
# 修改为目标设备的MAC地址
# 不遵循 EUI-64 的设备 可以获取到动态IPv6地址
echo `get_ip "00:00:00:00:00:00"`

LUCI 添加 DDNS IP 地址版本 选择 IPv6, 高级设置中 IP 地址来源 [IPv6] 选择 脚本, 脚本填入 /usr/lib/ddns/getip_demo.sh.
添加多个设备 新建 getip_xxx.sh 并重复上面的步骤

新版Windows系统不会遵循EUI-64标准使用MAC地址挂钩的静态IPv6地址,所以每次重新连接都可能导致IP后缀变化, 管理员执行 Set-NetIPv6Protocol -RandomizeIdentifiers Disabled 就可以关闭随机IP.

现在OpenWRT可以自动为局域网中指定的设备设置AAAA记录,但是外网访问还需要防火墙放行.

最简单的方法就是 直接防火墙放行IPv6 指定端口允许转发, 但是这样做有一个弊端,如果放行的端口是高危端口可能会有安全隐患.

我们可以在通信规则中限制目标地址,但是IPv6的前缀是运营商提供的,所以前缀是会变化的,所以目标地址要设置为 ::aaaa:aaff:feaa:aaaa/::ffff:ffff:ffff:ffff 这样的格式, 其中 aaaa:aaff:feaa:aaaa 段修改成设备的静态IPv6后缀,注意其中包含ff:fe的地址才是遵循 EUI-64 的地址,这个后缀是根据MAC地址计算出来的固定后缀,除非MAC地址发生变化,否则不会变,如果配置的是动态IP,一旦网络发生变化会导致防火墙拦截.

设置好防火墙以后,通过ddns的域名从外网应该可以正常访问了,现阶段很多运营商连80/443也没有封,但是不推荐在80/443端口提供任何服务,域名泄露被爬虫扫描的时候会有较高的出站流量,可能会被请喝茶.

共 3 条评论

  1. 回复

    你好,请问ddns日志里面显示使用/usr/lib/ddns/dynamic_dns_iphelper.sh脚本获取到了fe80开头的地址怎么办?我看到脚本里有grep -v “fe80:”的,这应该把fe80开头的地址过滤掉才对啊。麻烦大佬了!

  2. 回复

    vm中的Ubuntu使用第二种脚本,获取动态ip,开机正常,关机后获取的ip变成了eui-64,大佬看看怎么回事

    • 回复

      第二种方式IP来自缓存,主机不存活的情况可能读取失败. 回退到EUI-64 .
      动态IP是会变化的,每次开机可能会随机分配 EUI-64是固定的

发表评论

您的邮箱不会公开,当您的评论有新的回复时,会通过您填写的邮箱向您发送评论内容。 必填字段 *

为何看不到我发布的评论?

正在提交, 请稍候...