Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #92, АВГУСТ 2006 г.

Укрощение двухголового змия

Andrey Matveev

Хакер, номер #092, стр. 092-110-3


КОД

# vi /etc/nat.conf

192.168.1.2/32

192.168.1.4/32

192.168.1.7/32

Проверяем конфиги на наличие ошибок:

# pfctl -n -f /etc/pf.conf

И активируем набор рулесетов файрвола:

# pfctl -e -f /etc/pf.conf

Поднимаем надежный ретранслятор

Возложив ответственность за разрешение доменных имен на провайдерские DNS-серверы, мы, во-первых, обеспечим избыточность DNS, и, во-вторых, сведем объем внешнего DNS-трафика к минимуму:

КОД

# vi /var/named/etc/named.conf

// Определяем списки управления доступом:

acl clients {

127.0.0.1;

192.168.1/24;

};

// Задаем глобальные параметры конфигурации сервера имен:

options {

version "Stay off my DNS-server";

listen-on { any; };

listen-on-v6 { none; };

allow-transfer { none; };

allow-query { clients; };

allow-recursion { clients; };

// Указываем доступные DNS-серверы основного и резервного провайдеров:

forwarders { 212.34.XX.1; 212.34.XX.39; 81.13.XY.97; };

forward first;

};

Чтобы внесенные изменения вступили в силу, необходимо дать указание демону named(8) перечитать свой конфиг:

# rndc reload

Постконфигурационные нотки

Осталось только написать сценарий командного интерпретатора, который будет периодически опрашивать заданные узлы (/sbin/ping -c 2 -w 2 -I <основной IP-адрес> <IP-адрес проверяемого хоста>) и при необходимости изменять дефолтный маршрут (/sbin/route change default <резервный шлюз>). Простейший пример подобного скрипта можно найти на прилагаемом к журналу диске.

Распределение сетевой нагрузки

Достичь максимальной пропускной способности можно двумя способами: настроить трафик-шейпинг (смотри статью «Нарезаем трафик ломтиками» в мартовском «Хакере» за 2006 год) или объединить два доступных канала в один виртуальный, как показано ниже:

// Балансировка исходящего TCP-трафика:

pass in on $int_if route-to \

{ ($ext_if_a $ext_gw_a), ($ext_if_b $ext_gw_b) } round-robin \

inet proto tcp from <users> to any flags S/SA keep state

// Балансировка исходящего UDP- и ICMP-трафика:

pass in on $int_if route-to \

{ ($ext_if_a $ext_gw_a), ($ext_if_b $ext_gw_b) } round-robin \

inet proto { udp, icmp } from <users> to any keep state

Умный форвардинг

При такой схеме работы также возможно перенаправление запросов во внутреннюю сеть. Приведу пример с сервером терминалов.

// Переадресовываем входящие RDP-соединения на IP-адрес 192.168.1.254 и порт 3389:

rdr on $ext_if_a inet proto tcp to port 3389 tag EXT_IF_A -> 192.168.1.254

rdr on $ext_if_b inet proto tcp to port 3389 tag EXT_IF_B -> 192.168.1.254

// Устанавливаем маршрут для ответа на входящие пакеты для переадресованных RDP-запросов:

pass in reply-to ($ext_if_a $ext_gw_a) inet proto tcp flags S/SA \

tagged EXT_IF_A keep state

pass in reply-to ($ext_if_b $ext_gw_b) inet proto tcp flags S/SA \

tagged EXT_IF_B keep state

Тонкости трансляции сетевых адресов

За счет системы NAT пограничный шлюз может выполнять следующие задачи:

* перехват клиентских запросов из доверенной подсети;

* подмена исходного порта и адреса источника своим непривилегированным портом и адресом своего внешнего сетевого интерфейса;

Назад на стр. 092-110-2  Содержание  Вперед на стр. 092-110-4