Проблема с rdr(ipnat)+ipfw+natd
Добавлено: 2007-03-13 3:52:00
Да, уже по названию можно понять, что здесь мясо
Начну сначала. Есть шлюз FreeBSD 5.5:
Конфиг для ipfw - 1в1 как в статье ув. lissyarы. (только перед дивертами прописал пайпы)
natd.conf
Всё супер, всё пашет, натит, редиректит и режет по скорости кого надо и куда надо.
Тут появился второй канал доступа в интеренет для большей стабильности и т.д.
+
еще одна сетевушка: - к ней привязан внешний ip и с него предполагалось осуществлять редирект портов внутрь сети(без натирования, просто редирект по средствам rinetd или portfwd).
На втором канале поднял natd
Он поднялся всё нормально. По правилам диверта весь народ ходит всё ещё по первому нату(через него редирект работает). По второму только редирект и работает(вроде бы работал, хз), на тот момент была жопа и в авральном режиме делался второй канал, не до редиректа было.
Сделал Policy-Based Routing (PBR). Конфиг ipfw выглядит так:
Коротко про natd:
222.222.222.1 - гэтвый второго провайдера.
1ое правило: народ, который ходит в инет через 2ого провайдера(table(50)) при попытке пройти в локалку первого(table(8)) дивертится на первый нат. Всё Ок.
2.на все остальные адреса table(50) идет в инет и свою локалку. Всё Ок.
3.вся остальная сетка при попытке пройти в локалку второго (table(7)) провайдера дивертится на второй нат. Всё Ок.
4. в противном случае вся остальная сетка идет в инет через ервый шлюз.
5. т.к дефолтовый гетвый(в оперрационке) у нас один - ставим правило редиректа с второго внешнего интерфейса на гетвый второго провайдера. Всё Ок.
6 и 7 думаю понятно.
продолжение ipfw:
Всё пашет через 2 канала , все ходят куда надо и т.п.
но редирект ерез natd воооще не пашет ?
стучу снаружи в 80 порты
ipfw show пазывает прибавление количество прошедших пакетов напротив правил
Т.е. насколько я понимаю - пакеты проходят сквозь фаервол...??? но нефига не натится!!
Хз, что делать...
Решил поставить ipnat.
Добавил опцию, пересобрал ядро.
Закомментировал редирект в natd.
добавил в ipnat.rules
Заработал редирект только на vlan1 - 111.111.111.111/32.
Почему не работает на остальных, куда вообще соваться чтоб всё это настроить ? Какие вообще есть варианты решения вопроса ?
Отказаться от ipfw(и делать всё на ipnat и ipf) не могу по причине дурацкого роутинга и шейпера.
Начну сначала. Есть шлюз 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) не могу по причине дурацкого роутинга и шейпера.