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. С адреса самого интерфейса пакеты уходят с нормальной чексуммой.
--
С уважением, Алексей Марков.
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]
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 на боевых серверах?
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 на боевых серверах?
Вообще, я слышал о боевом использовании, и у кого-то даже успешно
(некоторые ругались, что оно память жрет)
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
DK> 13:01 < kyrh> glebius: народ в r.u.b с ng_nat мается.
DK> 13:02 <@glebius> пусть к piso обращаются
Да я бы с удовольствием, только кто это - piso? Судя по фамилии,
он не здешний? ;-)
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