Skip to content

IPV6 Support #28

@stephbu

Description

@stephbu

IPv6 Support

Support for:

  • IPv6 listener bindings
  • IPv6 DNS records (AAAA)

Analysis Summary

Current State

Already Implemented ✅

  • ResourceType.AAAA defined in ResourceType.cs (value 0x001c)
  • BindZoneProvider parses AAAA records from zone files, stores IPv6 addresses, and generates ZoneRecord objects with Type = ResourceType.AAAA
  • ZoneRecord uses IPAddress[] which handles both IPv4 and IPv6
  • Tests exist for AAAA parsing in BindZoneProviderTests.cs
  • Related task T29 in docs/task_list.md

Gaps to Address

1. UdpListener IPv6 Binding (Critical)

Current code (UdpListener.cs):

_listener = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint ep = new IPEndPoint(IPAddress.Any, port);

Problem: Hardcoded to AddressFamily.InterNetwork (IPv4 only) and IPAddress.Any (0.0.0.0)

Required:

  • Add configuration for bind address(es)
  • Support AddressFamily.InterNetworkV6 socket creation
  • Consider dual-stack support or multiple listeners

2. No AAAANameRData Class (Critical)

Current code (RData.cs): Only ANameRData exists for IPv4

Problem:

  • ANameRData.Length returns 4 (IPv4); IPv6 needs 16 bytes
  • ANameRData.Parse() expects exactly 4 bytes

Required: Create AAAANameRData class (16-byte address handling)

3. DnsServer Response Handling (Critical)

Current code (DnsServer.cs):

message.Answers.Add(new ResourceRecord { 
    Type = ResourceType.A,  // Hardcoded!
    RData = new ANameRData { Address = address } 
});

Problem: Always creates A records with ANameRData, ignoring client's query type

Required:

  • Check question.Type for A vs AAAA
  • Use appropriate RData class based on address family

4. Configuration Schema Update

Current: No bind address configuration in AppConfig

Required: Add BindAddress or Addresses array to DnsListenerOptions

5. IPProbeZoneProvider IPv6 Support (Lower Priority)

Current: Always creates ResourceType.A records

Required: Detect address family and generate separate A/AAAA records


Implementation Plan

Phase Work Item Files
1 Create AAAANameRData class Dns/RData.cs
2 Update DnsServer.ProcessUdpRequest for AAAA queries Dns/DnsServer.cs
3 Add integration tests for AAAA resolution dnstest/
4 Extend UdpListener for IPv6 bindings Dns/UdpListener.cs
5 Update configuration schema Dns/Config/AppConfig.cs, appsettings.json
6 Update IPProbeZoneProvider for IPv6 Dns/ZoneProvider/IPProbe/
7 Documentation README.md, docs/

Open Questions

  1. Listener Strategy: Dual-stack socket vs. multiple listeners vs. configurable bind addresses?
  2. Backward Compatibility: Default IPv4-only with IPv6 opt-in?
  3. IPProbe Scope: IPv6 health probing in this issue or separate?
  4. Reverse DNS: Add ip6.arpa PTR support now or defer?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions