Проблема с отдельными нодами Netgraph
Добавлено: 2011-11-01 9:12:42
Здравствуйте.
Не знаю куда копать и как разобраться, прошу помощи советом)
Есть роутер(сервер доступа):
FreeBSD *.ru 8.2-STABLE FreeBSD 8.2-STABLE #0: Mon Jun 6 10:30:53 MSD 2011 root@*.ru:/usr/obj/usr/src/sys/ROUTER amd64
Используется шейпер на основе ipfw+ng_car, экспорт netflow (netgraph) и PF NAT.
У каждого пользователя в сети свой серый IP. Пользователей порядка 1500 человек.
Инициализация netflow.
Для каждого пользователя создана нода по схеме как на рисунке (схема в посте ниже). Общие скрипты генерации и работы системы выкладывать не буду, для простоты рассмотрим на одном пользователе.
Коммент к рисунку, расписанный на конкретном пользователе.
473 - уникальный идентификатор пользователя для входа.
20473 - уникальный идентификатор пользователя + 20000 тысяч (уникальность сохраняется) для выхода
Создаём ноду польователя:
Нода создана, со скоростью для шейпа $speed.
Добавляем в таблицы ipfw IP абонента входящий и исходящий трафик.
Правила для шейпа в ipfw:
В таблицах всё нормально, IP добавились.
Система в такой конфигурации нормально работает, не падает, не вылетает, не дропает. Обслуживает 1500 пользоваетелей реализуя 100% качество сервиса.
Периодически пользователь вдруг не может выйти в инет, из за того что "не видит" сервер. "Не видит" выражается в полном отстутсвии пинга до сервера и соответственно нет прохождения трафика через него.
То есть с абонента пинг в сторону сервера - превышен интервал.
Пинг с сервера до абонента - превышен интервал.
Хотя tcpdump показывает что на интерфейсе и echo request и echo reply ходят.
После того как с помощью ngctl shutdown <Имя ноды>, затем пересоздание ноды по выше указанному алгоритму - и пинг чудесным образом появляется и инет начинает работать.
А теперь вопрос: почему это может возникать и как надо лечить?
Не знаю куда копать и как разобраться, прошу помощи советом)
Есть роутер(сервер доступа):
FreeBSD *.ru 8.2-STABLE FreeBSD 8.2-STABLE #0: Mon Jun 6 10:30:53 MSD 2011 root@*.ru:/usr/obj/usr/src/sys/ROUTER amd64
Используется шейпер на основе ipfw+ng_car, экспорт netflow (netgraph) и PF NAT.
У каждого пользователя в сети свой серый IP. Пользователей порядка 1500 человек.
Инициализация netflow.
Код: Выделить всё
$grphctl mkpeer ipfw: netflow 50001 iface0
$grphctl name ipfw:50001 netflow >
$grphctl connect ipfw: netflow: 50000 out0 >
$grphctl msg netflow: setdlt { iface=0 dlt=12 } >
$grphctl msg netflow: settimeouts { inactive=20 active=40 }
$grphctl mkpeer netflow: ksocket export inet/dgram/udp
$grphctl name netflow:export netflow_socket
$grphctl msg netflow_socket: connect inet/10.10.10.2:9996Коммент к рисунку, расписанный на конкретном пользователе.
473 - уникальный идентификатор пользователя для входа.
20473 - уникальный идентификатор пользователя + 20000 тысяч (уникальность сохраняется) для выхода
Создаём ноду польователя:
Код: Выделить всё
$grphctl connect ipfw: netflow: 473 iface1 > /dev/null 2>&1
$grphctl connect netflow: ipfw: iface0 20473 > /dev/null 2>&1
$grphctl msg netflow: setdlt { iface=1 dlt=12 }
$grphctl msg netflow: setdlt { iface=0 dlt=12 }
$grphctl mkpeer netflow: car out1 upper > /dev/null 2>&1
$grphctl name netflow:out1 user473 > /dev/null 2>&1
$grphctl connect netflow: user473: out0 lower > /dev/null 2>&1
$grphctl msg $node_name "setconf { upstream={ cbs=$cbs ebs=$ebs cir=$speed greenAction=1 yellowAction=1 redAction=2 mode=3 } downstream={ cbs=$cbs ebs=$ebs cir=$speed greenAction=1 yellowAction=1 redAction=2 mode=3 } }" > /dev/null 2>&1Добавляем в таблицы ipfw IP абонента входящий и исходящий трафик.
Код: Выделить всё
/sbin/ipfw table 10 add 192.168.101.45 473
/sbin/ipfw table 20 add 192.168.101.45 20473
Код: Выделить всё
01000 1806746144 642481912434 netgraph tablearg ip from table(20) to any in via em0
01001 2016396596 2072145968352 netgraph tablearg ip from any to table(10) out via em0Код: Выделить всё
ipfw table 10 list | grep 101.45
192.168.101.45/32 473
ipfw table 20 list | grep 101.45
192.168.101.45/32 20473Периодически пользователь вдруг не может выйти в инет, из за того что "не видит" сервер. "Не видит" выражается в полном отстутсвии пинга до сервера и соответственно нет прохождения трафика через него.
То есть с абонента пинг в сторону сервера - превышен интервал.
Пинг с сервера до абонента - превышен интервал.
Хотя tcpdump показывает что на интерфейсе и echo request и echo reply ходят.
Код: Выделить всё
/usr/sbin/tcpdump -i em0 -n -nn -ttt 'ip proto \icmp'
00:00:00.751567 IP 192.168.101.45 > 10.10.*.*: ICMP echo request, id 897, seq 1, length 64
00:00:00.000036 IP 10.10.*.* > 192.168.101.45: ICMP echo reply, id 897, seq 1, length 64А теперь вопрос: почему это может возникать и как надо лечить?