Next Previous Contents

7. Серьезный пример.

Это пример от Michael Neuling и моего LinuxWorld Tutorial за Март 1999; это не единственый способ решить данную проблему, но вероятно самый простой. Я надеюсь, что вы найдете его информативным.

7.1 Соглашения

          Внешняя сеть (BAD)
                  |
                  |
              ppp0|
           ---------------
           | 192.84.219.1|             Сервера сети (DMZ)
           |             |eth0
           |             |----------------------------------------------
           |             |192.84.219.250 |             |              |
           |             |               |             |              |
           |192.168.1.250|               |             |              |
           ---------------          --------       -------        -------
                  | eth1            | SMTP |       | DNS |        | WWW |
                  |                 --------       -------        -------
                  |              192.84.219.128  192.84.219.129  192.84.218.130
                  |
          Внутренняя сеть (GOOD)

7.2 Цели

7.3 Перед фильтрацией пакетов

7.4 Фильтрация проходящих пакетов

При маскарадинге самое лучшее -- фильтр в цепочке forward.

Разбейте цепочку forward на несколько пользовательских цепочек в зависимости от интерфейсов источника/приемника; проблема разделяется на более простые в управлении части.

       ipchains -N good-dmz 
       ipchains -N bad-dmz 
       ipchains -N good-bad 
       ipchains -N dmz-good 
       ipchains -N dmz-bad 
       ipchains -N bad-good
ACCEPT'ие стандартных ICMP сообщений об ошибках -- достаточно общая вещь, поэтому создадим для нее цепочку.
       ipchains -N icmp-acc

Установка переходов из цепочки forward

К сожалению, мы знаем (в цепочке forward) только исходящий интерфейс. Таким образом, чтобы выяснить с какого интерфейса пришел пакет, мы используем адрес источника (подделку этого адреса предотвращает антиспуфинг).

Обратите внимание, что в журнал регистрации пойдет все, что не подпадает ни под одно из этих правил (очевидно, что такого никогда не случится).

     ipchains -A forward -s 192.168.1.0/24 -i eth0 -j good-dmz 
     ipchains -A forward -s 192.168.1.0/24 -i ppp0 -j good-bad 
     ipchains -A forward -s 192.84.219.0/24 -i ppp0 -j dmz-bad 
     ipchains -A forward -s 192.84.219.0/24 -i eth1 -j dmz-good 
     ipchains -A forward -i eth0 -j bad-dmz 
     ipchains -A forward -i eth1 -j bad-good 
     ipchains -A forward -j DENY -l

Определим icmp-acc цепочку

Пакеты, которые являются одним из ICMP сообщений об ошибке ACCEPT'ся, иначе управление перейдет обратно к вызывающей цепочке.

     ipchains -A icmp-acc -p icmp --icmp-type destination-unreachable -j ACCEPT 
     ipchains -A icmp-acc -p icmp --icmp-type source-quench -j ACCEPT 
     ipchains -A icmp-acc -p icmp --icmp-type time-exceeded -j ACCEPT 
     ipchains -A icmp-acc -p icmp --icmp-type parameter-problem -j ACCEPT

От Good (внутренняя сеть) к DMZ (сервера)

Внутренние ограничения:

Можно было бы сделать маскарадинг от внутренней сети к DMZ, но здесь мы это не делаем. Так как кто-то из внутренней сети может попробовать напакостить, мы регистрируем в журнале все отклоненные пакеты.
        ipchains -A good-dmz -p tcp -d 192.84.219.128 smtp -j ACCEPT 
        ipchains -A good-dmz -p tcp -d 192.84.219.128 pop-3 -j ACCEPT 
        ipchains -A good-dmz -p udp -d 192.84.219.129 domain -j ACCEPT 
        ipchains -A good-dmz -p tcp -d 192.84.219.129 domain -j ACCEPT 
        ipchains -A good-dmz -p tcp -d 192.84.218.130 www -j ACCEPT 
        ipchains -A good-dmz -p tcp -d 192.84.218.130 rsync -j ACCEPT 
        ipchains -A good-dmz -p icmp -j icmp-acc 
        ipchains -A good-dmz -j DENY -l

От BAD (внешняя сеть) к DMZ (сервера).

  
        ipchains -A bad-dmz -p tcp -d 192.84.219.128 smtp -j ACCEPT 
        ipchains -A bad-dmz -p udp -d 192.84.219.129 domain -j ACCEPT 
        ipchains -A bad-dmz -p tcp -d 192.84.219.129 domain -j ACCEPT 
        ipchains -A bad-dmz -p tcp -d 192.84.218.130 www -j ACCEPT 
        ipchains -A bad-dmz -p icmp -j icmp-acc 
        ipchains -A bad-dmz -j DENY

От Good (внутренняя сеть) к Bad (внешняя сеть).

Внутренние ограничения:

       ipchains -A good-bad -p tcp --dport www -j MASQ
       ipchains -A good-bad -p tcp --dport ssh -j MASQ
       ipchains -A good-bad -p udp --dport 33434:33500 -j MASQ
       ipchains -A good-bad -p tcp --dport ftp --j MASQ
       ipchains -A good-bad -p icmp --icmp-type ping -j MASQ
       ipchains -A good-bad -j REJECT -l

От DMZ к Good (внутренняя сеть).

Внутренние ограничения:

       ipchains -A dmz-good -p tcp ! -y -s 192.84.219.128 smtp -j ACCEPT
       ipchains -A dmz-good -p udp -s 192.84.219.129 domain -j ACCEPT
       ipchains -A dmz-good -p tcp ! -y -s 192.84.219.129 domain -j ACCEPT
       ipchains -A dmz-good -p tcp ! -y -s 192.84.218.130 www -j ACCEPT
       ipchains -A dmz-good -p tcp ! -y -s 192.84.218.130 rsync -j ACCEPT
       ipchains -A dmz-good -p icmp -j icmp-acc
       ipchains -A dmz-bad -j DENY -l

От DMZ к bad (внешняя сеть).

DMZ ограничения:

       ipchains -A dmz-bad -p tcp -s 192.84.219.128 smtp -j ACCEPT
       ipchains -A dmz-bad -p udp -s 192.84.219.129 domain -j ACCEPT
       ipchains -A dmz-bad -p tcp -s 192.84.219.129 domain -j ACCEPT
       ipchains -A dmz-bad -p tcp ! -y -s 192.84.218.130 www -j ACCEPT
       ipchains -A dmz-bad -p icmp -j icmp-acc
       ipchains -A dmz-bad -j DENY -l

От Bad (внешняя сеть) к Good (внутренняя сеть).

Мы не позволяем ничего (не-маскарадное) от внешней сети к внутренней сети

       ipchains -A bad-good -j REJECT

Фильтрация пакетов непосредственно для Linux машины

Если мы хотим использовать фильтрацию пакета на пакетах, приходящих непосредственно к linux машине, то мы должны настроить фильтрацию в цепочке input. Мы создаем одну цепочку для каждого интерфейса адресата:

       ipchains -N bad-if 
       ipchains -N dmz-if 
       ipchains -N good-if
Создаем переходы на них:
       ipchains -A input -d 192.84.219.1 -j bad-if 
       ipchains -A input -d 192.84.219.250 -j dmz-if 
       ipchains -A input -d 192.168.1.250 -j good-if

Интерфейс Bad (внешняя сеть).

Машина пакетной фильтрации:

        ipchains -A bad-if -i ! ppp0 -j DENY -l 
        ipchains -A bad-if -p TCP --dport 61000:65096 -j ACCEPT 
        ipchains -A bad-if -p UDP --dport 61000:65096 -j ACCEPT 
        ipchains -A bad-if -p ICMP --icmp-type pong -j ACCEPT 
        ipchains -A bad-if -j icmp-acc 
        ipchains -A bad-if -j DENY

Интерфейс DMZ.

Ограничения машины пакетной фильтрации:

       ipchains -A dmz-if -i ! eth0 -j DENY 
       ipchains -A dmz-if -p TCP ! -y -s 192.84.219.129 53 -j ACCEPT 
       ipchains -A dmz-if -p UDP -s 192.84.219.129 53 -j ACCEPT 
       ipchains -A dmz-if -p ICMP --icmp-type pong -j ACCEPT 
       ipchains -A dmz-if -j icmp-acc 
       ipchains -A dmz-if -j DENY -l

Интерфейс Good (внутренний).

         ipchains -A good-if -i ! eth1 -j DENY 
         ipchains -A good-if -p ICMP --icmp-type ping -j ACCEPT 
         ipchains -A good-if -p ICMP --icmp-type pong -j ACCEPT 
         ipchains -A good-if -j icmp-acc 
         ipchains -A good-if -j DENY -l

7.5 В заключение

Удаление правил блокировки:

        ipchains -D input 1 
        ipchains -D forward 1 
        ipchains -D output 1

Next Previous Contents