URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID10
Нить номер: 3285
[ Назад ]

Исходное сообщение
"Помогите с настройкой ipfw"

Отправлено Ceas , 10-Май-07 01:55 
Доброго времени суток, который день бьюсь над одной конфигурацией:
Шлюз на FreeBSD 6.2 имеется 3 интерфейса к различным провайдерам и 1 интерфейс в локальную сеть. Нада настроить систему чтобы для работы в интернете использовался определенный провайдер выбираемый на основе маршрута по умолчанию. При запросах по определенным портам на другие внешние интерфейсы из интернета ответ посылался через интерфейс на который поступил запрос (policy based routing как я понимаю), а не отправлялся через маршрут по умолчанию.
из того что уже наковырял:
rc.conf

defaultrouter="1.1.1.1"
gateway_enable="YES"
hostname="Inetserv"
ifconfig_re0="inet 192.168.1.2  netmask 255.255.255.0"
ifconfig_vr0="inet 1.1.1.2  netmask 255.255.255.252"
ifconfig_vr1="inet 2.2.2.2  netmask 255.255.255.252"
ifconfig_vr2="inet 3.3.3.2  netmask 255.255.255.252"
kern_securelevel="1"
kern_securelevel_enable="YES"
keymap="ru.koi8-r"
linux_enable="YES"
nfs_client_enable="YES"
#router="/sbin/routed"
#router_enable="YES"
#router_flags="-s"
sshd_enable="YES"
usbd_enable="YES"
firewall_enable="YES"
firewall_script="/etc/ipfw.script"
natd1_enable="YES"
natd1_interface="vr0"
natd1_flags="-f /etc/natd1.conf"
natd2_enable="YES"
natd2_interface="vr1"
natd2_flags="-f /etc/natd2.conf"
natd3_enable="YES"
natd3_interface="vr2"
natd3_flags="-f /etc/natd3.conf"

natdx.conf

port 866x
log yes
log_denied yes
log_ipfw_denied yes
use_sockets yes
same_ports yes
unregistered_only yes
redirect_port tcp 192.168.1.8:20 20
redirect_port tcp 192.168.1.9:21 21
redirect_port tcp 192.168.1.10:220 220
redirect_port tcp 192.168.1.11:143 143
redirect_port tcp 192.168.1.14:25 25
redirect_port tcp 192.168.1.15:110 110
redirect_port udp 192.168.1.16:1701 1701
redirect_port tcp 192.168.1.17:1723 1723
redirect_port tcp 192.168.1.1:3389 16000
redirect_port tcp 192.168.1.13:3389 16001
redirect_port tcp 192.168.1.3:3389 13125
redirect_port tcp 192.168.1.4:3050 3050
redirect_port tcp 192.168.1.5:28758 28758
redirect_port tcp 192.168.1.6:28756 28756
redirect_port tcp 192.168.1.7:28757 28757

ipfw.script
#!/bin/sh

ipfw -f flush

cmd="ipfw add"
iif1="vr0"
iif2="vr1"
iif3="vr2"
lan="192.168.1.0/24"

lif="re0"
iip1="1.1.1.2"
iip2="2.2.2.2"
iip3="3.3.3.2"
igw1="1.1.1.1"
igw2="2.2.2.1"
igw3="3.3.3.1"

#Allowing localhost and protecting it
$cmd allow ip from any to any via lo0
$cmd deny ip from any to 127.0.0.0/8
$cmd deny ip from 127.0.0.0/8 to any

$cmd divert natd1 ip from any to any
$cmd divert natd2 ip from any to any
$cmd divert natd3 ip from any to any
$cmd fwd $igw1 ip from $iip1 to any
$cmd fwd $igw2 ip from $iip2 to any
$cmd fwd $igw3 ip from $iip3 to any
$cmd divert natd1 ip from any to $iip1
$cmd divert natd2 ip from any to $iip2
$cmd divert natd3 ip from any to $iip3

$cmd check-state
#дальше идет кучка правил смысл которых сводится к тому что все вокруг разрешенно и keep-state.... заканчиваются они "$cmd allow all from any to any"

Наты прописал в /etc/rc.d отдельными вхождениями, поправил для них /etc/services (указал там порты), так что тут проблем точно нет.


Пинг я вроде заставил уходить с того интерфейса на который он был послан (подозреваю связку keep-state и форварда), но вот как заставить уходить с тогоже интерфейса еще и пакеты которые пересылались порт редиректом ната на другую машину??? смотрел логи дивертов с форвадрами: пакет принимается и пересылается на машину внутри сети, дальше он возвращается и пытается уйти через шлюз по умолчанию где доблестно погибает от ударов в маршрутизаторы другого провайдера...
Ктонить подскажите как это исправить. Очень надо чтоб все работало, очень хочу чтоб работало под FreeBSD и в связке ipfw + natd.
Помогите чайнику, если можно то пожалуйста с примерами и если не затруднит с объяснением.
Заранее примного благодарен


Содержание

Сообщения в этом обсуждении
"Помогите с настройкой ipfw"
Отправлено DN , 11-Май-07 13:55 
>ipfw.script
>#!/bin/sh
>
>ipfw -f flush
>
>cmd="ipfw add"
>iif1="vr0"
>iif2="vr1"
>iif3="vr2"
>lan="192.168.1.0/24"
>
>lif="re0"
>iip1="1.1.1.2"
>iip2="2.2.2.2"
>iip3="3.3.3.2"
>igw1="1.1.1.1"
>igw2="2.2.2.1"
>igw3="3.3.3.1"
>
>#Allowing localhost and protecting it
>$cmd allow ip from any to any via lo0
>$cmd deny ip from any to 127.0.0.0/8
>$cmd deny ip from 127.0.0.0/8 to any
>
>$cmd divert natd1 ip from any to any
>$cmd divert natd2 ip from any to any
>$cmd divert natd3 ip from any to any
>$cmd fwd $igw1 ip from $iip1 to any
>$cmd fwd $igw2 ip from $iip2 to any
>$cmd fwd $igw3 ip from $iip3 to any
>$cmd divert natd1 ip from any to $iip1
>$cmd divert natd2 ip from any to $iip2
>$cmd divert natd3 ip from any to $iip3
>
>$cmd check-state
>#дальше идет кучка правил смысл которых сводится к тому что все вокруг
>разрешенно и keep-state.... заканчиваются они "$cmd allow all from any to
>any"
>
>Наты прописал в /etc/rc.d отдельными вхождениями, поправил для них /etc/services (указал там
>порты), так что тут проблем точно нет.
>
>
>Пинг я вроде заставил уходить с того интерфейса на который он был
>послан (подозреваю связку keep-state и форварда), но вот как заставить уходить
>с тогоже интерфейса еще и пакеты которые пересылались порт редиректом ната
>на другую машину??? смотрел логи дивертов с форвадрами: пакет принимается и
>пересылается на машину внутри сети, дальше он возвращается и пытается уйти
>через шлюз по умолчанию где доблестно погибает от ударов в маршрутизаторы
>другого провайдера...
>Ктонить подскажите как это исправить. Очень надо чтоб все работало, очень хочу
>чтоб работало под FreeBSD и в связке ipfw + natd.
>Помогите чайнику, если можно то пожалуйста с примерами и если не затруднит
>с объяснением.
>Заранее примного благодарен

Вот кратко описано, может поможет.
https://www.opennet.ru/openforum/vsluhforumID10/3273.html


"Помогите с настройкой ipfw"
Отправлено Ceas , 12-Май-07 03:40 
>Вот кратко описано, может поможет.
>https://www.opennet.ru/openforum/vsluhforumID10/3273.html

Не, к сожалению не помогло, там описывается немного другая ситуация и проблема у вопрашающего совершенно инная.
приложу логи ipfw чтоб было хоть примерно понятно....

ipfw: 500 Divert 8661 TCP 85.114.69.201:3944 1.1.1.2:16000 in via vr0
ipfw: 2100 Accept TCP 85.114.69.201:3944 192.168.1.1:3389 in via vr0
ipfw: 1100 Accept TCP 85.114.69.201:3944 192.168.1.1:3389 out via re0
ipfw: 2000 Accept TCP 192.168.1.1:3389 85.114.69.201:3944 in via re0
ipfw: 600 Divert 8662 TCP 192.168.1.1:3389 85.114.69.201:3944 out via vr1
ipfw: 900 Forward to 2.2.2.1 TCP 2.2.2.2:16000 85.114.69.201:3944 out via vr1
ipfw: 600 Divert 8662 TCP 85.114.69.201:3944 2.2.2.2:16000 in via vr1
ipfw: 2100 Accept TCP 85.114.69.201:3944 192.168.1.1:3389 in via vr1
ipfw: 1100 Accept TCP 85.114.69.201:3944 192.168.1.1:3389 out via re0


Номера правил менялись но суть осталась таже...
1. пакет приходит на интерфейс vr0 с адресом 1.1.1.2 по порту 16000 и заворачивается divert'ом в нат. "ipfw: 500 Divert 8661 TCP 85.114.69.201:3944 1.1.1.2:16000 in via vr0"
2. Далее в соответствии с правилом redirect_port 192.168.1.1:3389 16000 он перенаправляется на 192.168.1.1:3389 "ipfw: 2100 Accept TCP 85.114.69.201:3944 192.168.1.1:3389 in via vr0"
3. обрабатывается правилом как исходящий через интерфейс смотрящий в локальную сеть на адрес 192.168.1.1:3389 "ipfw: 1100 Accept TCP 85.114.69.201:3944 192.168.1.1:3389 out via re0"
4. Машина в локальной сети получив запрос инициирует ответ на тотже самый адресс и направляет на внутренний интерфейс моего FreeBSD сервачка: "ipfw: 2000 Accept TCP 192.168.1.1:3389 85.114.69.201:3944 in via re0"

А ВОТ ТУТ ПРОИСХОДИИТ КОСЯК
5 (ТО КАК ЕСТЬ). Сервер перенаправляет пакет как исходящий в нат интерфейса шлюза по умолчанию: ipfw: 600 Divert 8662 TCP 192.168.1.1:3389 85.114.69.201:3944 out via vr1
5 (ТО КАК НАДО): Сервер должен перенаправить пакет в нат интерфейса с которого пришел запрос

Дальше собсно уже не так интересно, потому как если пакет завернеца в нат то от из натаже и уйдет в нужном направлении в соответствии с правилом "ipfw add fwd". Но вот как научить сервер перенаправлять пакеты именно туда куда я хочу? правило keep-state на интерфейс смотрящий в локалку не помогает, почему-то. Делать метку пакета тут вроде не имеет смысла, потому как пакет выходит за рамки сервера и метка пропадет, а следовательно и ответ от машины в локальной сети опять прийдет не в тот нат.


"Помогите с настройкой ipfw"
Отправлено rapido , 17-Май-07 14:29 
попробуйте использовать iproute2 (или аналог его во FreeBSD).
у меня тоже был такой случай. пакеты приходящие на интерфейс 1, уходили через интерфейс 2 (default).
более подробно: http://lartc.org/

"Помогите с настройкой ipfw"
Отправлено Ged , 20-Май-07 14:20 
>$cmd divert natd1 ip from any to any
вроде еще нужно добавить via iif1
>$cmd divert natd2 ip from any to any
>$cmd divert natd3 ip from any to any
>$cmd fwd $igw1 ip from $iip1 to any
>$cmd fwd $igw2 ip from $iip2 to any
>$cmd fwd $igw3 ip from $iip3 to any
для того чтобы такое использовать ядро должно быть скомпилировано с опцией IPFIREWALL_FORWARD
>$cmd divert natd1 ip from any to $iip1
>$cmd divert natd2 ip from any to $iip2
>$cmd divert natd3 ip from any to $iip3
соответственно, это вроде не требуется..
но делал, давно, мог забыть.
и я не помню что происходит с правилом keep-state.