Личный блог Suvan`a.

Работая и играя с Linux... И что из этого иногда получается.

Динамические адреса.

Рубрика: Безопасность -> Брандмауэр
Метки: | |
Пятница, 10 апреля 2009 г.
Просмотров: 6690

Динамические IP-адреса обычно применяются при dial-up-до­ступе, а также в больших корпоративных сетях с большим количес­твом машин, где индивидуальная настройка компьютеров отнимает очень много времени.

     Для автоматического конфигурирования узла в Ethernet-сетях использу­ется протокол DHCP. Кроме назначения IP-адреса, этот протокол дает возможность установить различные сетевые параметры узла, в частности IP-адрес шлюза, IP-адреса серверов имен и т.д.

     Использование динамических адресов создает лишние проблемы при конфигурировании брандмауэра. Следовательно, нужно синхронизировать правила IPTables с DHCP-сервером.


     DHCPCD.

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

     Месторасположение этого файла зависит от дистрибутива Linux. В SuSE и предыдущих версиях Red Hat данный файл может быть найден в каталоге /var/lib/dhcp, в некоторых других версиях - в ката­логе /etc/dhcp. Имя файла зависит от настраиваемого интерфейса, на­пример dhcpd-eth0.info. Пример файла:

#cat dhcpd-eth0.info

IPADDR=1.2.3.4

NETMASK=255.255.255.0

NETWORK=l.2.3.0

BROADCAST=255.255.255.255

GATEWAY=1.2.3.254

HOSTNAME='host.example.org' DNS=194.164.8.100,194.164.4.100

DHCPSID=62.254.64.20

DHCPGIADDR=1.1.1.254

DHCPSIADDR=0.0.0.0

DHCPCHADDR=00:A5:24:4C:3E:57

DHCPSHADDR=00:ОС:36:E5:54:8C

DHCPSNAME=''

LEASETIME=61939

RENEWALTIME=30969

REBINDTIME=54196

INTERFACE='eth2'

CLASSID='Linux 2.4.21-144-default i686'

CLIENTID=00:A0:24:4C:3E:57

     Используя сценарий, можно модифицировать сценарий firewall.sh, чтобы прочитать значения, записанные в этом файле (кавычки - это не одинарные кавычки, а те, которые нахо­дятся «под тильдой»!):

#!/bin/bash

$IP_EXT = 'grep IPADDR=/etc/dhcp/dhcpd-eth0.infо | cut -f 2 -d ='

$GATEWAY = 'grep GATEWAY=/etc/dhcp/dhcpd-eth0.infо | cut -f 2 -d ='

     Похоже делается с DNS-серверами (здесь немного сложнее, поскольку они перечислены через запятую):

$IP_DNS1 = 'grep DNS= /etc/dhcp/dhcpd-eth0.infо | cut -f -2 -d = | cut -f 1 -d'

$IP_DNS2 = 'grep DNS= /etc/dhcp/dhcpd-eth0.infо | cut -f -2 -d = | cut -f 2 -d'

     Если присвоен только один IP-адрес сервера DNS, переменная IP_DNS2 будет содержать такое же значение, как и IP_DNS1.Осталось только вызвать брандмауэр, пока эти переменные доступны.

     Во многих системах сценарий /etc/dhcp/dhcp.ехе вызывается всякий раз, когда dhcpcd «поднимает» интерфейс (название этого сценария может быть изменено с помощью опции -с демона dhcpcdd). В других вызывается дру­гой сценарий - /etc/sysconfig/network/scripts/dhcpd-hook. Все, что нужно, - это добавить вызов нужного сценария в файл, вызыва­ющий брандмауэр, например:

source /usr/local/etc/rc.firewall

     Если время аренды IP-адреса вышло и он изменился, сценарий будет за­пущен опять. Нужно сбросить все правила брандмауэра при старте сценария, тогда точно не будет никаких проблем.

     Блокирование и разблокирование узлов.

     Немного раньше было рассказано, как можно с помощью IPTables можно блокировать не­желательные узлы, используя такой код сценария:

for host in 'cat /usr/local/etc/hosts.deny'; 

do 

  $IPT -I INPUT -s $host -j DROP 

  $IPT -I FORWARD -s $host -j DROP 

  $IPT -I OUTPUT -d $host -j DROP 

  $IPT -I FORWARD -d $host -j DROP 

done

     Все работает очень просто: нужно создать внешний файл, содержащий IP-адреса нежелательных узлов, а этот код соответствующим образом уста­навливает правила IPTables. Если модифицировать файл после применения правил, узлы блокиро­ваться не будут. Нужно перезапустить брандмауэр для того, чтобы из­менения вступили в силу.

     Здесь представлены два небольших сценария, которые будут использоваться для добавления/удаления IP-адреса из списка блокировки и автоматичес­кого перезапуска брандмауэра. Сценарий для добавления узла в список блокировки и перезапуска брандмауэра:

#!/usr/bin/perl

   use Fcntl qw ( : DEFAULT : flock);

   ## Путь к списку блокировки

   $hostsfile = "/usr/local/etc/hosts.deny";

   ## Путь к сценарию брандмауэра

   $fwscript = "/usr/local/etc/rc.firewall";

   $ARGV[0] or die "Синтаксис:\n blockip <IР-адрес или имя узла>\n\n";

   open (FH, "»$hostsfile") || die "He могу открыть $hostsfile: $!\n"; flock(FH, LOCK_SH | LOCK_NB) or die "ОШИБКА, возможно, файл уже используется: $!\n";

   print FH $ARGV[0]; close FH;

   print STDOUT "Узел добавлен, перезапускаем firewall ...\n"; exec ("/bin/bash $fwscript");

     Сохраняем этот файл в каталоге /usr/local/bin под именем blockip. Нужно изменить права доступа к файлу:

# chmod 700 blockip

     Теперь можно использовать сценарии:

# blockip 1.2.3.4

     Узел добавлен, перезапускаем firewall:

Firewall restarted

     Второе сообщение выводится из файла rc.firewall, если есть желание пере­вести его на русский язык, просто отредактируйте этот файл.

     Файл для разблокировки узла, то есть для удаления IP-адреса узла из списка блокировки:

# ! /usr/bin/perl

   use Fcntl qw(:DEFAULT :flock);

   ## Путь к файлу блокировки

   $hostsfile = "/usr/local/etc/hosts.deny";

   ## Путь к сценарию firewall'a

   $fwscript = "/usr/local/etc/rc.firewall";

   $ARGV[0] or die "Синтаксис:\n unblockip <IР-адрес или имя узла>\n\n";

   open (FH, "<$hostsfile") || die "He могу открыть $hostsfile: $!\n"; flock (FH, LOCK_SH | LOCK_NB) or die "Ошибка, файл, возможно, уже используется: $!\n";

chomp (@lines = <FH>); close FH;

   $found = 0;

   open (FH, ">$hostsfile") || die "He могу записать $hostsfile: $!\n"; flock(FH, LOCK_SH | LOCK_NB) or die "ОШИБКА, файл, возможно, уже используется: $!\n";

   for (@lines) {

    if ($_ eq $ARGV[0]) {

    $found = 1; } else {

    print FH $_, "\n"; } } close FH;

if ($found) { print "Узел найден и удален, перезапускаем firewall ...\n"; exec ("/bin/bash $fwscript"); } else {

   print "Заданный вами узел НЕ НАЙДЕН!\n"; }