Как я могу перенаправить трафик с одного порта на другой в том же интерфейсе?

Мне нужно, чтобы трафик, попадающий в докер-контейнер на определенный порт, перенаправлялся на другой контейнер, ip которого я знаю, на другой порт с помощью xdp. Для этого я меняю контрольную сумму структуры iphdr:

// Backup old dest address
     unsigned short old_daddr = ntohs(*(unsigned short *)&iph->daddr);
// Override ip header
     iph->tos = 7 << 2;      // DSCP: 7
     iph->daddr = bpf_htonl(2887516418);  // Dest: 172.28.1.2
     iph->check = 0;
     iph->check = checksum((unsigned short *)iph, sizeof(struct iphdr));
...

а затем контрольная сумма структуры tcphdr:

// Update tcp checksum
    unsigned long sum = old_daddr + (~ntohs(*(unsigned short *)&iph->daddr) & 0xffff);
    sum += ntohs(tcp->check);
    sum = (sum & 0xffff) + (sum>>16);
    tcp->check = htons(sum + (sum>>16) - 1);

__u16 new_port = 5555;
    if ((__u16)bpf_ntohs(tcp->dest) == new_port) {
        printt("new check: %d, dest port: %d, source port: %d\n", tcp->check, (__u16)bpf_ntohs(tcp->dest), (__u16)bpf_ntohs(tcp->source));
    } else if ((__u16)bpf_ntohs(tcp->dest) == (__u16)4224) {
        update_tcp_header_port(tcp, &new_port);
        printt("change check: %d, dest port: %d, source port: %d\n", tcp->check, (__u16)bpf_ntohs(tcp->dest), (__u16)bpf_ntohs(tcp->source));
    }
...
return XDP_TX;

но не работает, что я делаю не так?


person Alexandr Ershov    schedule 02.06.2020    source источник
comment
Как вы вычисляете контрольную сумму IP? Почему вы не используете выделенный помощник для вычисления контрольной суммы TCP? Проверяли ли вы статистику вашей сетевой карты, чтобы понять, почему она отбрасывает пакеты (если это действительно то, что она делает)?   -  person pchaigno    schedule 02.06.2020
comment
Что именно не работает? Из вашего предыдущего вопроса я понимаю, что вы можете успешно загрузить и подключить программу, но перенаправление не выполняется, верно? Выводит ли printt() то, что вы ожидаете? К какому интерфейсу вы подключаете программу?   -  person Qeole    schedule 02.06.2020