В данный момент эта заметка — черновик. Она содержит ключевые конфиги и команды для получения статистики использования IPv4/IPv6 трафика, а также трафика, который адресован NAT64. На текущий момент конфигурации не достаточно хорошо протестированы и могут выдавать искажённую информацию.

table inet clat_traffic_stats {
 
    # Именованные счетчики трафика
    counter c_in_pure_v6  { comment "Входящий чистый IPv6" }
    counter c_in_nat64    { comment "Входящий NAT64" }
    counter c_in_pure_v4  { comment "Входящий нативный IPv4" }
 
    counter c_out_pure_v6 { comment "Исходящий чистый IPv6" }
    counter c_out_nat64   { comment "Исходящий NAT64 (до упаковки в eBPF)" }
    counter c_out_pure_v4 { comment "Исходящий нативный IPv4" }
 
    # 1. ВХОДЯЩИЙ ТРАФИК (Хук prerouting)
    chain clat_in {
        type filter hook prerouting priority filter; policy accept;
 
        # NetworkManager CLAT выдает приложениям IPv4-адрес из диапазона RFC 7335 (192.0.0.0/29).
        # Если входящий пакет имеет адрес назначения из этого диапазона, значит он пришел
        # из сети как NAT64 (IPv6) и eBPF его успешно распаковал.
        ip daddr 192.0.0.0/29 counter name c_in_nat64 accept
 
        # Если пакет IPv6 (после прохода eBPF он остался IPv6) — это чистый IPv6
        meta nfproto ipv6 counter name c_in_pure_v6 accept
 
        # Любой другой IPv4 пакет (пришедший в обычных Wi-Fi сетях) — нативный IPv4
        meta nfproto ipv4 counter name c_in_pure_v4 accept
    }
 
    # 2. ИСХОДЯЩИЙ ТРАФИК (Хук output)
    chain clat_out {
        type filter hook output priority filter; policy accept;
 
        # Если приложение само сформировало пакет на IPv6-префикс NAT64 напрямую
        ip6 daddr 64:ff9b::/96 counter name c_out_nat64 accept
 
        # Обычный исходящий IPv6 (не NAT64)
        meta nfproto ipv6 counter name c_out_pure_v6 accept
 
        # Если приложение отправляет IPv4 с CLAT-адреса (RFC 7335) — это будущий NAT64,
        # который eBPF CLAT через мгновение упакует в IPv6
        ip saddr 192.0.0.0/29 counter name c_out_nat64 accept
 
        # Любой другой исходящий IPv4 (в сетях с честным Dual-Stack или IPv4-only)
        meta nfproto ipv4 counter name c_out_pure_v4 accept
    }
}

Просмотр статистики

#!/bin/bash
 
# Читаем JSON один раз в переменную, чтобы не вызывать nft многократно
JSON_DATA=$(sudo nft -j list table inet clat_traffic_stats)
 
# Функция для получения байт по имени счетчика
get_bytes() {
    echo "$JSON_DATA" | jq ".nftables[] | select(.counter.name == \"$1\") | .counter.bytes"
}
 
echo "=== ТРАФИК ИЗ СЕТИ (ВХОДЯЩИЙ) ==="
echo "Чистый IPv6: $(get_bytes c_in_pure_v6) байт"
echo "NAT64 / CLAT: $(get_bytes c_in_nat64) байт"
echo "Нативный IPv4: $(get_bytes c_in_pure_v4) байт"
echo ""
echo "=== ТРАФИК В СЕТЬ (ИСХОДЯЩИЙ) ==="
echo "Чистый IPv6: $(get_bytes c_out_pure_v6) байт"
echo "NAT64 / CLAT: $(get_bytes c_out_nat64) байт"
echo "Нативный IPv4: $(get_bytes c_out_pure_v4) байт"