Mengoperasikan backend ganda IPv4 dan IPv6 (dual-stack) meningkatkan kompleksitas konfigurasi routing, aturan firewall, dan konsumsi memori instance. Stateless IP/ICMP Translation (SIIT, RFC 7915) memungkinkan infrastruktur internal beralih murni menjadi IPv6-only tanpa memutus traffic dari klien IPv4 publik. Implementasi translasi tanpa state ini memerlukan pipeline deployment yang terukur, observabilitas tingkat kernel untuk mendeteksi silent packet drops, serta mitigasi otomatis terhadap regresi path MTU.

Arsitektur Translasi SIIT dan Pipeline Deployment

Gateway SIIT memetakan IPv4 header langsung ke IPv6 header secara deterministik tanpa menyimpan connection tracking table di memory. Prefiks IPv6 khusus (misal 64:ff9b::/96 atau prefiks lokal operator) dialokasikan untuk memetakan alamat IPv4 klien ke IPv6.

Klien IPv4 --> [Border Gateway BGP] --> [Gateway SIIT (Jool/XDP)] --> [Backend IPv6-only]
       203.0.113.10  --translasi stateless-->  64:ff9b::cb00:710a

Deployment canary dilakukan di layer routing menggunakan BGP path prepending atau cost weighting pada intermediate BFD/BGP session. Dengan teknik Equal-Cost Multi-Path (ECMP) bertingkat, traffic IPv4 dialihkan secara bertahap:

  1. Baseline: 100% traffic diproses cluster proxy legacy (Dual-Stack HAProxy/Nginx).
  2. Canary 5%: BGP edge router mengarahkan subset hash flow traffic ke node gateway SIIT.
  3. Promote atau Rollback: Monitoring latensi p99 dan metrik translation error menentukan apakah bobot dinaikkan ke 25%, 50%, 100%, atau ditarik langsung ke 0%.

Observability: Deteksi Drop Rate via eBPF dan Prometheus

Metrik interface standar seperti ifconfig atau /proc/net/dev hanya menangkap frame drops fisik, bukan kegagalan translasi header IP (seperti fragmentasi gagal, IP checksum error, atau ICMP unreachability handling). Tracepoint kernel dan eBPF XDP program diperlukan untuk menangkap metrik translation drop secara real-time.

SEC("xdp")
int trace_siit_drops(struct xdp_md *ctx) {
    void *data = (void *)(long)ctx->data;
    void *data_end = (void *)(long)ctx->data_end;
    
    struct ethhdr *eth = data;
    if ((void *)(eth + 1) > data_end)
        return XDP_PASS;

    if (eth->h_proto == __constant_htons(ETH_P_IP)) {
        struct iphdr *iph = (void *)(eth + 1);
        if ((void *)(iph + 1) > data_end)
            return XDP_PASS;

        /* Identifikasi paket Don't Fragment (DF) yang melebihi MTU translasi IPv6 */
        if ((__constant_ntohs(iph->frag_off) & 0x4000) && (__constant_ntohs(iph->tot_len) > 1480)) {
            __u32 key = 1; // Key 1: MTU_EXCEEDED_DF_SET
            __u64 *count = bpf_map_lookup_elem(&drop_stats, &key);
            if (count) {
                __sync_fetch_and_add(count, 1);
            }
            return XDP_DROP;
        }
    }
    return XDP_PASS;
}

Metrik dari eBPF diekspor ke Prometheus. Konfigurasi alert rules mendeteksi anomali rasio drop translasi:

groups:
  - name: siit_translation_alerts
    rules:
      - alert: SIITHighDropRate
        expr: sum(rate(siit_dropped_packets_total[1m])) / sum(rate(siit_processed_packets_total[1m])) > 0.005
        for: 30s
        labels:
          severity: critical
        annotations:
          summary: "SIIT Gateway drop rate melampaui 0.5% pada instance {{ $labels.instance }}"

Kriteria Automated Canary Rollback

Sistem CD (Continuous Delivery) memantau webhook Prometheus/Alertmanager. Jika salah satu kondisi kegagalan terpenuhi selama jendela canary 5 menit, rute BGP canary ditarik kembali secara otomatis.

  • Latensi Translasi (p99): Peningkatan latensi p99 translasi header > 3ms dibandingkan edge proxy baseline.
  • Packet Drop Ratio: Drop rate translasi (translating failures) > 0.2% dari total throughput canary.
  • ICMP Packet Too Big (PTB) Ingestion: Peningkatan tajam ICMPv4 Type 3 Code 4 drops atau kegagalan mapping ke ICMPv6 Type 2 Code 0.
# Script trigger automated rollback via Bird BGP daemon
birdc disable canary_siit_peer
# Verifikasi konvergensi rute fallback
ip route show 0.0.0.0/0

Postmortem Singkat: Kesalahan ARP dan NDP Mismatch

Insiden: Gateway SIIT gagal meneruskan paket IPv4 ke backend target tepat setelah promosi canary 25%. Traffic terhenti dengan error Destination Host Unreachable.

Root Cause: Interface gateway dikonfigurasi pada segment L2 yang sama untuk ingress dan egress. Ketika kernel menerima frame IPv4, driver network mencoba menyelesaikan ARP address untuk IP target. Namun target backend hanya memiliki binding Neighbor Discovery Protocol (NDP) IPv6. Tidak tersedianya proxy-ARP atau bridging route yang memisahkan boundary L3 menyebabkan stack IP lokal membuang paket sebelum pipeline translasi memprosesnya.

Pencegahan: Terapkan segmentasi subinterface terisolasi berbasis VLAN (misal: eth0.100 untuk ingress IPv4, eth0.200 untuk IPv6-only internal) dan nonaktifkan parameter arp_ignore serta arp_announce pada interface IPv6 backend.

Mitigasi Regresi MTU Mismatch

Header IPv6 berukuran 40 byte, sedangkan header IPv4 standar berukuran 20 byte. Selisih 20 byte ini menyebabkan paket IPv4 dengan panjang 1500 byte (standar interface Ethernet) bertambah menjadi 1520 byte setelah translasi SIIT, sehingga melebihi batas MTU standar L2 backend.

  1. Jumbo Frames pada Fabric IPv6: Naikkan MTU interface switch, router, dan node backend internal menjadi minimal 1600 byte (atau 9000 byte jika network hardware mendukung).
  2. Clamping TCP MSS: Gateway translasi harus menerapkan TCP Maximum Segment Size (MSS) clamping otomatis untuk sesi syn/syn-ack IPv4. MSS wajib dipaksa turun sebesar 20 byte (umumnya menjadi 1420 atau 1440 byte).
    iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
  3. Translasi ICMPv6 PTB ke ICMPv4 Fragmentation Needed: Pastikan gateway SIIT tidak memfilter ICMP. Jika backend IPv6 mengirimkan ICMPv6 Packet Too Big (Type 2), SIIT wajib mentranslasikannya kembali menjadi ICMPv4 Destination Unreachable, Fragmentation Needed (Type 3, Code 4) agar pengirim IPv4 menyesuaikan PMTU discovery path mereka.