Укрощение двухголового змия 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-адреса клиентских машин, которым нужно предоставить выход в сеть: |