Решил немного отвлечься от всех дел и написать что-то полезное для новичков связавшихся с ipfw.

Из своей практики знаю как новички обходят стороной ipfw и другие firewalls. Но не стоит их боятся, ведь они предназначены для помощи админам, а не на вред им же :).. Хотя, не исключается момент, когда не подумав о последствиях — админ запускает правила только что написанного firewallа и попадает в просак. Особенно это касается, когда речь идет об удаленном сервере. После чего админу приходится собираться в путь дорожку к этому самому серваку :(. Было и у меня такое пару раз, когда я забыл в ipfw открыть 22 порт, перед дропанием всего лишнего. Или например, когда неграмотно прописал правила перед divert (NAT) и так же потеряв к нему доступ. Но это было в начале моей практики данного пункта изучения. Поэтому я и решил написать эту статью, что бы прочитавшие — меньше наступали на грабли.

Итак, что я могу порекомендовать для начинающих настраивать ipfw. Помимо практических примеров, которые я описывал ранее, я привожу структуру, которой сам придерживаюсь при создании нового firewall.

Первая заметка.
При создании правил, старайтесь использовать шаг хотя бы в 10 правил, для того что бы в случае чего — добавить еще в средину новые правила:

   ipfw add <b>10</b> ....
   ipfw add <b>20</b> ....
   ipfw add <b>30</b> ....

Вторая заметка.
По возможности используйте таблицы (если у вас много хостов) — это позволит немного разгрузить ваши глаза при создании правил, и гибкость при добавлении новых подсетей или хостов:

   ipfw table 1 add 192.168.1.11 
   ipfw table 1 add 192.168.1.12
   ipfw table 1 add 10.16.0.0/24

Так же можно, маркировать добавляемые подсети. (Это может быть полезным для задавания ограничений с помощью, pipe или queue), например:

   ipfw pipe 1 config bw 1Mbit/s 
   ipfw pipe 2 config bw 2Mbit/s 
 
   ipfw table 1 add 10.18.2.15   1
   ipfw table 1 add 10.18.2.16   1
   ipfw table 1 add 10.18.2.17   2
   ipfw table 1 add 10.18.4.0/24 2
 
   ipfw add pipe tablearg ip from any to "table(1)"
   ipfw add allow ip from "table(1)" to any

Третья заметка.
Постарайтесь что бы последним (65535), ну или предпоследним (65534) правилом вашего ipfw, была такая строчка:

   ipfw add 65534 deny log ip from any to any

В этом пункте, есть подводные камни.
Считается что хороший фаервол — этот тот firewall, который по умолчанию — закрыт, то есть при компиляции ядра — не добавлять правило открывающее фаервол по умолчанию. Но вот как раз в этом то и вся соль — при сбрасывании всех правил командой

  ipfw -q flush

при закрытом фаерволе, вы потеряете к нему доступ (поэтому, если у вас нет под руками ip kvm подключенного к вашему серверу — то лучше так не делать, а скомпилить его открытым и добавить правило руководствуясь этим пунктом.

Четвертая заметка.
Перед закрытием правил, обязательно открыть 22 порт, для того что бы не потерять доступ по ssh (если вы настраиваете фаервол через него):

  ipfw add 100 allow ip from any to me 22
  ipfw add 100 allow ip from me 22 to any

Пятая заметка.
Как видно в предыдущем примере, старайтесь использовать одноименные правила под одним номером — это позволит проще убирать и добавлять их. То есть, например у вас в кроне стоит какой нибудь скрипт, убирающий и добавляющий правило с номером 500. Или же вы сами будете при каких либо настройках добавлять или удалять некоторые правила. Для того что бы было меньше телодвижений — это ускорят работу:

Сделать.

  ipfw delete 500

Всегда быстрее, чем

  ipfw delete 500
  ipfw delete 501
  ipfw delete 502

И так далее.

Также, если у вас есть несколько каналов или поставлена сложная задача при создании правил с большим количеством хостов или подсетей, а также где есть повторение одних и тех же правил (например, до nat и после) — используйте правило skipto

Очень полезна эта функция, в случае использования 2 каналов со статическими шлюзами:

   if1="rl0"
   if2="rl1"
   if3="rl2"
   gw1="шлюз 1"
   gw2="шлюз 2"
 
   ipfw add 10 skipto 30 tag 1 in recv $if1 keep-state #(маркируем пакеты вошедшие через карточку 1)
   ipfw add 20 skipto 30 tag 2 in recv $if2 keep-state #(маркируем пакеты вошедшие через карточку 2)
   ipfw add 30 allow { recv $if1 or recv $if2 } #(разрешаем все пакеты входящие снаружи на обоих карточках)
   ipfw add 40 allow in recv $if3 #(разрешаем ответы на внутренней карточке)
   ipfw add 50 fwd $gw1 tagged 1 #(Отправляем пакеты по маркированные тегом 1 на первый шлюз)
   ipfw add 60 fwd $gw2 tagged 2 #(Отправляем остальные пакеты, которые с тегом 2 на второй шлюз)

Это типичный пример для динамического правила в фаерволе.

Ну и наконец-то я подошел к самому главному. Структура и порядок рекомендуемых правил при создании фаервола.

1. Инструкции deny и reject (если нужно), чтобы убить ненужный трафик. Всем известный пример:

  ipfw add 1 deny all from table(1) to any

Он добавлен при настройке sshit;
2. Дальше идут правила count для полезного трафика на внешнем интерфейсе. (Также — если нужна полная статистика, то пишем правила count до 1го пункта);
3. Далее идут правила forward и skipto, prob, keep-state если нужно;
4. Следом идут правила allow(pass) на ваши сервисы, доступные из вне вашей сети;
5. После, идут правила divert (NAT);
6. Снова идут правила подсчета count, но уже для внутренней сети (это если важна статистика);
7. Теперь все правила allow,pipe,queue на внутренние подсети, или хосты;
8. Следом, allow для разрешенных соединений с роутера, а также уже соединенных (established)
9. Ну и на последок, о чём я уже говорил — запрещаяем всё остальное, складывая в логи то что режется log deny any to any. В логи пишем обязательно — это поможет при настройке.

Просмотреть то что лежит в логах можно командой:

   tail /var/log/security

В принципе, это не обязательное указание, а все го лишь рекомендации которые пришли сами собой за большое количество лет моей практики в этой сфере.

Напоминаю всем копирующим мой контент о существовании закона "Об авторском праве".
В связи с этим, прошу во избежании конфликтов при копировании данного материала, ставить на него ссылку:

http://noted.org.ua/?p=2387


Также, вы можете отблагодарить меня переслав любую сумму на любой кошелек WebMoney, для поддержания данного ресурса. Или просто админу на пиво ;)

Кошельки для получения благодарности:
R386985788805
U234140473141
Z147712360455

На данной странице нет комментариев, возможно они закрыты. Если Вы хотите оставить свой комментарий, перейдите на специально созданный раздел

Add your comment now

You must be logged in to post a comment.