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

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

Andrey Matveev

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


Указываем первый (основной) внешний адрес:

# vi /etc/hostname.fxp0

inet 212.34.XX.162 255.255.255.248 NONE

Второй (резервный) внешний адрес:

# vi /etc/hostname.fxp1

inet 81.13.XY.98 255.255.255.224 NONE

Внутренний адрес:

# vi /etc/hostname.fxp2

inet 192.168.1.1 255.255.255.0 NONE

Информация о шлюзе основного провайдера (default gateway) заносится в файл /etc/mygate:

# vi /etc/mygate

212.34.XX.161

Далее, с помощью утилиты sysctl(8), устанавливаем значение переменной net.inet.ip.forwarding равным единице. Так мы включим перенаправление IPv4-пакетов между сетевыми интерфейсами.

# sysctl -w net.inet.ip.forwarding=1

Для того чтобы необходимые значения переменных механизма sysctl вступали в силу после перезагрузки системы, следует внести соответствующие изменения в файл sysctl.conf(5):

КОД

# vi /etc/sysctl.conf

// включаем маршрутизацию:

net.inet.ip.forwarding=1

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

ddb.panic=0

Собственно, на этом вся предварительная настройка закончена, перезагружаемся:

# shutdown -r now

Разруливаем трафик на несколько каналов

Штатный файрвол pf(4) не только возьмет на себя функцию преобразования сетевых адресов и обеспечит эффективную фильтрацию пакетов, но и поможет нам настроить симметричную маршрутизацию для правильного возврата пакетов в тот канал, с которого было инициировано соединение, вне зависимости от настройки default route.

КОД

# vi /etc/pf.conf

// Указываем используемые сетевые интерфейсы:

ext_if_a = "fxp0"

ext_if_b = "fxp1"

// Для каждого из каналов задаем IP-адрес шлюза:

ext_gw_a = "211.34.XX.161"

ext_gw_b = "81.13.XY.97"

// В таблицу users заносим абсолютный путь до конфига с IP-адресами наших клиентов:

table <users> persist file "/etc/nat.conf"

// Производим трансляцию внутренних адресов в основные адреса (не IP-alias'ы) внешних интерфейсов. При отсутствии IP-псевдонимов, а также если используется статическое назначение IP-адресов, запись «($ext_if_a:0)» можно сократить до «$ext_if_a».

nat on $ext_if_a inet from <users> to any -> ($ext_if_a:0)

nat on $ext_if_b inet from <users> to any -> ($ext_if_b:0)

// Важный момент: направляем исходящие пакеты в канал, соответствующий адресу источника:

pass out route-to ($ext_if_a $ext_gw_a) inet from ($ext_if_a) \

to !(self:network) keep state

pass out route-to ($ext_if_b $ext_gw_b) inet from ($ext_if_b) to \

!(self:network) keep state

// Разрешаем входящие подключения к обслуживаемым TCP-сервисам:

pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) inet proto tcp \

to port { ssh, smtp, www, https } flags S/SA keep state

pass in on $ext_if_a inet proto tcp from ($ext_if_a:network) \

to port { ssh, smtp, www, https } flags S/SA keep state

Для второго внешнего сетевого интерфейса нужно проделать то же самое (полный пример конфигурационного файла pf.conf ты сможешь найти на прилагаемом к журналу диске). Далее в файле /etc/nat.conf указываем IP-адреса клиентских машин, которым нужно предоставить выход в сеть:

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