ipv6ddns uses a filtering system to determine which discovered IPv6 addresses should be used for DDNS updates.
The filtering system is built around two logical levels:
- Filter Sets (OR Logic): The top-level
filterconfiguration is a List of sets. If an address matches ANY of the sets in the list, it is accepted. - Filter Rules (AND Logic): Within a single set, you define specific rules (e.g., match this IP type AND this MAC address). An address must match ALL rules defined in the set to be accepted by that set.
Address -> [ Set 1 ] --(Match?)--> ACCEPT
OR
Address -> [ Set 2 ] --(Match?)--> ACCEPT
OR
Address -> [ Set 3 ] --(Match?)--> ACCEPT
Inside a Set:
Set 1:
MAC Address == "..." AND
IP Type == "Global"
The filter block is a list of objects. Each object represents a Filter Set.
filter:
# Set 1: Match specific MAC
- mac:
address: "00:11:22:33:44:55"
# Set 2: Match any Stable Global Dynamic IP
- ip:
type:
- global
- eui64address(Single String): Exact match of the MAC address.- Example:
00:11:22:33:44:55
- Example:
mask(List of Strings): Match against a mask. Useful for matching OUI (Vendor) or ranges. All provided masks must match.- Format:
VALUE/MASK - Example:
00:11:22:00:00:00/ff:ff:ff:00:00:00(Matches any device with 00:11:22 OUI)
- Format:
type(List of Strings): Match protocol-defined MAC types. All types must match.- Values:
global,local,unicast,multicast.
- Values:
prefix(Single String): CIDR subnet. The address must be contained within this subnet.- Example:
2001:db8::/32
- Example:
suffix(Single String): The host part (suffix) of the address.- Case-insensitive. The filter matches against the lowercase, RFC 5952 canonical representation of the address.
- Example:
::1(Matches2001:db8::1,fe80::1, etc.) ordead:beef(Matches...:DEAD:BEEF)
type(List of Strings): Match semantic IP types. All types must match.- Values:
global: Global Unicast Address (Publicly routable).ula: Unique Local Address (fc00::/7).link_local: Link-Local Address (fe80::/10).eui64: derived from MAC address (stable).random: Privacy extension / randomized address.
- Common Use Case:
type: ["global"](Public IPs only).
- Values:
mask(List of Strings): generic bitwise mask match.- Format:
VALUE/MASK
- Format:
source(List of Strings): Filter by the discovery plugin that found the address. All sources must have seen the address.- Example:
["mikrotik-lan"]
- Example:
Most common use case. Updates DNS with any address found for this device.
filter:
- mac:
address: "00:11:22:33:44:55"Ignore Link-Local or ULA addresses.
filter:
- mac:
address: "00:11:22:33:44:55"
ip:
type:
- globalServers often need a stable address. By requiring global (public) AND eui64 (MAC-derived, static suffix), you avoid temporary privacy addresses.
filter:
- mac:
address: "00:11:22:33:44:55"
ip:
type:
- global
- eui64Update the same DNS record if EITHER Device A OR Device B is found.
filter:
# Filter set 1: Device A
- mac:
address: "00:11:22:33:44:55"
# Filter set 2: Device B
- mac:
address: "aa:bb:cc:dd:ee:ff"Match any address ending in ::5 that is also within your static public prefix.
filter:
- ip:
prefix: "2001:db8::/64"
suffix: "::5"