ipfw2 + pfnat

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
freeman
лейтенант
Сообщения: 734
Зарегистрирован: 2007-03-18 5:13:25

Re: ipfw2 + pfnat

Непрочитанное сообщение freeman » 2008-10-27 10:26:34

Inzevision писал(а):хм... если прописать в ipfw

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

pass all from any to $ip
pass all from $ip to any
то всё работает, но вот у меня пользователи выпускались в инет по pipe или queue
теперь-то что делать? :(
Так у вас получается ipfw режет входящие при включенном pf(nat) ? Как насчёт того, чтобы включить логи и посмотеть почему ?
Ваш конфиг не анализировал, но как вариант используется check-state, а так как pf меняет пакеты, то или уходить от check-state в ipfw или переносить их (фильтрацию) в pf.
Остатся должен только один ...

Хостинговая компания 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/

Inzevision
мл. сержант
Сообщения: 102
Зарегистрирован: 2008-07-30 13:43:00
Откуда: Киев
Контактная информация:

Re: ipfw2 + pfnat

Непрочитанное сообщение Inzevision » 2008-10-31 23:53:26

Да, очень вероятно из-за check-state. В pf перенести не получится, там биллинг сам ставит правила в фаере в зависимости от параметров разрешения доступа.
Меня больше смущает даже не ipnat а странные вещи в выводе tcpdump.
IP 192.168.0.1 > 192.168.0.37: ICMP host 193.19.229.38 unreachable, length 36
и таких строчек очень мого со всех IP в сети.
Тюнинговал ipnat.
ipf_nattable_max поднял до 300000 но толку не дало. Пытался поднять значение ipf_nattable_sz -- но NAT скомпилирован с ядром и изменить его не получается, даже через sysctl.conf

PS. А можно фильтрующие и правила check-state внести в pf, а pipe и queue оставить в ipfw2 ? Тоесть выпускать в инет пользователя будет ipfw2 при попадании пакета на правило pipe или queue.

Аватара пользователя
freeGHost
проходил мимо
Сообщения: 1
Зарегистрирован: 2008-12-16 19:34:27

Re: ipfw2 + pfnat

Непрочитанное сообщение freeGHost » 2008-12-16 20:04:03

Inzevision писал(а):затеял я это всё по одной причине - у меня сейчас стоит ipnat - тоже хорошая штука. но последенее время начались чудеса в сети.
Сталкивался с подобной ситуацией, скорее всего, речь идет о том, что для ipnat превышено количество одновременно маскируемых соединений. Опишу, может кому пригодится.
По команде ipnat -s отслеживаем параметр inuse в момент загрузки.
Если держится на 30000, то речь идет о встроенных ограничениях ipnat. Для обхода ограничения идем в /src/sys/contrib/ipfilter/netinet и открываем файл ip_nat.h Заменяем:

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

#undef LARGE_NAT
на
#define LARGE_NAT
Таким образом мы повышаем лимит на количество соединений до 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 на наличие строки вида:

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

kernel: ipf_nattable_max reduced to
Это означает, что превышен лимит 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; 
        }
Но это, скорее всего, будет приводить к панике ядра. :roll:

А вообще, использовать ipnat совместно с ipfw не совсем правильно, например, могут возникнуть проблемы с реализацией PBR.