Страница 1 из 2
ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-17 19:36:20
neko
Имееться 2 хоста freebsd 6.2-6.4 со связкой ipfw+natd периодически замечаю обрывы сессий сквозь нат. Тобишь выкачать с фтп изошку куском более 120-170 мег без докачки практически невозможно. Также дружно начинают жаловаться геймеры с одинаковым симптомом "рвет каждых 10-15-20 минут". На фоне этого пакетлоза нету - пускаем пинг подальше на несколько суток - максимум пара пакетов теряеться что считаю отличным показателем. Пока что на скорую руку поднял по несколько экземпляров natd на алиасах и свободных сетевухах и рассовываю туда дивертами особо чувствительный траффик типа всяких мморпг итд на которые более всего жалуються юзера. Но это естественно не вариант и конечно же плохо.
Среднестатистический load averages: 0.13, 0.23, 0.35 тобишь не зашкаливают как таковые, natd кудою ходит большинство траффика тоже в топе не проявляют чудес нагруженности. Ладно. Раньше списывал на здоровый поток (на каждом из хостов в среднем 20-30 мбит трафика при 300-500 юзерами за этим же натом) и славу natd(все понимаю, юзерспейс, переключение контекста итд..).
Все это можно было объяснить до того момента когда пришло время выносить на новый хост небольшой сегмент сети. Для начала переехало туда около сотни пользователей для долизывания нового биллинга, из них 20-30 постоянно онлайн (читай видим их деятельность в trafshow). Казалось бы все должно быть отлично хоть тут (юзеров немного, чистым интернетом там ходит 2-5 мбит/с, весь остальной траффик не существенен так как ходит не сквозь нат, да и его не много). Теперь сижу изумляюсь тому как даже при таких условиях докачать без докачки изошку (принял для себя как тест) более чем до 90-120 мег невозможно.
Гуглил - sysctl кручен во все стороны - абсолютно никакого видимого еффекта.
Теперь изгуглил весь гугл, обчитался много-много "умных советов" про "переходи на ipnat/ng_nat/pfnat - natd зло итд". Но практической возможности вот так вот просто "взять и перейти" на pfnat как минимум на одном из хостов допустим попросту нету - себестоимость такого перехода и сложность реализации в силу наличия клозедсорцного биллинга для одного из сегментов сети будет мягко говоря очень неприятной. Естественно что при скоростях выше 30-40 мбит/с я вижу единственный способ - заиметь АС и вообще отказаться от ната. Но это в ближайших перспективах. С другой стороны я просто не понимаю - что связка ipfw+natd не способна вытянуть 2-5 мбит живого траффика при 20-30 пользователях? Естественно способна, причем по заверениям умных людей конец ей приходит при тех же 35-40 мбитах потока. Итого вопрос - что я делаю не так? И в каком направлении следует порыть причину _внезапных_ дропов сессий?
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-17 21:03:41
hizel
пахнет хреновым аплинком
няшный natd работает как швейцарские часы, гарантирую :-)
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-17 21:41:23
neko
пахнет хреновым аплинком
- отказываюсь верить
Без НАТа единичный виндовый хост воткнутый на прямую на сим аплинке с назначенной реальной айпишкой отлично льет на предельной скорости изошки любого размера ясно без обрывов. Кроме того няшные natd которые понаподнимались рядышком проблеме не подвержены практически - тудою тожно можно комфортно лить изошки
няшный natd работает как швейцарские часы, гарантирую :-)
Ну это зависит думаю от руконогости - в данном случае грешу на собственную. Только банально не понимаю где может быть подвох.
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-18 14:31:20
neko
Посидел, мыслей воообще нету - изошки далее не качаються :\
Все конструктивно вроде, бы безупречно
cat /etc/rc.conf | grep default
defaultrouter="192.168.3.1"
#(читаем резервный канал)
NATD висят следующим образом:
/sbin/natd -u -p 8671 -a xxx.xxx.xxx.122 - основной канал
/sbin/natd -u -p 8673 -a 192.168.1.3 - все тот же основной канал но сквозь другой хост
/sbin/natd -u -p 8672 -a 192.168.3.5 - резервный канал
FwCMD="/sbin/ipfw -q"
${FwCMD} -f flush
# Networks define
# тут живут юзера
${FwCMD} table 2 add 172.90.0.0/21
# Это наши реальные и нереальные айпишки с сервисами
# к которым не будем натить
${FwCMD} table 9 add xxx.xxx.xxx.116
${FwCMD} table 9 add xxx.xxx.xxx.120
${FwCMD} table 9 add xxx.xxx.xxx.115
${FwCMD} table 9 add xxx.xxx.xxx.117
${FwCMD} table 9 add xxx.xxx.xxx.118
${FwCMD} table 9 add xxx.xxx.xxx.119
${FwCMD} table 9 add xxx.xxx.xxx.121
${FwCMD} table 9 add xxx.xxx.xxx.122
${FwCMD} table 9 add 192.168.0.0/24
#security
${FwCMD} add 101 allow all from 172.90.0.1 to any
${FwCMD} add 101 allow all from any to 172.90.0.1
${FwCMD} add 101 allow all from 172.16.0.1 to any
${FwCMD} add 101 allow all from any to 172.16.0.1
${FwCMD} add 102 deny all from table\(2\) to 192.168.0.0/24
${FwCMD} add 102 deny all from 192.168.0.0/24 to table\(2\)
# ну мы же хотим чтобы пользователи могли свою статистику проверить даже если денег нету
${FwCMD} add 103 allow all from table\(2\) to me dst-port 80
${FwCMD} add 103 allow all from table\(2\) to me dst-port 53
${FwCMD} add 104 deny all from table\(2\) to me dst-port 139
${FwCMD} add 104 deny all from me to table\(2\) dst-port 139
#internet natting and preserving
# Категория пользователей которые живут перманентно в резервном канале - table(5)
# - всякие спонсорские, и ультрадешевые промо-пакеты
${FwCMD} add 1700 divert 8672 ip from table\(5\) to not table\(9\) out via xl1
# в 8671 сворачиваеться весь траффик собственно к интернетам, в 1800 оное не попадает что логично
${FwCMD} add 1799 divert 8671 ip from table\(2\) to not table\(9\)
# если основной аплинк скончался просто убиваеться предыдущее правило и весь траффик из юзерской сети
# уходит в резервный канал (диверт 8672), также убиваеться форвард 1849 и обратный диверт 2099
${FwCMD} add 1800 divert 8672 ip from table\(2\) to not table\(9\) out via xl1
# прокидываем хост по которому от себя контролируем скриптом живость основного аплинка строго в него
${FwCMD} add 1847 fwd xxx.xxx.xxx.113 ip from me to 213.180.204.8
# далее идут форварды собственно куда надо
${FwCMD} add 1849 fwd xxx.xxx.xxx.113 ip from xxx.xxx.xxx.122 to not table\(9\)
${FwCMD} add 1850 fwd 192.168.3.1 ip from 192.168.3.5 to not table\(9\)
${FwCMD} add 1851 fwd 192.168.1.2 ip from 192.168.1.3 to not table\(9\)
# ... и обратные диверты
${FwCMD} add 2099 divert 8671 ip from any to xxx.xxx.xxx.122 in via xl0
${FwCMD} add 2100 divert 8672 ip from any to 192.168.3.5 in via xl1
..... вот здесь уже идут allow и шейпера к table(2) ......
${FwCMD} add 65533 deny all from table\(2\) to any
${FwCMD} add 65534 deny all from any to table\(2\)
${FwCMD} add 65535 allow all from any to any
Вопрос знатокам: что я делаю не так?
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-18 15:36:50
tmp
natd использовал как стартовый опыт, pfnat, ngnat, ipfw nat ^__^
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-18 15:54:27
schizoid
а чем именно natd так критичен? если ОС 7.х - можно попробовать nat , который в ядре уже...
переделывать особо ничего не нужно...теже таблицы, тот же аля диверт на нат...
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-18 15:56:46
neko
pf ng... так и не прочитали почему этого не будет даже в теории. Разве что на органы пол колектива продать чтобы это окупилось.
Нет не 7, переустановка продакшн серверов тоже не рассматриваеться как возможная. Вобще не вижу смысла в замене ната под небольшими нагрузками.
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-18 15:58:16
schizoid
ну у меня с натд тоже приколы, из-за долгой работы переполняется место в /var
почему - хз, приходится раз в неделю рестартовывать ночью.
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-18 16:00:43
neko
ну у меня с натд тоже приколы, из-за долгой работы переполняется место в /var
Вобще не вижу связи переполнения места в var и natd. Поубирать нафиг log со всех рулесов не пробывали?
ПС ах да еще ж вербоуз лимит

Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-18 16:07:15
schizoid
ну как бы траблу решал довольно таки долго. НАТ держит файл, который удален. его реально нет, а место занимает.
тут именно с НАТом дело
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-18 16:10:39
ProFTP
sysctl.conf ничего не ставил, скорее всего там рубит
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-18 16:14:07
schizoid
Код: Выделить всё
[root@stl /home/eugene]# ps -aux| grep natd
root 33470 2,8 0,9 5128 1152 ?? Ss пн04 154:27,61 /sbin/natd -f /etc/natd.conf -n vlan113
root 34870 0,0 0,7 1604 852 p1 S+ 16:11 0:00,01 grep --color natd
[root@stl /home/eugene]# lsof -p 33470
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
natd 33470 root cwd VDIR 0,74 512 2 /
natd 33470 root rtd VDIR 0,74 512 2 /
natd 33470 root txt VREG 0,74 23616 8317 /sbin/natd
natd 33470 root txt VREG 0,74 158712 8402 /libexec/ld-elf.so.1
natd 33470 root txt VREG 0,74 48260 16666 /lib/libalias.so.5
natd 33470 root txt VREG 0,74 922668 16691 /lib/libc.so.6
natd 33470 root 0u VCHR 0,10 0t0 10 /dev/null
natd 33470 root 1u VCHR 0,10 0t0 10 /dev/null
natd 33470 root 2u VCHR 0,10 0t0 10 /dev/null
natd 33470 root 3u IPv4 0xc1780e10 0t0 DIVERT *:8668
natd 33470 root 4w VREG 0,83 230272251 212194 /var (/dev/ad2s2)
natd 33470 root 5u rte 0xc21e7020 0t0
natd 33470 root 6u IPv4 0xc1782000 0t0 ICMP *:*
natd 33470 root 7u unix 0xc1a2e42c 0t0 ->0xc17476f4
[root@stl /home/eugene]# df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1a 248M 64M 164M 28% /
devfs 1.0K 1.0K 0B 100% /dev
/dev/ad2s2 2.0G 794M 1.0G 43% /var
/dev/ad0s1e 248M 3.5M 224M 2% /tmp
/dev/ad0s1f 15G 10G 3.1G 77% /usr
/dev/ad0s1g 57G 55G 983M 98% /work
/dev/ad2s1 47G 33G 13G 71% /work/public/music
/dev/ad2s4 17G 1.8G 15G 11% /work/public/trash
/dev/ad2s3 159G 82G 75G 52% /work/public/video
devfs 1.0K 1.0K 0B 100% /var/named/dev
[root@stl /home/eugene]# du -d 1 -h /var/
2,0K /var/.snap
2,0K /var/account
6,0K /var/at
2,0K /var/audit
18K /var/backups
4,0K /var/cache
4,0K /var/crash
6,0K /var/cron
272M /var/db
2,0K /var/empty
72K /var/ftp
2,0K /var/games
2,0K /var/heimdal
8,0K /var/lib
203M /var/log
4,0K /var/msgs
67K /var/named
6,0K /var/net-snmp
68K /var/netams
2,0K /var/preserve
104K /var/run
2,0K /var/rwho
412K /var/spool
8,4M /var/tmp
22K /var/yp
485M /var/
после рестарта ната, все становится на свои места
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-18 17:20:04
neko
#lsof | grep natd | grep var
#
даже не осмеливаюсь предположить какие же он у вас логи там пишет
А то что после перезапуска процесса освобождаеться место это понятно - банально поубивать кеш сквида, или логи апача - будет тот же еффект. Не пробывали вдуматься какой же он лог ведет и кому он нужен?
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-18 17:40:15
paradox
кто мешает для тестов прописать одну строку ната
и заюзать ipnat,pfnat
дабы понять где проблема
?
а потом уже думать
потому как
"рвет каждых 10-15-20 минут".
настораживает что это проблема где то вне сервера
кабель, провайдер итд
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-18 18:02:32
neko
кто мешает для тестов прописать одну строку ната
собственно подымается еще один нат на алиасе(вверху реализация), сворачиваеться туда единичного пользователя (допустим меня) и все летает отлично.
настораживает что это проблема где то вне сервера
физиологические проблемы и провайдер исключены так как если паралельно воткнуть еще один хост - на нем тоже работает все отлично, строим на этом хосте нат по аналогичному методу - ну как минимум для одного пользователя тобишь меня - все тоже отлично. Естественно это все на фоне стоящих рядышком двух хостов на которых методично обрываються сессии.
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-18 18:11:35
paradox
собственно подымается еще один нат на алиасе(вверху реализация), сворачиваеться туда единичного пользователя (допустим меня) и все летает отлично
предлагаю попробовать pfnat
с одним правилом
токо не на одного пользователя
а на всех
в конфигурации когда рветься tcp сессия у natd
и тогда станет ясно хотя бы куда копать
вариант
попробовать ядреный natd
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-18 18:19:42
neko
это вы серьезно про переход на pf?
я про те 4 мбит потока которые сейчас на втором хосте при активных на данный момент 6 пользователях + моем тестовом аккаунте?
Не могу ниразу назвать это пределом natd
# ps aux | grep natd
root 649 1.0 0.3 11636 11036 ?? Rs 31May09 380:42.16 /sbin/natd -u -p 8671 -a ххх.ххх.ххх.122
root 651 0.0 0.1 3556 2948 ?? Ss 31May09 3:59.51 /sbin/natd -u -p 8672 -a 192.168.3.5
root 653 0.0 0.0 1704 1092 ?? Ss 31May09 46:41.51 /sbin/natd -u -p 8673 -a 192.168.1.3
тем более учитывая ночной тест какраз на разгруженном хосте когда закачка шириной в 256к тянулась всего от одного пользователя.
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-18 18:32:57
paradox
я не говорил про пределы и про переход
я сказал что вам нужно локализовать проблему
поскоку вы щас даже приблизительно незнаете где проблема - так?
вот и поеспериментируйте
если будет глючить на всех pfnat и ipnat
тогда и будет смотреть дальше
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-18 18:52:54
neko
поскоку вы щас даже приблизительно незнаете где проблема - так?
в конкретном экземпляре natd, которым ломиться весь траффик, причем идентично на двух разных хостах с совершенно разной нагрузкой.
можно далеко не ходить - думаю образцово поднятый еще один natd ликвидирующий на себе проблему говорит что рыть следует таки в сторону natd а не сетевух (em/xl/fxp кстати всюду) итд.
Еще с более веселым выражением лица представил себе приостановку 2 продакшн серверов на период "пересобрать ядро/переписать 2 разных биллинга один из которых без сорцов и намертво прибит гвоздями к ipfw/поиграться (а вдруг получиться)" лично этого "попробовать просто так" я себе не представляю.
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-18 19:03:06
paradox
pf.ko и ipf.ko
в пересборки ядра не нуждаються
это к примеру
но насчет ядреного natd
это уж вам виднее
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-18 19:38:28
neko
ipfw add 1796 divert 8673 tcp from any to any dst-port 80
вот и чудо - качнул без обрывов и проблем изошку фри по хттп на скорости 20-25 мбит
Идей вообще никаких, канал тот же, юзера все теже, просто диверт соседний.
Хотя всеже есть идея относительно количества сессий, а как можно нежно ограничить их для table(2)?
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-18 19:48:14
armadex
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-18 20:04:31
neko
люблю повторяться:
вот так вот просто "взять и перейти" на pfnat как минимум на одном из хостов допустим попросту нету - себестоимость такого перехода и сложность реализации в силу наличия клозедсорцного биллинга для одного из сегментов сети будет мягко говоря очень неприятной.
я тоже могу взять и порекомендовать пятициферную циску и автономку /21 - в чем проблема?
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-18 20:35:25
paradox
локализуй проблему на своем сервере
а не повторяя такие же операции на других серверах
Re: ipfw + natd - обрывы tcp сессий, куда копать?
Добавлено: 2009-06-18 20:37:05
neko
Что значит на "своем"? Если имееться в виду тестовая машина повторяющая набор сервисов и конфигурацию продакшнов так - давно уже. Проблемы там нет так каковой думаю изза отсутствия живых пользователей за спиной.
Чем можно посмотреть общее количество активных tcp сессий висящих сквозь nat и количество активных/wait сессий от каждого пользователя в частности?