Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Нетграф, ng_nat и incorrect checksum в пакетах

64 views
Skip to first unread message

Alexey Markov

unread,
Jan 26, 2007, 10:30:49 AM1/26/07
to
Всем, всего, и много!

FreeBSD 6.2-RELEASE, настроен NAT через ng_nat с адресом A.B.C.D:

=========Beginning of the citation==============
00100 allow ip from any to any via lo0
00200 deny ip from any to 127.0.0.0/8
00300 deny ip from 127.0.0.0/8 to any
00321 netgraph 321 ip from any to A.B.C.D in via xl0
00322 netgraph 322 ip from 192.168.10.0/24 to any out via xl0
=========The end of the citation================

При попытке соединения из внутренней сети на внешний сервер E.F.G.H
в tcpdump на xl0 вижу следующее:

=========Beginning of the citation==============
IP (tos 0x10, ttl 64, id 31559, offset 0, flags [DF], proto: TCP (6),
length: 64) A.B.C.D.63381 > E.F.G.H.25: S, cksum 0x42c3 (incorrect (->
0x4cef), 428483941:428483941(0) win 65535 <mss 1460,nop,scale 1,nop,nop,
timestamp 270637050 0,sackOK,eol>

IP (tos 0x10, ttl 64, id 31564, offset 0, flags [DF], proto: TCP (6),
length: 64) A.B.C.D.63381 > E.F.G.H.25: S, cksum 0x370b (incorrect (->
0x4137), 428483941:428483941(0) win 65535 <mss 1460,nop,scale 1,nop,nop,
timestamp 270640050 0,sackOK,eol>
=========The end of the citation================

Понятное дело, что провайдерский гейт эти пакеты с битой чексуммой
просто дропает. Осталось выяснить - кто эти чексуммы корёжит? И как
можно отследить прохождение пакета через внутренние ноды нетграфа?
В общем, буду благодарен, если мне укажут место, где стоит копать...

P.S. С адреса самого интерфейса пакеты уходят с нормальной чексуммой.

--
С уважением, Алексей Марков.

Vadim Goncharov

unread,
Jan 27, 2007, 6:34:29 AM1/27/07
to
Hi Alexey Markov!

On Fri, 26 Jan 2007 15:30:49 +0000 (UTC); Alexey Markov wrote about 'Нетграф, ng_nat и incorrect checksum в пакетах':

AM> IP (tos 0x10, ttl 64, id 31559, offset 0, flags [DF], proto: TCP (6),
AM> length: 64) A.B.C.D.63381 > E.F.G.H.25: S, cksum 0x42c3 (incorrect (->
AM> 0x4cef), 428483941:428483941(0) win 65535 <mss 1460,nop,scale 1,nop,nop,
AM> timestamp 270637050 0,sackOK,eol>

AM> IP (tos 0x10, ttl 64, id 31564, offset 0, flags [DF], proto: TCP (6),
AM> length: 64) A.B.C.D.63381 > E.F.G.H.25: S, cksum 0x370b (incorrect (->
AM> 0x4137), 428483941:428483941(0) win 65535 <mss 1460,nop,scale 1,nop,nop,
AM> timestamp 270640050 0,sackOK,eol>

В пакетах без IP-опций - чексумма нормальная? Если да, то попробуй
обновиться до вчерашнего 6-STABLE, там был MFC фикса подсчета длины
заголовка (хотя может, дело и не в этом).

--
WBR, Vadim Goncharov. ICQ#166852181 mailto:vadim_n...@mail.ru
[Moderator of RU.ANTI-ECOLOGY][FreeBSD][http://antigreen.org][LJ:/nuclight]

Alexey Markov

unread,
Jan 29, 2007, 6:05:29 AM1/29/07
to
Рад видеть тебя, Vadim!
Помнится, 27 января 2007 в 14:34 ты писал для Alexey Markov:

VG> В пакетах без IP-опций - чексумма нормальная?

Гм. Что ты имеешь в виду под словами "без IP-опций"? Пакеты, отправленные
с реального адреса и через НАТ отличаются только в одном поле - чексумме,
все остальные поля и опции у них совпадают. Кстати, ломается только 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 на боевых серверах?

Vadim Goncharov

unread,
Jan 30, 2007, 12:22:56 PM1/30/07
to
Hi Alexey Markov!

On Mon, 29 Jan 2007 11:05:29 +0000 (UTC); Alexey Markov wrote about 'Re[2]: Нетграф, ng_nat и incorrect checksum в пакетах':

VG>> В пакетах без IP-опций - чексумма нормальная?

AM> Гм. Что ты имеешь в виду под словами "без IP-опций"? Пакеты, отправленные
AM> с реального адреса и через НАТ отличаются только в одном поле - чексумме,
AM> все остальные поля и опции у них совпадают. Кстати, ломается только TCP,
AM> UDP ходит нормально (предполагаемая причина - ниже).
[...]
AM> Осталось понять, почему LibAlias не выставляет th_x2 флаг для отнатленных
AM> пакетов, и как это можно исправить. Жаль, что Глеба в эхе нету... :-/

Напиши ему на glebius@ - наверняка ответит...

AM> P.S. Интересно, а кто-нибудь вообще использует ng_nat на боевых серверах?

Вообще, я слышал о боевом использовании, и у кого-то даже успешно
(некоторые ругались, что оно память жрет)

Dmitriy Kirhlarov

unread,
Feb 15, 2007, 8:17:47 AM2/15/07
to
Hi!

On Mon, Jan 29, 2007 at 11:05:29AM +0000, Alexey Markov wrote:

> Осталось понять, почему LibAlias не выставляет th_x2 флаг для отнатленных
> пакетов, и как это можно исправить. Жаль, что Глеба в эхе нету... :-/

13:01 < kyrh> glebius: народ в r.u.b с ng_nat мается.
13:02 <@glebius> пусть к piso обращаются

By.
Dmitriy

Alexey Markov

unread,
Feb 15, 2007, 10:31:58 AM2/15/07
to
Рад видеть тебя, Dmitriy!
Помнится, 15 февраля 2007 в 16:17 ты писал для Alexey Markov:

DK> 13:01 < kyrh> glebius: народ в r.u.b с ng_nat мается.
DK> 13:02 <@glebius> пусть к piso обращаются

Да я бы с удовольствием, только кто это - piso? Судя по фамилии,
он не здешний? ;-)

Dmitriy Kirhlarov

unread,
Feb 15, 2007, 10:55:39 AM2/15/07
to
Hi!

On Thu, Feb 15, 2007 at 03:31:58PM +0000, Alexey Markov wrote:

> DK> 13:01 < kyrh> glebius: народ в r.u.b с ng_nat мается.
> DK> 13:02 <@glebius> пусть к piso обращаются
>
> Да я бы с удовольствием, только кто это - piso? Судя по фамилии,
> он не здешний? ;-)

piso@ видимо.
Домен догадаешься какой? ;)
http://people.freebsd.org/~piso/

By.
Dmitriy

0 new messages