ng_nat, vlan, pppoe, packet fragmentation

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
vasaf
рядовой
Сообщения: 32
Зарегистрирован: 2009-04-09 12:25:38

ng_nat, vlan, pppoe, packet fragmentation

Непрочитанное сообщение vasaf » 2012-09-27 19:03:57

Всем привет!
Столкнулся с одной проблемкой на FreeBSD 8.2 i386.
Ядро собрано с:

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

options         NETGRAPH
options         NETGRAPH_IPFW
options         NETGRAPH_NAT
options         NETGRAPH_NETFLOW
options         NETGRAPH_SPLIT
options         NETGRAPH_KSOCKET
options         NETGRAPH_SOCKET
options         NETGRAPH_BPF
options         NETGRAPH_IFACE
options         NETGRAPH_MPPC_ENCRYPTION
options         NETGRAPH_MPPC_COMPRESSION
options         NETGRAPH_PPP
options         NETGRAPH_PPTPGRE
options         NETGRAPH_TCPMSS
options         NETGRAPH_VJC
options         IPFIREWALL
options         IPFIREWALL_FORWARD
options         IPFIREWALL_VERBOSE
options         LIBALIAS
options         IPDIVERT
options         DUMMYNET
Фря используется только для роутинга и подсчета статистики netflow, визуализации средствами nfsen.
На ней имеется один внешний интерфейс em2, который подвязан к одному провайдеру со статическим адресом. На этом же интерфейсе сделан vlan интерфейс, на котором сидит второй провайдер с типом подключения к инету через pppoe.
mpd5 поднимает pppoe подключение:

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

create bundle static PROVB
set bundle no compression
set iface up-script /usr/local/bin/scripts/mpd-up-ng0
set iface down-script /usr/local/bin/scripts/mpd-down-ng0
set iface enable tcpmssfix
set ifcae idle 0
set iface session 0
set ipcp ranges 0.0.0.0/0 0.0.0.0/0
set ipcp no vjcomp

create link static PROVL pppoe
set link action bundle PROVB
set link yes acfcomp
set link yes protocomp
set link no check-magic
set link no magicnum
set auth authname ******
set auth password ******
set link max-redial 0
set link mtu 1472
set link disable multilink
set link keep-alive 10 60
set pppoe iface vlan2
set pppoe service ""
open
Проблема как раз со вторым провайдером. Все вроде как замечательно работает, скорость соответствует заявленной, только не проходят через сервер пакеты размером больше 1472 байт (не полностью "не проходят", процентов 95 потерь), которые попали в ipfw netgraph 20 где над ними постарался ng_nat:

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

 mkpeer ipfw: nat 20 in
name ipfw:20 nat2
connect ipfw: nat2: 14 out
msg nat2: setaliasaddr $ngnat_aliasaddr2
Стоит перед правилом с "netgraph 20" поставить "ipfw add ... allow icmp from any to any via $iface", то все ОК.

Добавил правило:

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

ipfw add 1 reass all from any to any
В итоге серверу полегчало - он смог через это правило принять "ping -s 3000 ya.ru", но у клиентов за ним все по прежнему - не проходят пинги и большие пакеты (потери 95% и более).

Заметил, что сегодня днем я не мог пинговать свой второй сервер и ya.ru большими пакетами, а вечером смог пинговать сервер, но ya.ru не пингуется (правило ipfw reass отключено).
Я пробовал менять опции и, в том числе, mtu и multilink в mpd5 - безрезультатно.
Первый провайдер работает замечательно.
Что показывать tcpdump на втором сервере на команду "ping -s 3000 -n 1 83.220.*.*" когда пинг проходит:

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

19:50:20.347950 IP 89.169.*.* > 83.220.*.*: ICMP echo request, id 19093, seq 0, length 1280
19:50:20.348078 IP 89.169.*.* > 83.220.*.*: icmp
19:50:20.348087 IP 89.169.*.* > 83.220.*.*: icmp
19:50:20.348155 IP 83.220.*.* > 89.169.*.*: ICMP echo reply, id 19093, seq 0, length 1480
19:50:20.348158 IP 83.220.*.* > 89.169.*.*: icmp
19:50:20.348161 IP 83.220.*.* > 89.169.*.*: icmp
Подскажите куда смотреть. Тут на сто процентов ясно, что как только пакет больше 1472 байт прошел ng_nat где надо сделать обратный алиас (деалиас), то он не воспринимается.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

vasaf
рядовой
Сообщения: 32
Зарегистрирован: 2009-04-09 12:25:38

Re: ng_nat, vlan, pppoe, packet fragmentation

Непрочитанное сообщение vasaf » 2012-09-27 23:00:22

Вот что показывает tcpdump на пинг из под винды "ping -l 3000 -n 1 ya.ru", даже если первым правилом поставить на фряхе "ipfw add allow icmp from any to any", т.е. пакет в нетграф еще не попадает вообще:
1. Внутренний интерфейс:

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

office# tcpdump -i em0 -n -v icmp
tcpdump: listening on em0, link-type EN10MB (Ethernet), capture size 96 bytes
23:40:40.133054 IP (tos 0x0, ttl 128, id 29118, offset 0, flags [+], proto ICMP (1), length 1500)
    192.168.1.6 > 213.180.193.3: ICMP echo request, id 1, seq 973, length 1480
23:40:40.133076 IP (tos 0x0, ttl 128, id 29118, offset 1480, flags [+], proto ICMP (1), length 1500)
    192.168.1.6 > 213.180.193.3: icmp
23:40:40.133091 IP (tos 0x0, ttl 128, id 29118, offset 2960, flags [none], proto ICMP (1), length 68)
    192.168.1.6 > 213.180.193.3: icmp
2. А это уже интерфейс pppoe подключения второго провайдера:

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

office# tcpdump -i ng0 -n -v icmp
tcpdump: listening on ng0, link-type NULL (BSD loopback), capture size 96 bytes
23:41:45.279931 IP (tos 0x0, ttl 127, id 29149, offset 0, flags [+], proto ICMP (1), length 1276)
    192.168.1.6 > 213.180.193.3: ICMP echo request, id 1, seq 974, length 1256
23:41:45.279941 IP (tos 0x0, ttl 127, id 29149, offset 1256, flags [+], proto ICMP (1), length 244)
    192.168.1.6 > 213.180.193.3: icmp
23:41:45.279953 IP (tos 0x0, ttl 127, id 29149, offset 1480, flags [+], proto ICMP (1), length 1276)
    192.168.1.6 > 213.180.193.3: icmp
23:41:45.279960 IP (tos 0x0, ttl 127, id 29149, offset 2736, flags [+], proto ICMP (1), length 244)
    192.168.1.6 > 213.180.193.3: icmp
23:41:45.279970 IP (tos 0x0, ttl 127, id 29149, offset 2960, flags [none], proto ICMP (1), length 68)
    192.168.1.6 > 213.180.193.3: icmp
Так вот вопрос, почему вдруг фря уменьшила размер пакетов до 1276 байт?
Никакие параметры mtu, mru и mrru не влияют на это значение в mpd5 - пробовал.

Пинг с винды "ping -l 3000 -n 1 ya.ru" с результатом "Превышен результат ожидания для запроса" при set link mtu 1460 в MPD5 на внутреннем интерфейсе:

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

office# tcpdump -i em0 -n -v icmp
tcpdump: listening on em0, link-type EN10MB (Ethernet), capture size 96 bytes
23:48:10.675431 IP (tos 0x0, ttl 128, id 29233, offset 0, flags [+], proto ICMP (1), length 1500)
    192.168.1.6 > 213.180.193.3: ICMP echo request, id 1, seq 978, length 1480
23:48:10.675447 IP (tos 0x0, ttl 128, id 29233, offset 1480, flags [+], proto ICMP (1), length 1500)
    192.168.1.6 > 213.180.193.3: icmp
23:48:10.675457 IP (tos 0x0, ttl 128, id 29233, offset 2960, flags [none], proto ICMP (1), length 68)
    192.168.1.6 > 213.180.193.3: icmp
23:48:10.681695 IP (tos 0x60, ttl 60, id 1243, offset 0, flags [+], proto ICMP (1), length 1492)
    213.180.193.3 > 192.168.1.6: ICMP echo reply, id 1, seq 978, length 1472
23:48:10.681817 IP (tos 0x60, ttl 60, id 1243, offset 1480, flags [+], proto ICMP (1), length 1492)
    213.180.193.3 > 192.168.1.6: icmp
23:48:10.681942 IP (tos 0x60, ttl 60, id 1243, offset 1472, flags [+], proto ICMP (1), length 28)
    213.180.193.3 > 192.168.1.6: icmp
23:48:10.681954 IP (tos 0x60, ttl 60, id 1243, offset 2952, flags [+], proto ICMP (1), length 28)
    213.180.193.3 > 192.168.1.6: icmp
23:49:10.359843 IP (tos 0x0, ttl 128, id 29254, offset 0, flags [none], proto ICMP (1), length 576)
    192.168.1.6 > 213.180.193.3: ICMP ip reassembly time exceeded, length 556
        IP (tos 0x60, ttl 60, id 1243, offset 0, flags [+], proto ICMP (1), length 1492)
    213.180.193.3 > 192.168.1.6: ICMP echo reply, id 1, seq 978, length 1472[|icmp]
Тестируемый комп отправляет ICMP 11: ICMP ip reassembly time exceeded. Т.е. не может собрать полностью пакет. По этому тоже читал в инете, но все что удалось найти подходящее: использование в начале ipfw правил divert на ksocket + ng_echo - я не считаю это решением.
На внешнем ng0 тоже самое, только на исходящих пакетах length 1276.

Самое интересное, что днем правило "ipfw reass all from any to any via ng0" не давало никаких улучшений передачи больших пакетов для пользователей (только для сервера норм было), а под вечер оно волшебным образом заработало и пошли гулять большие пакеты и от пользователей тоже. В tcpdump при этом все ровно, за исключение исходящих пакетов на ng0, которые имели length 1276.

Подскажите где копать? Я уже не знаю че делать, из-за этой хрени некоторые сайты не работают как надо. От vlan на фре отказаться?