Inzevision писал(а):затеял я это всё по одной причине - у меня сейчас стоит ipnat - тоже хорошая штука. но последенее время начались чудеса в сети.
Сталкивался с подобной ситуацией, скорее всего, речь идет о том, что для ipnat превышено количество одновременно маскируемых соединений. Опишу, может кому пригодится.
По команде ipnat -s отслеживаем параметр
inuse в момент загрузки.
Если держится на 30000, то речь идет о встроенных ограничениях ipnat. Для обхода ограничения идем в /src/sys/contrib/ipfilter/netinet и открываем файл ip_nat.h Заменяем:
Таким образом мы повышаем лимит на количество соединений до 180000 (параметр NAT_TABLE_MAX чуть ниже по коду). Пересобираем ядро и перезагружаемся.
Можно проэкспериментировать и без пересборки, для этого выполняем следующее:
Код: Выделить всё
ipf -D
sysctl net.inet.ipf.ipf_nattable_sz=180000
ipf -T ipf_nattable_max=180000
ipf -E
/sbin/ipnat -CF -f /etc/ipnat.rules
Если же ограничение уже снято, а проблема остается и растет значение
no memory, стоит посмотреть /var/log/messages на наличие строки вида:
Это означает, что превышен лимит kmem, и максимальное количество сессий сбрасывается до значения inuse (используется в данный момент)-100, о чем выдается сообщение ядра.
Лечится остановкой ipf и изменением параметров, как это показано выше. Ну, еще в ip_nat.c можно убить кусок кода:
Код: Выделить всё
/* Give me a new nat */
KMALLOC(nat, nat_t *);
if (nat == NULL) {
nat_stats.ns_memfail++;
/*
* Try to automatically tune the max # of entries in the
* table allowed to be less than what will cause kmem_alloc()
* to fail and try to eliminate panics due to out of memory
* conditions arising.
*/
if (ipf_nattable_max > ipf_nattable_sz) {
ipf_nattable_max = nat_stats.ns_inuse - 100;
printf("ipf_nattable_max reduced to %d\n",
ipf_nattable_max);
}
return NULL;
}
Но это, скорее всего, будет приводить к панике ядра.
А вообще, использовать ipnat совместно с ipfw не совсем правильно, например, могут возникнуть проблемы с реализацией PBR.