Начну сначала. Есть шлюз FreeBSD 5.5:
Код: Выделить всё
- xl0 -192.168.0.2 - смотрит в локалку.
- vlan1 - 111.111.111.111 - наружу.
natd.conf
Код: Выделить всё
/sbin/natd -m -u -p 8668 -n vlan1 -redirect_port tcp 192.168.0.3:80 111.111.111.111:80 -redirect_port tcp 192.168.0.3:555 111.111.111.111:555
Тут появился второй канал доступа в интеренет для большей стабильности и т.д.
Код: Выделить всё
- vlan3 - 222.222.222.222 - наружу
еще одна сетевушка:
Код: Выделить всё
vr0 - 333.333.333.333
На втором канале поднял natd
Код: Выделить всё
/sbin/natd -m -u -p 8678 -n vlan3 -redirect_port tcp 192.168.0.3:80 222.222.222.222:80 -redirect_port tcp 192.168.0.3:555 222.222.222.222:555
Сделал Policy-Based Routing (PBR). Конфиг ipfw выглядит так:
Код: Выделить всё
#!/bin/sh
# Переменные
FwCMD="/sbin/ipfw -q" # где лежит ipfw
fwtable="/sbin/ipfw table" #Команда для запуска таблиц
LanOut="vlan1" # Внешний интерфейс
LanOut89="vr0" # Внешний интерфейс
LanOutT="vlan3"
LanIn="xl0" # Внутренний интерфейс
LanVPN="ng0"
IpOut="111.111.111.111" # Внешний ip машины
IpOut89="333.333.333.333"
IpOutT="222.222.222.222"
IpIn="192.168.0.2" # внутренний IP машины
NetInMask="24" # Маска внутренней сети -24
NetIn="192.168.0.0" # Внутренняя сеть
sysctl net.inet.ip.fw.one_pass=0
killall -9 natd
/sbin/natd -m -u -p 8668 -n vlan1 -redirect_port tcp 192.168.0.3:80 111.111.111.111:80 -redirect_port tcp 192.168.0.3:555 111.111.111.111:555
/sbin/natd -m -u -p 8678 -n vlan3 -redirect_port tcp 192.168.0.3:80 222.222.222.222:80 -redirect_port tcp 192.168.0.3:555 222.222.222.222:555
# Сбрасываем все правила:
${FwCMD} -f flush
# Сбрасываем все гораничения по скорости pipe
${FwCMD} -f pipe flush
# Сбрасываем очереди
${FwCMD} -f queue flush
${FwCMD} add allow ip from me to any
#Проверяем соответствует ли пакет динамическим правилам
#${FwCMD} add check-state
////////////////
/////////Дальше идут запреты мультакастовых рассылок и пайпы с таблицами юзверей
///////////////
####Нат####
${FwCMD} add divert natd ip from table\(50\) to table\(8\) #out via ${LanOut}
${FwCMD} add divert 8678 ip from table\(50\) to any #out via ${LanOutT}
${FwCMD} add divert 8678 ip from ${NetIn}/${NetInMask} to table\(7\) #out via ${LanOutT}
${FwCMD} add divert natd ip from ${NetIn}/${NetInMask} to any #out via ${LanOut}
${FwCMD} add fwd 222.222.222.1 ip from ${IpOutT} to any
${FwCMD} add divert natd ip from any to ${IpOut} in via ${LanOut}
${FwCMD} add divert 8678 ip from any to ${IpOutT} in via ${LanOutT}
222.222.222.1 - гэтвый второго провайдера.
1ое правило: народ, который ходит в инет через 2ого провайдера(table(50)) при попытке пройти в локалку первого(table(8)) дивертится на первый нат. Всё Ок.
2.на все остальные адреса table(50) идет в инет и свою локалку. Всё Ок.
3.вся остальная сетка при попытке пройти в локалку второго (table(7)) провайдера дивертится на второй нат. Всё Ок.
4. в противном случае вся остальная сетка идет в инет через ервый шлюз.
5. т.к дефолтовый гетвый(в оперрационке) у нас один - ставим правило редиректа с второго внешнего интерфейса на гетвый второго провайдера. Всё Ок.
6 и 7 думаю понятно.
продолжение ipfw:
Код: Выделить всё
# рубим автоконфигуреную частную сеть
${FwCMD} add deny ip from 169.254.0.0/16 to any out via ${LanOut}
# рубаем мультикастовые рассылки
${FwCMD} add deny ip from 224.0.0.0/4 to any out via ${LanOut}
## рубаем мультикастовые рассылки
${FwCMD} add deny ip from 240.0.0.0/4 to any out via ${LanOut}
# разрешаем все установленные соединения
${FwCMD} add allow tcp from any to any established
# Разрешаем весь исходящий трафик (серверу то в интернет можно? :))
${FwCMD} add allow ip from ${IpOut} to any out xmit ${LanOut}
# Разрешаем icmp пакеты(пинг)эхо запрос,эхо ответ и время жизни пакета
${FwCMD} add allow icmp from any to any icmptypes 0,8,11
# Доступ к WWW серверу (доступ к 80,8080)и SSL (555)
${FwCMD} add allow tcp from any to ${IpOut} 80 via ${LanOut}
${FwCMD} add allow tcp from any to ${IpOutT} 80 via ${LanOutT}
${FwCMD} add allow tcp from any to ${IpOut89} 80 via ${LanOut89}
${FwCMD} add allow tcp from any to ${IpOut} 555 via ${LanOut}
${FwCMD} add allow tcp from any to ${IpOut89} 555 via ${LanOut89}
# Правила для разрешения коннектов по любым протоколам на
# внутренний интерфейс: tcp, udp, icmp
${FwCMD} add allow tcp from any to any via ${LanIn}
${FwCMD} add allow udp from any to any via ${LanIn}
${FwCMD} add allow icmp from any to any via ${LanIn}
но редирект ерез natd воооще не пашет ?
стучу снаружи в 80 порты
ipfw show пазывает прибавление количество прошедших пакетов напротив правил
Код: Выделить всё
${FwCMD} add allow tcp from any to ${IpOut} 80 via ${LanOut}
${FwCMD} add allow tcp from any to ${IpOutT} 80 via ${LanOutT}
${FwCMD} add allow tcp from any to ${IpOut89} 80 via ${LanOut89}
Хз, что делать...
Решил поставить ipnat.
Добавил опцию, пересобрал ядро.
Закомментировал редирект в natd.
добавил в ipnat.rules
Код: Выделить всё
rdr vlan3 222.222.222.222/32 port 80 -> 192.168.0.3 port 80 tcp
rdr vlan1 111.111.111.111/32 port 80 -> 192.168.0.3 port 80 tcp
rdr vr0 333.333.333.333/32 port 80 -> 192.168.0.3 port 80 tcp
Почему не работает на остальных, куда вообще соваться чтоб всё это настроить ? Какие вообще есть варианты решения вопроса ?
Отказаться от ipfw(и делать всё на ipnat и ipf) не могу по причине дурацкого роутинга и шейпера.