Операционные системы - статьи

Изменение нескольких правил одной командой


Иногда одна команда может воздействовать сразу на несколько правил. Это может происходить по двум причинам.

Во-первых, если вы указываете символический адрес машины, а его разрешение через DNS дает несколько различных IP-адресов, то ipchains будет действовать так, как если бы вы ввели несколько команд со всеми возможными сочетаниями IP-адресов. Например, если www.foo.com разрешается в 3 адреса, а www.bar.com - в 2 адреса, и вы ввели команду ipchains -A input -j reject -S www.bar.com -d www.foo.com

то ко входной цепочке добавится 6 правил.

Во-вторых, ipchains может выполнить несколько действий, если вы указали флаг '-b' (bidirectional). При этом ipchains будет действовать так, как если бы вы ввели команду дважды, во втором случае поменяв местами параметры '-s' и '-d'. Например, чтобы запретить пересылку пакетов от и к 192.168.1.1, можно воспользоваться командой: ipchains -b -A forward -j REJECT -s 192.168.1.1

Флаг '-b' может применяться в командах '-A', '-C', '-I', '-D' (кроме удаления по номеру правила).

Еще один полезный флаг - '-v' (verbose), который позволяет точно узнать, что сделала ваша команда. Он особенно полезен, если ваша команда может воздействовать сразу на несколько правил. Например, можно проверить, как работает пересылка фрагментов сразу в обе стороны между 192.168.1.1 и 192.168.1.2: ipchains -v -b -C input -p tcp -f -s 192.168.1.1 -d 192.168.1.2 -i lo

Пример настройки маскарадинга

ipchains -P forward DENY ipchains -A forward -s 192.168.1.0/24 -j MASQ echo 1 > /proc/sys/net/ipv4/ip_forward

Сначала отключается вся пересылка пакетов, потом включается маскарадинг в предположении, что в локальной сети используются адреса из пула 192.168.1.x.

Можно усложнить правила маскарадинга, указав адреса конкретных машин, для которых надо его осуществлять: ipchains -P forward DENY ipchains -A forward -s 192.168.1.2 -j MASQ ipchains -A forward -s 192.168.1.8 -j MASQ echo 1 > /proc/sys/net/ipv4/ip_forward

Остальные машины, кроме 192.168.1.2 и 192.168.1.8 доступа в интернет не получат.


Пример настройки фильтра пакетов

Предположим, что у вас есть PPP-соединение ('-i ppp0'). Вы читаете конференции (-p TCP -s news.virtual.net nntp) и почту (-p TCP -s mail.virtual.net pop-3). Иногда скачиваете по ftp свежее ядро для своего линукса (-p TCP -y -s ftp.kernel.org ftp-data). Бродите по www через прокси-сервер своего провайдера (-p TCP -d proxy.virtual.net 8080), но не любите рекламу с www1.reklama.ru и rb2.design.ru (-p TCP -y -d 195.46.160.46, -p TCP -y -d 212.24.32.76). Вы не возражаете против пользования ftp-сервером на вашей машине (-p TCP -d $LOCALIP ftp), но не хотите, чтобы кто-то снаружи делал вид, что он из вашей локальной сети (-s 192.168.1.0/24) - это называется IP-спуфинг (spoofing), и в ядрах 2.1.x и выше есть более правильные средства для защиты от него.

Итак:

Вы не хотите, чтобы ваши локальные процессы (в т.ч. Netscape) соединялись с www1.reklama.ru и rb2.design.ru: ipchains -A output -d 195.46.160.46 -j REJECT ipchains -A output -d 212.24.32.76 -j REJECT

Вы устанавливаете приоритеты для исходящих пакетов (для входящих этого делать нет смысла). Поскольку этих правил довольно много, можно выделить их в отдельную цепочку по имени ppp-out: ipchains -N ppp-out ipchains -A output -i ppp0 -j ppp-out

Минимальная задержка для www-трафика и telnet'а: ipchains -A ppp-out -p TCP -d proxy.virtual.net 8080 -t 0x01 0x10 ipchains -A ppp-out -p TCP -d 0.0.0.0/0 telnet -t 0x01 0x10

Низкая стоимость для данных ftp, nntp, pop3: ipchains -A ppp-out -p TCP -d 0.0.0.0/0 ftp-data -t 0x01 0x02 ipchains -A ppp-out -p TCP -d 0.0.0.0/0 nntp -t 0x01 0x02 ipchains -A ppp-out -p TCP -d 0.0.0.0/0 pop-3 -t 0x01 0x02

Существуют некоторые ограничения на пакеты, приходящие по интерфейсу ppp0, выделим их в отдельную цепочку по имени ppp-in: ipchains -N ppp-in ipchains -A input -i ppp0 -j ppp-in

Никакие пакеты, приходящие из ppp0 не должны притворяться, что они с адресов 192.168.1.*, т.е. из локальной сети. Если же таковые появятся, то их надо занести в журнал ('-l') и уничтожить: ipchains -A ppp-in -s 192.168.1.0/24 -l -j DENY



Разрешим UDP-пакеты для DNS (поскольку у вас работает кэширующий DNS-сервер, который пересылает все запросы на 203.29.16.1, то и ответов вы ожидаете только оттуда), а также входящие ftp-пакеты и ответные ftp-data (которые должны быть с портов выше 1023, но не с портов X11 в районе 6000): ipchains -A ppp-in -p UDP -s 203.29.16.1 -d $LOCALIP dns -j ACCEPT ipchains -A ppp-in -p TCP -s 0.0.0.0/0 ftp-data -d $LOCALIP 1024:5999 -j ACCEPT ipchains -A ppp-in -p TCP -s 0.0.0.0/0 ftp-data -d $LOCALIP 6010: -j ACCEPT ipchains -A ppp-in -p TCP -d $LOCALIP ftp -j ACCEPT

Ну и, наконец, все локальные пакеты на эту же машину вполне допустимы: ipchains -A input -i lo -j ACCEPT

Политика по умолчанию для входной цепочки - DENY, то есть все остальное уничтожается: ipchains -P input DENY

Примечание: правила не обязательно добавлять именно в таком порядке, поскольку пока вы их добавляете, некоторые нежелательные пакеты могут проскочить через фильтр. С точки зрения безопасности наиболее правильно сначала установить политику DENY для входной цепочки, а потом добавлять новые правила. Однако, если добавляемые правила потребуют разрешения символических имен с помощью DNS, у вас могут возникнуть неприятности. Я вас предупредил ;-).


Содержание раздела