Безопасное редактирование правил ipfw FreeBSD


Для безопасного редактирование правил ipfw рекомендую обратить внимание на скрипт change_rules.sh, находящийся в /usr/share/examples/ipfw. В случае неправильных действий он вернёт старый набор правил, а также сообщит администратору об изменениях в файрволе по почте.

FreeBSD 5.3 ipfw правило по умолчанию

В прежних версиях 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.

Если сборка производится удаленно - сюрприз может оказаться довольно неприятны

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Как с помощью ipfw отрезать баннеры в ICQ

Мысль простая:

Аська сообщениями по 5190 и другим портам обменивается, а баннеры только с определенных

IP с 80го порта качает по HTTP ... Когда я на это наткнулся, написал скрипт такого содержания:

#!/bin/sh

# add this rule to your firewall and :

# ipfw deny tcp from 192.168.0.0/16 to table(1) out via rl0 setup dst-port 80

NETS=" 64.12.164 64.12.174 152.163.208 205.188.165 205.188.248 205.188.250 "

IPS=" 25 57 121 153 185 245 "

fwcmd=" ipfw "

tablenum=" 1 "

#Flushing table

${fwcmd} table ${tablenum} flush

#Add tables ips

for D1 in ${NETS}

do

for D2 in ${IPS}

do

${fwcmd} table ${tablenum} add ${D1}.${D2}

done

done

И в firewall воткнул правило вида

ipfw deny tcp from any to table(1) out via rl0 setup dst-port 80

Где rl0 - внешний интерфейс.

Правильнее, конечно настроить squid и резать банеры на нем - но так проще и быстрее. К тому же заметно меньше грузит машину.

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Как разделить канал между пользователями используя ipfw. (1)

/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"

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Как разрешить или запретить выполнение следующих 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 внешний_интерфейс

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Как в 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 перед общим правилом трансляции, порядок следования правил важен.

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Автоматическая нумерация правил 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

Для ведения логов ядро должно быть собрано с IPFIREWALL_VERBOSE или нужно выставить "sysctl -w net.inet.ip.fw.verbose=1".

Далее проверить чтобы в /etc/syslog.conf было упоминание LOG_SECURITY:

security.* /var/log/security

Через параметр logamount передается число записей которые будет записано в лог, после превышения записи перестанут появляться в логе, до тех пор пока не будет вызвана команда "ipfw resetlog". Максимальное число сообщений можно также установить

через sysctl net.inet.ip.fw.verbose_limit.

Для отмены лимитирования на число записей, нужно установить атрибут в 0.

Обновлено: 12.03.2015