The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Пакетный фильтр в FreeBSD: ipfw, IP-Filter

   Корень / Администратору / Сетевая подсистема, маршрутизация / Пакетные фильтры и фаерволы / Пакетный фильтр в FreeBSD: ipfw, IP-Filter

----* Маршрутизатор на базе FreeBSD с приоритизация трафика средствами PF и ALTQ   Автор: artemrts  [комментарии]
  Проблема приоритизации трафика, на мой взгляд, весьма актуальна. Интернет-канала много не бывает и на всех пользователей и сервисов локальной зачастую не хватает. Поэтому для нормальной работы Интернета требуется грамотное распределения полосы с учетом потребностей каждого из участников. Единственный раз, когда мне не понадобился QoS - это гарантированный провайдером канал в 20 Мбит/с в мир и 100Мбит/с - национальный. Но такое удовольствие не из дешевых, поэтому зачастую народ довольствуется ADSL-каналом с заявленной скоростью к клиенту до 5-10 Мбит/с.
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Блокирование Skype по IP-адресам во FreeBSD   Автор: Тикунов Максим  [комментарии]
  Раздумывая на досуге о наболевшем вопросе как заблокировать Skype, пришла идея, может она здесь уже описывалась, но всё таки решил поделиться личным опытом, может кому и пригодится.
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Проброс IPTV-трафика в локальную сеть при помощи OpenBSD и пакетного фильтра PF (доп. ссылка 1)   [комментарии]
  Возникла необходимость обеспечения возможности просмотра IPTV сразу на нескольких устройствах в домашней сети. Реализации данной схемы мешало то, что полученный от провайдера модем имел два раздельных порта для данных и для IPTV. Простейшим решением было бы закорачивание IPTV-порта в домашний коммутатор, но такая схема нарушает принципы построения безопасных систем и сулит появление паразитного трафика. В связи с этим было решено организовать перенаправление IPTV-трафика через локальный шлюз, на котором используется пакетный фильтр PF и IGMP-прокси.
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Трансляция PPTP (GRE) на шлюзе с PF (доп. ссылка 1)   Автор: Князь  [комментарии]
  Как известно, межсетевой экран PF, портированный в FreeBSD из OpenBSD, не может корректно транслировать (NAT) GRE-протокол и, к примеру, из локальной сети невозможно создать несколько одновременных соединений к внешнему серверу VPN PPTP.
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Распределение трафика между двумя каналами во FreeBSD (доп. ссылка 1)   Автор: pehlle  [комментарии]
  Во FreeBSD 7 появилась возможность задания множественных таблиц маршрутизаций. В ядре отвечает за это опция:
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Борьба с перебором паролей на FTP сервере при помощи пакетного фильтра PF (доп. ссылка 1)   [комментарии]
  Для предотвращения bruteforce-атак по подбору паролей во FreeBSD или OpenBSD можно использовать возможность пакетного фильтра PF по лимитированию числа соединений за единицу времени в сочетании с блокировкой по таблицам.
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Проброс сети во FreeBSD Jail через NAT и PF (доп. ссылка 1)   [комментарии]
 
Сервер работает под управлением FreeBSD 7 и имеет два сетевых интерфейса: 
один для интранет сети, другой для связи с внешними миром.

Задача: обеспечить доступность изолированного Jail для обоих сетей, несмотря на ограничение jail 
по поддержке только одного интерфейса и одного IP.

Решение: через NAT организовать отправку всех запросов к адресам интранет сети 10.0.0.0/8.

В /etc/pf.conf на сервере прописываем:

   an_if="em0" # интерфейс интранет подсети
   lan_if_subnet="10.0.0.0/8"
   lan_if_ip="10.28.11.10" # IP на интранет интерфейсе em0
   jail_vps_server_ip="202.54.2.3" # Реальный IP, выделенный для Jail
   nat on $lan_if inet proto { tcp, udp, icmp } from $jail_vps_server_ip to $lan_if_subnet -> $lan_if_ip

Перезапускаем PF через /etc/rc.d/pf reload
 
----* Трансляция адресов во FreeBSD средствами ng_nat (доп. ссылка 1)   Автор: Folio  [комментарии]
  Для работы этого примера необходимо иметь подгруженный ng_ipfw.ko
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Интернет-шлюз с использованием PF   Автор: vitalic  [комментарии]
  O пакетном фильтре (PF) написано довольно много статей. Вот и я хочу предложить свою реализацию Интернет-шлюза с использованием PF. Раздача Интернета для локальной сети происходит через NAT и основана на Packet Tagging. Плюсом этого метода является то что упрощается настройка правил для FTP (ftp-proxy не используется), как для клиентов за шлюзом, так и для возможной публикации "внутреннего" ftp-сервера в мир.
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Экспорт Netflow средствами netgraph во FreeBSD   Автор: VS  [комментарии]
  При сборке ядра указываем:
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Как сделать отказоустойчивый брандмауэр с распределением нагрузки на FreeBSD (доп. ссылка 1)   Автор: Сгибнев Михаил  [комментарии]
  Задача:
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Использование таблиц для блокирования большого числа IP в pf или ipfw (доп. ссылка 1)   [комментарии]
  Список IP адресов или подсетей находится в файле /etc/block1.txt Например:
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* ipfw nat во FreeBSD 7   Автор: Pikador  [комментарии]
  В конфигурацию ядра добавляем:
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Автоматическая синхронизация таблиц ipfw   Автор: freeseacher  [комментарии]
  Вот таким скриптом можно периодически синхронизировать на всех сереверах таблицы ipfw
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Пример использования таблиц блокировки в ipfw   [комментарии]
 
Блокировка производится командой:

   ipfw add deny ip from "table(1)" to any via em0 

/etc/load_table.sh:

   #!/bin/sh
   ipfw table 1 flush
   cat /etc/block.txt | while read cnt ip; do
       ipfw table 1 add $ip
   done 

формат /etc/block.txt: "cnt ip"
получем, например, из tcpdump лога атаки:

   tcpdump -n -i em0 udp and port 80 > ./tcpdump.log
   cat ./tcpdump.log |cut -d' ' -f3|cut -d'.' -f1,2,3,4|sort|uniq -c |sort -r -n > /etc/block.txt
 
----* Пример структурирования правил ipfw (доп. ссылка 1)   Автор: Vadim Guchenko  [комментарии]
  Пример структурирования правил фильтра пакетов ipfw во FreeBSD с целью упрощения их восприятия и уменьшения вероятности допущения ошибок.
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Порядок прохождения пакетов в пакетных фильтрах FreeBSD (доп. ссылка 1)   Автор: butcher  [комментарии]
 
Порядок прохождения пакетов при одновременном использовании  ipfilter, pf и ipfw:
При загрузке фильтров модулями, порядок будет определяться порядком загрузки модулей. 
Причина здесь в том, что пакетные фильтры регистрируют себя в pfil(9).

При включении всех фильтров в ядро порядок будет определять SYSINIT.
Чтобы определить порядок, нужно открыть файл sys/kernel.h. 
В нём определён порядок инициализации определённых подсистем. Теперь, простейшее:

# grep DECLARE_MODULE netinet/ip_fw_pfil.c
DECLARE_MODULE(ipfw, ipfwmod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY);
# grep DECLARE_MODULE contrib/pf/net/pf_ioctl.c
DECLARE_MODULE(pf, pf_mod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_FIRST);
# grep DECLARE_MODULE contrib/ipfilter/netinet/mlfk_ipl.c
DECLARE_MODULE(ipfilter, ipfiltermod, SI_SUB_PROTO_DOMAIN, SI_ORDER_ANY);

От сюда следует: первым будет ipfilter, затем pf, затем ipfw.
 
----* Автоблокирование атак по подбору паролей (brute force) в SSH под FreeBSD (доп. ссылка 1)   Автор: Roman Y. Bogdanov  [комментарии]
  Устанавливаем sshguard из портов:
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Расчет размера очереди для pipe с заданной пропускной способностью (доп. ссылка 1)   [комментарии]
  > Работает шейпер на dummynet, наблюдается некотороая потеря > траффика. Hавскидку проблема в дефолтных значениях размера очереди (50 пакетов) > для pipe'ов от 32 до 512 Кбит\с. Скорее всего, поток не влезает в очередь и > часть пакетов отбрасывается. Как правильно рассчитать размер очереди для > каждого pipe в отдельности?
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Как увеличить размер таблицы состояний активных соединений в pf (доп. ссылка 1)   [обсудить]
 
Проверяем число соединений в таблице и сравнимаем с текущим лимитом:

# pfctl -s state | wc -l
10000
# pfctl -s memory | grep states
states        hard limit    10000

Таблица переполнена, поднимает лимит до 20000:
   set limit states 20000

Перечитываем конфигурацию pf:
   pfctl -O -f /etc/pf.conf
 
----* Прозрачный переброс SMTP трафика к spamd, используя pf (доп. ссылка 1)   Автор: undeadly.org  [комментарии]
  Ниже описано как в разрыв между внешним миром и локальной сетью поставить машину на базе OpenBSD, на которой будет в прозрачном режиме отсеиваться спам через spamd.
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Как избавится от роста висящих FIN_WAIT_2 соединений под FreeBSD   [комментарии]
 
Если используется ipfw2 и keep-state правила, то от непрерывного роста 
соединений со статусом FIN_WAIT_2 помогает:
   sysctl -w net.inet.ip.fw.dyn_keepalive=0
 
----* Как вести лог блокировок в iptables и ipfw   [комментарии]
  Linux:
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Безопасное редактирование правил ipfw FreeBSD   Автор: 135all  [обсудить]
 
Для безопасного редактирование правил ipfw рекомендую обратить внимание на скрипт change_rules.sh, 
находящийся в /usr/share/examples/ipfw. В случае неправильных действий он
вернёт старый набор правил,
а также сообщит  администратору об изменениях в файрволе по почте.
 
----* В двух словах про включение NAT и Firewall в ОС FreeBSD (доп. ссылка 1)   Автор: hub.ru  [комментарии]
  Что бы поднять NAT и Firewall на FreeBSD надо:
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* pf и трансляция адресов на двух интерфейсах   Автор: DelGod  [комментарии]
  Решение оптимизировано для шлюза на флешке (не используется perl и другие "тяжелые" решения)
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* FreeBSD 5.3 ipfw правило по умолчанию   Автор: else  [комментарии]
 
В прежних версиях FreeBSD изменить правило по умолчанию 
   65535  deny ip from any to any на 
   allow ip from any to any 
можно было включением в ядро опции
   IPFIREWALL_DEFAULT_TO_ACCEPT.

В версии 5.3 это не работает. Даже собрав ядро с этой опцией, получаем правило по умолчанию 
   deny ip from any to any. 

Если сборка производится удаленно - сюрприз может оказаться довольно неприятным.
 
----* Проброс портов с двух различных gateway на внутренний сервер через IPNAT   Автор: Жека  [комментарии]
 
Иногда необходимо пробросить порты с двух различных gateway GW1 и GW2 на один внутренний сервер, 
у которого в качестве default GW указан GW1.
Прямой проброс и NAT невозможен, т.к. пакеты пришедшие из GW2 попытаются
вернуться по маршруту через GW1.
Есть следующий выход, это двойной NAT на GW2, при котором запрос приходит не
снаружи, а с внутреннего IP.

ed0 - внешний интерфейс
lnc0 - интерфейс смотрящий внутрь.

в ipnat.rules нужно прописать следующее:
   map ed0 10.6.10.0/24 -> 0.0.0.0/32 мапим локалку наружу
   map lnc0 0.0.0.0/0 -> 0.0.0.0/32 ремап внешних ip в локальные
   rdr ed0 0.0.0.0/0 port 80 -> 10.6.10.2 port 80 tcp форвард на внутренний сервер
 
----* Как с помощью ipfw отрезать баннеры в ICQ   Автор: orm_vartis  [комментарии]
  Мысль простая: Аська сообщениями по 5190 и другим портам обменивается, а баннеры только с определенных IP с 80го порта качает по HTTP ... Когда я на это наткнулся, написал скрипт такого содержания:
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Как разделить канал между пользователями используя ipfw. (доп. ссылка 1)   Автор: mgear  [обсудить]
 
   /sbin/ipfw pipe 1 config bw 7000Kbit/s
   /sbin/ipfw queue 1 config pipe 1 weight 75 mask dst-ip 0x00000000
   /sbin/ipfw queue 2 config pipe 1 weight 50 mask dst-ip 0x00000000
   /sbin/ipfw queue 3 config pipe 1 weight 50 mask dst-ip 0x00000000
   /sbin/ipfw queue 4 config pipe 1 weight 50 mask dst-ip 0x00000000
   /sbin/ipfw add queue 1 ip from any to 192.168.0.0/24
   /sbin/ipfw add queue 2 ip from any to 192.168.1.0/24
   /sbin/ipfw add queue 3 ip from any to 192.168.2.0/24
   /sbin/ipfw add queue 4 ip from any to 192.168.3.0/24

Итого имеем: одну толстую трубу на 7К и 4 очереди в нее. 
У первой приоритет 75% канала. У остальных - по 50% 
 
----* Установка IPFW2 на FreeBSD   Автор: Tigran Parsadanian  [комментарии]
 
Собираем библиотеки и сам IPFW:
   cd /usr/src/lib/libalias
   make -DIPFW2 && make install
   cd /usr/src/sbin/ipfw
   make -DIPFW2 && make install
Пересобираем ядро с "options IPFW2" и опциями по вкусу:
options         IPFIREWALL              #firewall
options         IPFIREWALL_VERBOSE      #enable logging to syslogd(8)
options         IPFIREWALL_FORWARD      #enable transparent proxy support
options         IPFIREWALL_VERBOSE_LIMIT=100    #limit verbosity
options         IPFIREWALL_DEFAULT_TO_ACCEPT    #allow everything by default
options         DUMMYNET
options         IPFW2
Делаем reboot и проверяем например командой "ipfw show"
 
----* Как в FreeBSD перебросить соединение через NAT во внутреннюю сеть  (доп. ссылка 1)   Автор: spanka  [комментарии]
 
 Вот реализация для ipfw:
if1IP="ип_смотрящий_в_инет", if1="интерфейс_смотрящий_в_инет"
ifLIP="ип_на_который хотим делать редирект"
  ipfw add divert natd tcp from any to ${if1IP} 80 via ${if1}
  ipfw add divert natd ip from any to ${ifLIP} to any via ${if1}
  ipfw add allow tcp from any to ${if1IP} 80 via any
  natd -n ${if1} -redirect_port tcp ${ifLIP}:80 80

Решение от miaso <torov@wipline.ru>:
  tproxy -s 80 -r nobody -l /var/log/transparent_proxy.log [int_ip] 80 
 
----* Как разрешить или запретить выполнение следующих ipfw правил после встречи dummynet pipe   [комментарии]
 
Завершить выполнение цепочки ipfw правил после попадания в pipe:
   sysctl -w net.inet.ip.fw.one_pass=1                                             
Продолжить выполнение следующих ipfw правил после попадания в pipe:
   sysctl -w net.inet.ip.fw.one_pass=0
 
----* Как правильно зафильтровать ICMP через FreeBSD ipfw (доп. ссылка 1)   Автор: Nikola_SPb  [комментарии]
 
Расшифровка кодов ICMP сообщений:
echo reply (0), destination unreachable (3), source quench (4), redirect (5),
echo request (8), router adver-tisement (9),
router solicitation(10), time-to-live exceeded (11), IP header bad (12),
timestamp request (13), timestamp reply (14),
information request (15), information reply (16), address mask request (17) and
address mask reply (18).
${fwcmd} add 00300 allow icmp from any to внешний_IP in via внешний_интерфейс icmptype 0,3,4,11,12
${fwcmd} add 00301 allow icmp from внешний_IP to any out via внешний_интерфейс icmptype 3,8,12
${fwcmd} add 00304 allow icmp from внешний_IP to any out via внешний_интерфейс frag
${fwcmd} add 00305 deny log icmp from any to any in via внешний_интерфейс
 
----* Как организовать редирект порта на внутреннюю машину через ipnat в FreeBSD.   [комментарии]
 
man 5 ipnat  в /etc/ipnat.conf:
  rdr fxp0 205.15.63.3/32 port 80 -> 192.168.1.1 port 80 tcp
# Базансировка нагрузки между 2 IP:
  rdr le0 203.1.2.3/32 port 80 -> 203.1.2.3,203.1.2.4 port 80 tcp round-robin
 
----* Как у ipfilter обнулить статистику без перезагрузки ?   [обсудить]
 
  ipf -z -f my_ipfilter_rules_file
 
----* Как в ipfw если выполнилось условие, пропустить следующие N правил.   [обсудить]
 
ipfw add 50 skipto 100 tcp from any to 1.2.3.4
ipfw add 60 .....
ipfw add 100 .....
 
----* Пример ограничения полосы пропускания трафика в FreeBSD   [комментарии]
 
Собираем ядро с опциями:
   options         DUMMYNET
   options         IPFIREWALL
Ограничиваем трафик для сеток 1.1.1.0/24 и 3.3.3.0/24 на 14000 кбит/с:
   ipfw add pipe 50 tcp from any to 1.1.1.0/24 via fxp0
   ipfw add pipe 50 tcp from any to 3.3.3.0/24 via fxp0
   ipfw pipe 50 config bw 14Kbit/s
Для внесения задержки на N ms, используйте delay N после config.
Для установки веса данного пайпа по отношению к другим пайпам используйте weight вес.
Для WF2Q ограничения трафика используйте ipfw queue
(queue N config [pipe pipe_nr] [weight weight] [queue {slots | size})
PS (комментарий от gara@mail.ru):
 Если возникает необходимость организовать "канал" для каждого пользователя из данной сети то пишем:
ipfw pipe 10 config mask dst-ip 0x000000ff bw 1024bit/s  queue
ipfw add pipe 10 tcp from any to 1.1.1.0/24 via fxp0
Теперь каждый хост из сети 1.1.1.0/24 имеет свой канал 1024bit/s
 
----* Можно ли отфильтровывать пакеты (вести лог) в зависимости от UID пользователя ?   [обсудить]
 
Для FreeBSD:
ipfw add count tcp from any to not 192.168.1.0/24 uid 231
uid user (или gid group) - под правило попадают все TCP или UDP пакеты посланный 
или принятые пользователем user (группой group).
В Linux в ядрах 2.4.x в iptables можно использовать модуль owner.
 
----* Как запретить открывать более 30 соединений с одного IP   [комментарии]
 
Запретим более 30 коннектов для 80 порта сервера 1.2.3.4.
    ipfw add allow tcp from any to 1.2.3.4 80 limit src-addr 30
    ipfw add allow tcp from any to 1.2.3.4 80 via fxp0 setup limit src-addr 10
Вместо src-addr можно использовать src-port, dst-addr, dst-port
Конструкция работает в последних версиях FreeBSD 4.x ветки.
 
----* Как обеспечить работу active FTP режима в FreeBSD NAT   [обсудить]
 
В ipnat воспользуйтесь модулем ftp proxy:
  map fxp0 0/0 -> 0/32 proxy port ftp ftp/tcp
  map rl0 172.16.33.0/24 -> 212.46.231.50/32 proxy port ftp ftp/tcp
не забудьте поместить правило трансляции ftp перед общим правилом трансляции, 
порядок следования правил важен.
 
----* Как запустить трансляцию адресов (NAT) под FreeBSD   [комментарии]
  В /etc/rc.conf:
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Как организовать Policy Routing на FreeBSD   [комментарии]
 
ipfw add 100 fwd 10.0.0.2 ip from 10.0.2.0/24 to any 

Если нужно использовать 2 шлюза, то можно воспользоваться:
  ipfw add  fwd $ext_gw_ip ip from $ext_net to any out xmit $ext_int
 
----* Автоматическая нумерация правил ipfw в FreeBSD (доп. ссылка 1)   Автор: Дмитрий Новиков  [комментарии]
 
Для автоматической нумерации правил ipfw мы применяем следующий             
 несложный прием:
C=300 # начальное значение
STEP=100 # Шаг увеличения
ipfw add $C $(C=$(($C+$STEP))) allow ip from 10.128.0.0/16 to 10.128.0.0/16
ipfw add $C $(C=$(($C+$STEP))) allow ip from 195.131.31.0/24 to 195.131.31.0/24
 

 Версия для печати





Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру