Незнаю нужно кому нибудь это решение или нет, но все же (не зря же два дня воевал):
Имеется шлюз на FreeBSD 7.2 с двумя выходами в интернет (sk0, IP 10.10.10.10 шлюз 10.10.10.11 и второй sk1, IP 20.20.20.20 шлюз 20.20.20.21) и локальная сеть (re0, IP 192.168.7.1) в которой, помимо рабочих станций, находятся сервера, на которые надо пробросить порты извне (есть еще задача разруливать выход в интернет по разным провайдерам, так как у одного хорошие каналы заграницу, у другого по России, задача решена, но здесь не затрагивается, чтобы не загромождать сообщение).
И при этом сильно хотелось, чтобы и сам шлюз (HTTP, SSH) и внутренние сервера были доступны
по обоим внешним адресам.
Были безуспешно перепробованы варианты из данного топика, но все таки решение было найдено. Попытаюсь его рассказать пошагово:
Шаг номер один:
NAT, я пользовался natd, и изначально пробовал запускать два экземпляра, но такой вариант не подходит, мы будем запускать
один natd для двух каналов. Делается следующим образом
файл /etc/rc.conf (заметьте что здесь не указывается интерфейс)
Код: Выделить всё
natd_program="/sbin/natd"
natd_enable="YES"
natd_flags="-f /etc/natd.conf"
вот конфиг /etc/natd.conf
Код: Выделить всё
log
instance default
interface sk0
port 8668
redirect_port tcp 192.168.7.8:15000 15000
redirect_port udp 192.168.7.8:15000 15000
instance Second_ISP
interface sk1
port 8669
redirect_port tcp 192.168.7.8:15000 15000
redirect_port udp 192.168.7.8:15000 15000
globalport 8670
Коментарий: обязятельно должна быть instance default! В моем случае это первый провайдер, для него нат отвечает по порту 8668, instance Second_ISP это мой второй провайдер, нат на порту 8669, и еще задается globalport на порту 8670, как правильно назвать не знаю, но дальше поймете.
Конфигурация IPFW:
Код: Выделить всё
#Запрещаем порты 135,445 и разрешаем SSH
${fwcmd} add 330 deny tcp from any to any 135,445
${fwcmd} add 340 allow tcp from any to any 22
#Следующие две строки нужны чтобы сам шлюз был доступен по обоим адресам, то есть с какого адреса идет
# пакет от шлюза, в тот интерфейс и уходил
${fwcmd} add 350 fwd 10.10.10.11 ip from 10.10.10.10 to not 192.168.7.0/24
${fwcmd} add 360 fwd 20.20.20.21 ip from 20.20.20.20 to not 192.168.7.0/24
#Далее шесть строк разделяют весь трафик по интерфейсам и напрвлениям, для удобства
${fwcmd} add 400 skipto 1000 all from any to any in recv re0
${fwcmd} add 450 skipto 2000 all from any to any out xmit re0
${fwcmd} add 500 skipto 3000 all from any to any in recv sk0
${fwcmd} add 550 skipto 4000 all from any to any out xmit sk0
${fwcmd} add 600 skipto 5000 all from any to any in recv sk1
${fwcmd} add 650 skipto 6000 all from any to any out xmit sk1
# Local INBOUND (разрешено все, ограничения добавлять по вкусу)
${fwcmd} add 1000 allow all from any to any
# Local OUTBOUND (разрешено все, ограничения добавлять по вкусу)
${fwcmd} add 2000 allow all from any to any
# ISP1 INBOUND (входящий трафик засовываем в нужный порт natd, после разрешаем все)
${fwcmd} add 3000 divert 8668 ip from any to 10.10.10.10
${fwcmd} add 3010 allow all from any to any
# ISP1 OUTBOUND (здесь самое интересное, симметрично для двух провадеров, распишу подробно по одному)
# первая строка запихиваем пакет в natd по порту globalport
${fwcmd} add 4000 divert 8670 ip from 192.168.7.0/24 to any
# если есть запись трянсляции подключения снаружи вовнутрь, то natd модифицирует
# пакет и ставит адресом источника тот внешний адрес, на который производилось подключение
# если это адрес первого провайдера, то далее просто разрешаем пакет и на этом обработка заканчивается
${fwcmd} add 4010 allow all from 10.10.10.10 to any
# если это адрес второго провайдера, то мы форвардим пакет на шлюз второго провайдера,
# и на этом обработка опять же заканчивается
${fwcmd} add 4020 fwd 20.20.20.21 ip from 20.20.20.20 to any
# если же natd вернул неизмененный пакет, то это значит что данный пакет не относится к подключению
# извне, и мы должны засунуть его в соответствующий порт natd
${fwcmd} add 4030 divert 8668 ip from 192.168.7.0/24 to any
# после чего разрешаем прохождение пакета и на этом обработка опять же заканчивается
${fwcmd} add 4040 allow all from any to any
# для второго провайдера все симметрично, подробно описывать не буду
# ISP2 INBOUND
${fwcmd} add 5000 divert 8669 ip from any to 20.20.20.20
${fwcmd} add 5010 allow all from any to any
# ISP2 OUTBOUND
${fwcmd} add 6000 divert 8670 ip from 192.168.7.0/24 to any
${fwcmd} add 6010 allow all from 20.20.20.20 to any
${fwcmd} add 6020 fwd 10.10.10.11 ip from 10.10.10.10 to any
${fwcmd} add 6030 divert 8669 ip from 192.168.7.0/24 to any
${fwcmd} add 6040 allow all from any to any
На этом вроде как все, заметьте что все правила написаны одинаково для двух провайдеров, и в принципе вы можете менять default маршрут между ними и все будет работать.