Страница 1 из 1

Проблема с rdr(ipnat)+ipfw+natd

Добавлено: 2007-03-13 3:52:00
aristos
Да, уже по названию можно понять, что здесь мясо =)
Начну сначала. Есть шлюз FreeBSD 5.5:

Код: Выделить всё

- xl0 -192.168.0.2 - смотрит в локалку.
- vlan1 - 111.111.111.111 - наружу.
Конфиг для ipfw - 1в1 как в статье ув. lissyarы. (только перед дивертами прописал пайпы)
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
- к ней привязан внешний ip и с него предполагалось осуществлять редирект портов внутрь сети(без натирования, просто редирект по средствам rinetd или portfwd).

На втором канале поднял 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}

Коротко про natd:
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}
Всё пашет через 2 канала , все ходят куда надо и т.п.
но редирект ерез 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
Заработал редирект только на vlan1 - 111.111.111.111/32.
Почему не работает на остальных, куда вообще соваться чтоб всё это настроить ? Какие вообще есть варианты решения вопроса ?
Отказаться от ipfw(и делать всё на ipnat и ipf) не могу по причине дурацкого роутинга и шейпера.

Добавлено: 2007-03-13 13:06:32
dikens3
Для PF есть ALTQ (Шейпинг)

Мне кажется что в natd по default рубятся входящие соединения.

Код: Выделить всё

deny_incomig yes
а нужно

Код: Выделить всё

deny_incomig no

Добавлено: 2007-03-13 18:43:37
aristos
dikens3 писал(а): Мне кажется что в natd по default рубятся входящие соединения.

Код: Выделить всё

deny_incomig yes
а нужно

Код: Выделить всё

deny_incomig no
Т.е. запуск natd должен иметь вид:

Код: Выделить всё

/sbin/natd -m -u -p 8668 -n vlan1  -deny_incomig no -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
???????

Добавлено: 2007-03-13 21:51:25
Alex Keda
при таких замутах, не проще сделать файл с конфигом натд?

Добавлено: 2007-03-15 1:30:40
aristos
lissyara писал(а):при таких замутах, не проще сделать файл с конфигом натд?
Проще, сделал, проблемы это не решило =(