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 Цели

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

PING любой сети

Полезно для определения, действует ли машина.

TRACEROUTE любой сети

Аналогично, полезно для диагностики.

DNS доступ

Чтобы ping и DNS были полезнее.

Внутри DMZ:

Внутренняя сеть:

Разрешенные WWW, ftp, traceroute, ssh доступы во внешнюю сеть. Это достаточно стандартные вещи, чтобы разрешить их использование: здесь мы ограничиваемся только этими сервисами, а не всеми доступными сервисами Интернет.

Разрешить SMTP на почтовом сервере

То есть позволить отправку почты наружу.

Разрешить POP-3 на почтовом сервере

То есть позволить пользователям читать их почту

Разрешить DNS на серевере имен

Это нужно для работы с внешними именами WWW, ftp, traceroute и ssh.

Разрешить rsync на веб сервер

Для синхронизации внешнего веб сервера со внутренним.

Разрешить WWW на веб сервере

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

Разрешить ping на машине пакетной фильтрации

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

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