Network Tracing

Tracking network connections

open() ve read() gibi, network bağlantılarının da bir deneme (entry) ve bir sonuç (exit) aşaması vardır. Bu event’leri ilişkilendirmek için entry noktasında veriyi saklayıp exit noktasında geri alırız.

connect syscall

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

Entry noktasında (sys_enter_connect):

  • ctx->args[0] = socket file descriptor
  • ctx->args[1] = sockaddr struct’ına pointer (user space)

Exit noktasında (sys_exit_connect):

  • ctx->ret == 0 - Bağlantı başarılı
  • ctx->ret < 0 - Bağlantı başarısız (errno value)

sockaddr struct’ını okuma

ctx->args[1]’deki addr pointer’ı user space belleğine işaret eder. Güvenli bir şekilde kopyalamak için bpf_probe_read_user() kullanmanız gerekir:

struct sockaddr_in addr;
bpf_probe_read_user(&addr, sizeof(addr), (void *)ctx->args[1]);

IPv4 bağlantıları için (sin_family == 2):

struct sockaddr_in {
    u16 sin_family;  // AF_INET = 2
    u16 sin_port;    // Port (network byte order!)
    u32 sin_addr;    // IP address
    char __pad[8];
};

Port ve IP network byte order (big-endian) formatındadır. Host order’a dönüştürmek için helper fonksiyonu kullanın:

u16 port = bpf_ntohs(addr.sin_port);

Görev

Bir program birden fazla port’a bağlanmayı deniyor. Çoğu bağlantı başarısız oluyor, ancak biri başarılı. Başarılı olan bağlantının port’unu gönderin.

Yapmanız gereken:

  1. connect entry noktasında: sockaddr_in struct’ını okuyun ve port’u geçici bir map’te saklayın
  2. connect exit noktasında: Bağlantının başarılı olup olmadığını kontrol edin (ret == 0), ardından port’u gönderin

Başlangıç kodu takip etmeniz gereken yapıyı içerir.

Quick reference
Insert or update map entry
Function bpf_map_update_elem Full documentation
Args:
void* mappointer to map
const void* keypointer to key
const void* valuepointer to value
u64 flagsBPF_ANY (create or update), BPF_NOEXIST (create only), or BPF_EXIST (update only)
On success, returns 0
On error, returns negative error code
Get value from map by key
Function bpf_map_lookup_elem Full documentation
Args:
void* mappointer to map
const void* keypointer to key
Returns pointer to value if found, NULL otherwise
Remove entry from map
Function bpf_map_delete_elem Full documentation
Args:
void* mappointer to map
const void* keypointer to key to delete
On success, returns 0
On error, returns negative error code if key not found
Run your code to see execution events here