|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Alexey Markov 2:5020/400 29 Jan 2007 15:05:29 To : Vadim Goncharov Subject : Re[2]: Hетграф, ng_nat и incorrect checksum в пакетах -------------------------------------------------------------------------------- Рад видеть тебя, Vadim! Помнится, 27 января 2007 в 14:34 ты писал для Alexey Markov: VG> В пакетах без IP-опций - чексумма нормальная? Гм. Что ты имеешь в виду под словами "без IP-опций"? Пакеты, отправленные с реального адреса и через HАТ отличаются только в одном поле - чексумме, все остальные поля и опции у них совпадают. Кстати, ломается только TCP, UDP ходит нормально (предполагаемая причина - ниже). VG> Если да, то попробуй обновиться до вчерашнего 6-STABLE, там был MFC VG> фикса подсчета длины заголовка (хотя может, дело и не в этом). Обновил ng_nat.c до 1.4.2.1, 2007/01/25 21:42:47, симптомы не изменились. Похоже, дело вот в этом куске кода (комментарий Глеба): if ((ip->ip_off & htons(IP_OFFMASK)) == 0 && ip->ip_p == IPPROTO_TCP) { struct tcphdr *th = (struct tcphdr *)((caddr_t)ip + (ip->ip_hl << 2)); /* * Here is our terrible HACK. * * Sometimes LibAlias edits contents of TCP packet. * In this case it needs to recompute full TCP * checksum. However, the problem is that LibAlias * doesn't have any idea about checksum offloading * in kernel. To workaround this, we do not do * checksumming in LibAlias, but only mark the * packets in th_x2 field. If we receive a marked * packet, we calculate correct checksum for it * aware of offloading. * * Why do I do such a terrible hack instead of * recalculating checksum for each packet? * Because the previous checksum was not checked! * Recalculating checksums for EVERY packet will * hide ALL transmission errors. Yes, marked packets * still suffer from this problem. But, sigh, natd(8) * has this problem, too. */ if (th->th_x2) { th->th_x2 = 0; ip->ip_len = ntohs(ip->ip_len); th->th_sum = in_pseudo(ip->ip_src.s_addr, ip->ip_dst.s_addr, htons(IPPROTO_TCP + ip->ip_len - (ip->ip_hl << 2))); if ((m->m_pkthdr.csum_flags & CSUM_TCP) == 0) { m->m_pkthdr.csum_data = offsetof(struct tcphdr,th_sum); in_delayed_cksum(m); } ip->ip_len = htons(ip->ip_len); } } Осталось понять, почему LibAlias не выставляет th_x2 флаг для отнатленных пакетов, и как это можно исправить. Жаль, что Глеба в эхе нету... :-/ P.S. Интересно, а кто-нибудь вообще использует ng_nat на боевых серверах? -- С уважением, Алексей Марков. --- ifmail v.2.15dev5.3 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/9379e1c79f53.html, оценка из 5, голосов 10
|