Динамические адреса.
Метки: DHCP | firewall | IPTables
Пятница, 10 апреля 2009 г.
Просмотров: 2548
Динамические 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. Пример файла:
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, чтобы прочитать значения, записанные в этом файле (кавычки - это не одинарные кавычки, а те, которые находятся «под тильдой»!):
$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_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. Все, что нужно, - это добавить вызов нужного сценария в файл, вызывающий брандмауэр, например:
Если время аренды IP-адреса вышло и он изменился, сценарий будет запущен опять. Нужно сбросить все правила брандмауэра при старте сценария, тогда точно не будет никаких проблем.
Блокирование и разблокирование узлов.
Немного раньше было рассказано, как можно с помощью IPTables можно блокировать нежелательные узлы, используя такой код сценария:
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-адреса из списка блокировки и автоматического перезапуска брандмауэра. Сценарий для добавления узла в список блокировки и перезапуска брандмауэра:
$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. Нужно изменить права доступа к файлу:
Теперь можно использовать сценарии:
Узел добавлен, перезапускаем firewall:
Второе сообщение выводится из файла rc.firewall, если есть желание перевести его на русский язык, просто отредактируйте этот файл.
Файл для разблокировки узла, то есть для удаления IP-адреса узла из списка блокировки:
## Путь к файлу блокировки
$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"; }