Страница 1 из 1

FreeBSD 7 Kernel Nat Парадокс или кривые руки

Добавлено: 2008-11-17 16:51:03
Darwent
Есть два компьютера и сервер.

Код: Выделить всё

+-----------+        +------------+         +-----------+ 
|  Комп 1   |<------>| FreeBSD    |<------->|  Комп 2   |
+-----------+        +------------+         +-----------+
Установлено 2 сетевые карты
1. Intel PCI-E 1x
2. Какаято VIA PCI

Код: Выделить всё

[root@hs1 ~]# ifconfig
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=19b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4>
        ether 00:1b:21:22:e3:dd
        inet 10.27.0.20 netmask 0xffffff00 broadcast 10.27.0.255
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
vr0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=8<VLAN_MTU>
        ether 00:30:4f:34:9b:fa
        inet 10.28.0.1 netmask 0xff000000 broadcast 10.255.255.255
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        inet 127.0.0.1 netmask 0xff000000
Настраиваю ipfw

Код: Выделить всё

[root@hs1 ~]# cat /etc/ipfw.conf
#!/bin/sh
cmd="/sbin/ipfw -q" # ipfw command

${cmd} -f flush
${cmd} add check-state
${cmd} add allow ip from any to any via lo0
${cmd} add deny ip from any to 127.0.0.0/8
${cmd} add deny ip from 127.0.0.0/8 to any

#--------NAT-----------------------------------------------
${cmd} nat 10 config if vr0
${cmd} add nat 10 ip4 from any to any via vr0

${cmd} add allow ip from any to any
В виде эксперимента с Kernel Nat разрешил всё. На обоих машинах сервер стоит как шлюз. Если указать nat vr0 то с пинги со второго компютера до компьютера 1 не идут. С первого до второго идут. На обоих компьютерах можно подключится к серверу по SSH и никаких ограничений.
Странно то что если указать nat em0, то со второго компьютера до первого пинги идут но у первого пропадает доступ к серверу всё что можно сделать это его попинговать.

Re: FreeBSD 7 Kernel Nat Парадокс или кривые руки

Добавлено: 2008-11-17 17:12:37
hizel
жую :)

предположим что первый компьютер за vr0
второй за em0

Код: Выделить всё

${cmd} nat 10 config if vr0
${cmd} add nat 10 ip4 from any to any via vr0
1. пакетик от второго компа прилетает на em0 , роутицо на vr0 и вылетая из vr0 приобразуется натом к айпишнегу прибитому на vr0
долетает до первого компьютера, первый отвечает, пакетик прилетает на vr0, натицо обратно и летит до компа за em0 второго тобишь

2. пакетик от первого компа прилетает на vr0, роутицо до em0 и летит до воторой машины, вторая отвечает, ответ прилетает на em0
роутицо до vr0 и тут хряк вылетая из vr0 натицо и в таком виде прилетает к первому компу, первый комп в шоке, пинг ясен пень не защитывается =)

Re: FreeBSD 7 Kernel Nat Парадокс или кривые руки

Добавлено: 2008-11-17 17:23:50
Darwent
hizel писал(а):жую :)

предположим что первый компьютер за vr0
второй за em0

Код: Выделить всё

${cmd} nat 10 config if vr0
${cmd} add nat 10 ip4 from any to any via vr0
1. пакетик от второго компа прилетает на em0 , роутицо на vr0 и вылетая из vr0 приобразуется натом к айпишнегу прибитому на vr0
долетает до первого компьютера, первый отвечает, пакетик прилетает на vr0, натицо обратно и летит до компа за em0 второго тобишь

2. пакетик от первого компа прилетает на vr0, роутицо до em0 и летит до воторой машины, вторая отвечает, ответ прилетает на em0
роутицо до vr0 и тут хряк вылетая из vr0 натицо и в таком виде прилетает к первому компу, первый комп в шоке, пинг ясен пень не защитывается =)
Тут собственно:
Компьютер 1 сиди на em0 если включить нат на em0 то с компьютера 1 по ip адересу em0 происходит что-то непонятное работает только пинг
Компьютер 2 сидит на vr0 если включить нат на этом устройстве всё работает без сбоев

С Дивертом таких проблем небыло, только хотелось попрабовать именно Kernel Nat, так как надо для домашней сети натить интернет, и 2 локалки.

Re: FreeBSD 7 Kernel Nat Парадокс или кривые руки

Добавлено: 2008-11-17 17:45:46
hizel
хорошо бы ipfw show и ipfw nat 10 show config в обоих случаях

ХИНТ: сколько раз пакет натится если извесно, что через правило via $int пакет в одну сторону проходит два раза? ;)

тут видимо отличие в том что divert если пропускает\обрабатывает пакет, то пущает его дальше по правилам , а в kernel nat имеет значение опция one_pass которая по умолчанию включена, тоесть пакетик пройдя через nat сразу акцептицо

Re: FreeBSD 7 Kernel Nat Парадокс или кривые руки

Добавлено: 2008-11-17 18:04:49
Darwent
hizel писал(а):хорошо бы ipfw show и ipfw nat 10 show config в обоих случаях

ХИНТ: сколько раз пакет натится если извесно, что через правило via $int пакет в одну сторону проходит два раза? ;)

тут видимо отличие в том что divert если пропускает\обрабатывает пакет, то пущает его дальше по правилам , а в kernel nat имеет значение опция one_pass которая по умолчанию включена, тоесть пакетик пройдя через nat сразу акцептицо

Код: Выделить всё

[root@hs1 ~]# ipfw show
00100    0      0 check-state
00200    0      0 allow ip from any to any via lo0
00300    0      0 deny ip from any to 127.0.0.0/8
00400    0      0 deny ip from 127.0.0.0/8 to any
00500 8080 402248 nat 10 ip4 from any to any via vr0
00600 8059 431445 allow tcp from any to any out
00700   26   1506 allow udp from any to any out
00800  359  34642 allow ip from any to any via em0
00900    0      0 allow ip from any to any
65535    0      0 deny ip from any to any

[root@hs1 ~]# ipfw nat 10 show config
ipfw nat 10 config if vr0

Код: Выделить всё

[root@hs1 ~]# ipfw show
00100   0     0 check-state
00200   0     0 allow ip from any to any via lo0
00300   0     0 deny ip from any to 127.0.0.0/8
00400   0     0 deny ip from 127.0.0.0/8 to any
00500 199 50707 nat 10 ip4 from any to any via em0
00600  83 22880 allow tcp from any to any out
00700   0     0 allow udp from any to any out
00800   0     0 allow ip from any to any via em0
00900 112 26578 allow ip from any to any
65535   0     0 deny ip from any to any

[root@hs1 ~]# ipfw nat 10 show config
ipfw nat 10 config if em0

Re: FreeBSD 7 Kernel Nat Парадокс или кривые руки

Добавлено: 2008-11-17 19:59:56
hizel
*недоумение*

только tcpdump видимо прольет свет понимания на эту ситуацию

Re: FreeBSD 7 Kernel Nat Парадокс или кривые руки

Добавлено: 2008-11-17 20:46:11
Darwent
hizel писал(а):*недоумение*

только tcpdump видимо прольет свет понимания на эту ситуацию
Попробовал tcpdump правда мало что понял вот логи в двух случаях

1. Нат на em0 и соответсвенно сервер по ip em0 только пингуется

Код: Выделить всё

20:16:19.938680 IP 10.27.0.1.ndm-requester > 10.27.0.20.ssh: S 500718261:500718261(0) win 65535 <mss 1460,nop,nop,sackOK>
20:16:19.938710 IP 10.27.0.20.ssh > 10.27.0.1.ndm-requester: S 2829909988:2829909988(0) ack 500718262 win 65535 <mss 1460,sackOK,eol>
20:16:20.254464 IP 10.27.0.20.33960 > 10.27.0.254.domain: 43846+ PTR? 20.0.27.10.in-addr.arpa. (41)
20:16:22.825021 IP 10.27.0.1.ndm-requester > 10.27.0.20.ssh: S 500718261:500718261(0) win 65535 <mss 1460,nop,nop,sackOK>
20:16:22.825031 IP 10.27.0.20.ssh > 10.27.0.1.ndm-requester: S 2829909988:2829909988(0) ack 500718262 win 65535 <mss 1460,sackOK,eol>
20:16:25.357527 IP 10.27.0.20.33960 > 10.27.0.254.domain: 43846+ PTR? 20.0.27.10.in-addr.arpa. (41)
20:16:25.886113 IP 10.27.0.20.ssh > 10.27.0.1.ndm-requester: S 2829909988:2829909988(0) ack 500718262 win 65535 <mss 1460,sackOK,eol>
20:16:28.840694 IP 10.27.0.1.ndm-requester > 10.27.0.20.ssh: S 500718261:500718261(0) win 65535 <mss 1460,nop,nop,sackOK>
20:16:28.840704 IP 10.27.0.20.ssh > 10.27.0.1.ndm-requester: S 2829909988:2829909988(0) ack 500718262 win 65535 <mss 1460,sackOK,eol>
20:16:31.901596 IP 10.27.0.20.ssh > 10.27.0.1.ndm-requester: S 2829909988:2829909988(0) ack 500718262 win 65535 <mss 1460,sackOK,eol>
20:16:35.562982 IP 10.27.0.20.27222 > 10.27.0.254.domain: 43847+ PTR? 1.0.27.10.in-addr.arpa. (40)
20:16:38.024229 IP 10.27.0.20.ssh > 10.27.0.1.ndm-requester: S 2829909988:2829909988(0) ack 500718262 win 65535 <mss 1460,sackOK,eol>
20:16:40.666148 IP 10.27.0.20.27222 > 10.27.0.254.domain: 43847+ PTR? 1.0.27.10.in-addr.arpa. (40)
20:16:50.269494 IP 10.27.0.20.ssh > 10.27.0.1.ndm-requester: S 2829909988:2829909988(0) ack 500718262 win 65535 <mss 1460,sackOK,eol>
20:16:51.892036 IP 10.27.0.20.49598 > 10.27.0.254.domain: 43848+ PTR? 254.0.27.10.in-addr.arpa. (42)
20:16:56.995210 IP 10.27.0.20.49598 > 10.27.0.254.domain: 43848+ PTR? 254.0.27.10.in-addr.arpa. (42)
20:17:30.913703 IP 10.27.0.1 > 10.27.0.20: ICMP echo request, id 1024, seq 19968, length 40
20:17:30.913714 IP 10.27.0.20 > 10.27.0.1: ICMP echo reply, id 1024, seq 19968, length 40
20:17:31.905883 IP 10.27.0.1 > 10.27.0.20: ICMP echo request, id 1024, seq 20224, length 40
20:17:31.905891 IP 10.27.0.20 > 10.27.0.1: ICMP echo reply, id 1024, seq 20224, length 40
20:17:58.501248 IP 10.27.0.1.netbios-dgm > 10.27.0.255.netbios-dgm: NBT UDP PACKET(138)
2. Тут нат отключен и к серверу подключает.

Код: Выделить всё

20:22:21.965945 arp who-has 10.27.0.20 tell 10.27.0.1
20:22:21.965959 arp reply 10.27.0.20 is-at 00:1b:21:22:e3:dd (oui Unknown)
20:22:21.966566 IP 10.27.0.1.timbuktu-srv2 > 10.27.0.20.ssh: S 2987811056:2987811056(0) win 65535 <mss 1460,nop,nop,sackOK>
20:22:21.966592 IP 10.27.0.20.ssh > 10.27.0.1.timbuktu-srv2: S 2301099375:2301099375(0) ack 2987811057 win 65535 <mss 1460,sackOK,eol>
20:22:21.966940 IP 10.27.0.1.timbuktu-srv2 > 10.27.0.20.ssh: . ack 1 win 65535
20:22:22.016512 IP 10.27.0.20.ssh > 10.27.0.1.timbuktu-srv2: P 1:40(39) ack 1 win 65535
20:22:22.017037 IP 10.27.0.1.timbuktu-srv2 > 10.27.0.20.ssh: P 1:29(28) ack 40 win 65496
20:22:22.017162 IP 10.27.0.1.timbuktu-srv2 > 10.27.0.20.ssh: P 29:541(512) ack 40 win 65496
20:22:22.017169 IP 10.27.0.20.ssh > 10.27.0.1.timbuktu-srv2: . ack 541 win 65188
20:22:22.017172 IP 10.27.0.1.timbuktu-srv2 > 10.27.0.20.ssh: P 541:645(104) ack 40 win 65496
20:22:22.018000 IP 10.27.0.20.ssh > 10.27.0.1.timbuktu-srv2: P 40:776(736) ack 645 win 65084
20:22:22.018536 IP 10.27.0.1.timbuktu-srv2 > 10.27.0.20.ssh: P 645:661(16) ack 776 win 64760
20:22:22.023327 IP 10.27.0.20.ssh > 10.27.0.1.timbuktu-srv2: P 776:1312(536) ack 661 win 65535
20:22:22.209684 IP 10.27.0.20.42304 > 10.27.0.254.domain: 31433+ PTR? 20.0.27.10.in-addr.arpa. (41)
20:22:22.210801 IP 10.27.0.254.domain > 10.27.0.20.42304: 31433 NXDomain 0/1/0 (91)
20:22:22.210881 IP 10.27.0.20.25188 > 10.27.0.254.domain: 31434+ PTR? 1.0.27.10.in-addr.arpa. (40)
20:22:22.211800 IP 10.27.0.254.domain > 10.27.0.20.25188: 31434 NXDomain 0/1/0 (90)
20:22:22.235286 IP 10.27.0.1.timbuktu-srv2 > 10.27.0.20.ssh: . ack 1312 win 64224
20:22:22.250153 IP 10.27.0.1.timbuktu-srv2 > 10.27.0.20.ssh: P 661:1173(512) ack 1312 win 64224
20:22:22.250158 IP 10.27.0.1.timbuktu-srv2 > 10.27.0.20.ssh: P 1173:1189(16) ack 1312 win 64224
20:22:22.250165 IP 10.27.0.20.ssh > 10.27.0.1.timbuktu-srv2: . ack 1189 win 65172
20:22:22.266497 IP 10.27.0.20.ssh > 10.27.0.1.timbuktu-srv2: P 1312:2352(1040) ack 1189 win 65535
20:22:22.454036 IP 10.27.0.1.timbuktu-srv2 > 10.27.0.20.ssh: . ack 2352 win 65535
20:22:22.566722 IP 10.27.0.1.timbuktu-srv2 > 10.27.0.20.ssh: P 1189:1205(16) ack 2352 win 65535
20:22:22.567221 IP 10.27.0.1.timbuktu-srv2 > 10.27.0.20.ssh: P 1205:1257(52) ack 2352 win 65535
20:22:22.567228 IP 10.27.0.20.ssh > 10.27.0.1.timbuktu-srv2: . ack 1257 win 65535
20:22:22.567278 IP 10.27.0.20.ssh > 10.27.0.1.timbuktu-srv2: P 2352:2404(52) ack 1257 win 65535
20:22:22.782098 IP 10.27.0.1.timbuktu-srv2 > 10.27.0.20.ssh: . ack 2404 win 65483
20:22:23.232123 IP 10.27.0.20.62403 > 10.27.0.254.domain: 31435+ PTR? 254.0.27.10.in-addr.arpa. (42)
20:22:23.233214 IP 10.27.0.254.domain > 10.27.0.20.62403: 31435 NXDomain 0/1/0 (92)

Re: FreeBSD 7 Kernel Nat Парадокс или кривые руки

Добавлено: 2008-11-17 21:10:04
hizel
10.27.0.20 пытается обратную зону разресолвить, а ему никто не отвечает =/
если бы подождали малек, то он и по ssh вас бы пустил ;)

сравните

1.

Код: Выделить всё

20:16:35.562982 IP 10.27.0.20.27222 > 10.27.0.254.domain: 43847+ PTR? 1.0.27.10.in-addr.arpa. (40)
2.

Код: Выделить всё

20:22:22.209684 IP 10.27.0.20.42304 > 10.27.0.254.domain: 31433+ PTR? 20.0.27.10.in-addr.arpa. (41)
20:22:22.210801 IP 10.27.0.254.domain > 10.27.0.20.42304: 31433 NXDomain 0/1/0 (91)

Re: FreeBSD 7 Kernel Nat Парадокс или кривые руки

Добавлено: 2008-11-17 21:55:05
Darwent
hizel писал(а):10.27.0.20 пытается обратную зону разресолвить, а ему никто не отвечает =/
если бы подождали малек, то он и по ssh вас бы пустил ;)

сравните

1.

Код: Выделить всё

20:16:35.562982 IP 10.27.0.20.27222 > 10.27.0.254.domain: 43847+ PTR? 1.0.27.10.in-addr.arpa. (40)
2.

Код: Выделить всё

20:22:22.209684 IP 10.27.0.20.42304 > 10.27.0.254.domain: 31433+ PTR? 20.0.27.10.in-addr.arpa. (41)
20:22:22.210801 IP 10.27.0.254.domain > 10.27.0.20.42304: 31433 NXDomain 0/1/0 (91)
Проблема заключалась в опция сетевой карты интел rxcsum, txcsum. При их отключении через ifconfig всё заработало. А вот что это за опции буду читать :) hizel благодарю за помощь наставил на путь истинный!

Re: FreeBSD 7 Kernel Nat Парадокс или кривые руки

Добавлено: 2008-11-17 22:23:00
hizel
:shock:

Re: FreeBSD 7 Kernel Nat Парадокс или кривые руки

Добавлено: 2008-11-17 22:31:29
Darwent
hizel писал(а)::shock:
Сам немного в шоке, как контрольные суммы могут влиять на работу нат, но факт остался фактом. Но при отключении этих опций и TSO всё заработало.