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

2 провайдера: setfib + natd ?

Добавлено: 2010-02-05 18:49:35
Medison
Пробую отладить такой вариант: 2 провайдера, вся локалка ходит через isp1, 192.168.1.203 - через isp2
Что-то типа http://www.lissyara.su/articles/freebsd ... #example_5, но проще и с natd

# rc.conf

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

gateway_enable="YES"
defaultrouter="gw1"

ifconfig_fxp0="inet isp1 netmask 255.255.255.192 media 100baseTX link0 mediaopt full-duplex mtu 1500"  # to isp1
ifconfig_fxp1="inet 192.168.1.1 netmask 255.255.255.0 media 100baseTX link0 mediaopt full-duplex mtu 1500" # to local network
ifconfig_em0="inet 192.168.5.1 netmask 255.255.255.0" # to isp2

setfib1_enable="YES"
setfib1_defaultroute="192.168.5.2" # gw2
#sysctl.conf

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

net.inet.ip.fw.one_pass=0
# setfib -1 netstat -rn

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

Routing tables
Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            192.168.5.2        UGS         0       40    em0
# setfib -0 netstat -rn

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

Routing tables
Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            gw1       UGS         0    13682   fxp0
# nat + ipfw

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

natd -a isp1 -p 8668 -s -m -u -P /var/run/natd1.pid
natd -a isp2 -p 8669 -s -m -P /var/run/natd2.pid

ipfw add 100 pass ip from any to any via lo0

ipfw add 410 setfib 1 ip from any to 192.168.1.203
ipfw add 415 setfib 1 ip from 192.168.1.203 to any
ipfw add 420 setfib 1 ip from any to any via em0

ipfw add 500 divert 8668 ip from any to any via fxp0
ipfw add 510 divert 8669 ip from any to any via em0

ipfw add 550 allow ip from any to any
У локалки проблем нет.

Если убрать правило 510 (отключаем второй nat),
tcpdump: listening on em0, link-type EN10MB (Ethernet), capture size 96 bytes

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

IP (tos 0x0, ttl 127, id 7987, offset 0, flags [none], proto ICMP (1), length 60) 192.168.1.203 > 194.186.36.211: ICMP echo request, id 512, seq 45313, length 40
IP (tos 0x0, ttl 127, id 7990, offset 0, flags [none], proto ICMP (1), length 60) 192.168.1.203 > 194.186.36.211: ICMP echo request, id 512, seq 45569, length 40
IP (tos 0x0, ttl 127, id 7991, offset 0, flags [none], proto ICMP (1), length 60) 192.168.1.203 > 194.186.36.211: ICMP echo request, id 512, seq 45825, length 40
IP (tos 0x0, ttl 127, id 7992, offset 0, flags [none], proto ICMP (1), length 60) 192.168.1.203 > 194.186.36.211: ICMP echo request, id 512, seq 46081, length 40
- это ping http://www.rbc.ru

Если правило 510 включено, на em0 - тишина.

Специально упростил задачу, чтобы научиться работать с двумя шлюзами, но пока не выходит...

Re: 2 провайдера: setfib + natd ?

Добавлено: 2010-02-05 19:41:12
FilosofBeer
Я тоже пробовал на два провайдера, но у меня не получилось, сервак стал зависать, причем всегда через разное время.

Re: 2 провайдера: setfib + natd ?

Добавлено: 2010-02-06 1:02:48
Medison
Мда, второй раз возвращаюсь к теме, в декабре были подвижки с использованием "fwd" и "not me".
terminus, такое руководство по теме подготовил (http://www.lissyara.su/articles/freebsd/tuning/ipfw_nat)!
Копипаст попробовать не могу, но у меня тоже FreeBSD 7.2-STABLE, а natd и ipfw - годами проверены...

Поиск по "setfib" в этом форуме тоже наводит на мысль, что вопрос близок к решению, но есть проблемы.

Re: 2 провайдера: setfib + natd ?

Добавлено: 2010-02-06 10:16:16
FilosofBeer
Поиск по "setfib" в этом форуме тоже наводит на мысль, что вопрос близок к решению, но есть проблемы.
Да, есть. И статью эту уже перечитали много раз. И даже консультации были, но проблемы не решены.
У меня была конфигурация сервера на один интернет канал. появился второй интернет канал. По статье и с консультациями сервер был переделан на два интернет канала при помощи "setfib", но он стал работать нестабильно. Причем зависает всегда через разные промежутки времени.
Т.к. в системе все было проверено, то стал грешить на железо, но когда переделал все обратно на один интернет канал, сервер стал работать нормально без зависаний.

Re: 2 провайдера: setfib + natd ?

Добавлено: 2010-02-07 21:34:50
terminus
Почему замарачиваетесь на natd? Почему не хотите использовать ipfw nat?

setfib не будет работать с natd так как информация о fib прицепляется к пакету пока он в ядре, а natd это программа из user land - как только пакет уходит в нее то с него стираются все дополнительные теги (fib, tag) и возвращается он потом в ipfw без них - соответственно он получит fib 0.

Попробуйте не 5й пример под себя заточить, а 4й - в пятом динамическое распределение, а в четвертом статическое.

Только для адаптера em0 отключите -rxcsum

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

ifconfig_em0="inet 192.168.5.1 netmask 255.255.255.0 -rxcsum"
====

Т.к. в системе все было проверено, то стал грешить на железо, но когда переделал все обратно на один интернет канал, сервер стал работать нормально без зависаний.
На STABLE удалось перейти или так и зависает при make buildworld?

Re: 2 провайдера: setfib + natd ?

Добавлено: 2010-02-08 15:57:58
Medison
Добавил в ядро:

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

options IPFIREWALL_NAT # ipfw kernel nat support
options LIBALIAS # libalias library, performing NAT
и в /etc/make.conf

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

CFLAGS+= -DIPFIREWALL_NAT
Скомпилил только ядро.

подправил в /etc/rc.conf

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

ifconfig_em0="inet 192.168.5.1 netmask 255.255.255.0 -rxcsum"
Новый нат:

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

ipfw nat 1 config log ip isp1 same_ports unreg_only
ipfw nat 2 config log ip isp2 same_ports

ipfw add 500 nat 1 ip from any to any via fxp0
ipfw add 510 nat 2 ip from any to any via em0
192.168.1.203 вышел в интернет через альтернативный шлюз !
terminus, cпасибо !


Но это была учебная задачка, в конкретной задачке на 192.168.5.1:25 висит smtp, хотелось бы пустить на него входящую почту через альтернативный шлюз.
На роутере isp2 прописано редиректить 25 порт на 192.168.5.1:25

С ip=host делаю telnet на 25 порт роутера isp2:

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

tcpdump: listening on em0, link-type EN10MB (Ethernet), capture size 96 bytes
IP (tos 0x0, ttl 117, id 41410, offset 0, flags [DF], proto TCP (6), length 52) host.3333 > 192.168.5.1.25: S, cksum 0xf559 (correct), 1939190885:1939190885(0) win 65535 <mss 1460,nop,wscale 1,nop,nop,sackOK>
IP (tos 0x0, ttl 117, id 41413, offset 0, flags [DF], proto TCP (6), length 52) host.3333 > 192.168.5.1.25: S, cksum 0xf559 (correct), 1939190885:1939190885(0) win 65535 <mss 1460,nop,wscale 1,nop,nop,sackOK>
IP (tos 0x0, ttl 117, id 41419, offset 0, flags [DF], proto TCP (6), length 52) host.3333 > 192.168.5.1.25: S, cksum 0xf559 (correct), 1939190885:1939190885(0) win 65535 <mss 1460,nop,wscale 1,nop,nop,sackOK>
arp who-has 192.168.5.1 tell 192.168.5.2
arp reply 192.168.5.1 is-at 00:1c:c0:29:9c:c8
Т.е. роутер пакет внутрь пробрасывает, но назад пакеты не идут, кто мешает?

Если делать запрос изнутри, 192.168.5.1:25 отвечает как положено.

Re: 2 провайдера: setfib + natd ?

Добавлено: 2010-02-08 16:08:48
terminus
вот это покурите - там в конце дополнительный пример как сделать так, чтобы проброс был с обейх:
http://www.lissyara.su/articles/freebsd ... #example_5

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

add 1011 skipto 1040 ip from any to any out xmit fxp0 tagged 1
add 1012 skipto 1060 ip from any to any out xmit fxp0 tagged 2
add 10171 skipto 10180 tag 1 ip from any to any in recv em0
add 10201 skipto 10210 tag 2 ip from any to any in recv em1

Re: 2 провайдера: setfib + natd ?

Добавлено: 2010-02-08 17:51:40
Medison
вот это покурите
Когда пакет входит в файрвол его можно пометить (tag) и пробрасывать дальше в зависимости от правил. Мне кажется, что тут другая ситуация.
У меня перебросом внутрь занимается маршрутизатор. Пакет уже пришел на smtp-сервер и задача состоит в том, чтобы ответ почтового сервера (а не исходный пакет) ушел на альтернативный шлюз, а не на шлюз по умолчанию.

Лучше даже весь трафик падающий на 192.168.5.1 (не только 25 порт) отдавать обратно на альтернативный маршрут (gw2), снова возвращаюсь к fwd?

Re: 2 провайдера: setfib + natd ?

Добавлено: 2010-02-08 18:49:59
terminus
схему нормальную нарисуйте (хотя бы на словах, но подробно), а то у меня в конце рабочего дня телепататор че-то глючит, да и башка уже не варить нихерашеньки - ниче не понял куда 192.168.5.1 и через что.

Re: 2 провайдера: setfib + natd ?

Добавлено: 2010-02-08 20:03:24
Medison
Картина примерно такая (см. вложение).

isp1 - первый провайдер, шлюз по умолчанию
isp2 - альтернативный провайдер (Skilink)
Router - это маршрутизатор (CNU-680 PRO), внутренний ip=192.168.5.2, в нем прописано перебрасывать 25 порт на 192.168.5.1:25

На 192.168.5.1:25 висит smtp сервер, если к нему обращаться из локалки - откликается нормально, если через isp2 - внутрь пакеты залетают, а обратно похоже идут не к isp2, а к isp1 (маршрут по умолчанию) - в этом проблема.

rc.conf

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

ifconfig_fxp0="inet isp1 netmask 255.255.255.192 media 100baseTX link0 mediaopt full-duplex mtu 1500" # to isp1
ifconfig_fxp1="inet 192.168.1.1 netmask 255.255.255.0 media 100baseTX link0 mediaopt full-duplex mtu 1500" # to local network
ifconfig_em0="inet 192.168.5.1 netmask 255.255.255.0 -rxcsum" # to isp2
firewall

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

ipfw add 00100 pass ip from any to any via lo0

ipfw add 00420 setfib 1 ip from any to any via em0

ipfw nat 1 config log ip gw1 same_ports unreg_only reset
ipfw nat 2 config log ip 192.168.5.1 same_ports reset

ipfw add 05000 nat 1 ip from any to any via fxp0
ipfw add 05010 nat 2 ip from any to any via em0

ipfw add 05050 allow ip from any to any

Для отладки альтернативного выхода в интернет 1 хоста добавлял в файрвол следующее (работает):

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

ipfw add 00410 setfib 1 ip from any to skyhost
ipfw add 00415 setfib 1 ip from skyhost to any

Re: 2 провайдера: setfib + natd ?

Добавлено: 2010-02-08 22:45:39
terminus

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

ipfw add 00420 setfib 1 ip from any to any via em0
на проходе OUT setfib не действует.

Если надо чтобы смтп ходил через второго провайдера, то или переделывать default gateway не второго, или использовать fwd, или запускать смтп сервер с указанием использовать fib 1 (править его скрипт запуска).

Re: 2 провайдера: setfib + natd ?

Добавлено: 2010-02-10 20:15:10
Medison
или использовать fwd
Поскольку smtp постоянно в работе, решил отладить на mpd.
В Router установил переброс порта 1723 на 192.168.5.1:1723

Пробовал так:

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

ipfw add 00100 pass ip from any to any via lo0
ipfw add 00420 setfib 1 ip from any to any via em0

ipfw nat 1 config log ip gw1 same_ports unreg_only reset
ipfw nat 2 config log ip 192.168.5.1 same_ports reset

ipfw add 05000 nat 1 ip from any to any via fxp0
ipfw add 05010 nat 2 ip from any to any via em0

# новое
ipfw add 05038 allow tcp from any to 192.168.5.1 1723 in
ipfw add 05039 fwd 192.168.5.2 tcp from 192.168.5.1 1723 to any out

ipfw add 05050 allow ip from any to any
- tcpdump показывает, что на 192.168.5.1:1723 пакеты приходят, а обратно не уходят :(

Re: 2 провайдера: setfib + natd ?

Добавлено: 2010-02-12 13:15:10
Medison
или запускать ... с указанием использовать fib 1 (править его скрипт запуска)
fib 1 тоже не работает, пробовал так:

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

setfib 1 /usr/local/sbin/mpd5 -b -d /etc/mpd -f mpd1.conf -p /var/run/mpd1.pid
firewall прежний:

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

ipfw add 00100 pass ip from any to any via lo0
ipfw add 00420 setfib 1 ip from any to any via em0

ipfw nat 1 config log ip gw1 same_ports unreg_only reset
ipfw nat 2 config log ip 192.168.5.1 same_ports reset

ipfw add 05000 nat 1 ip from any to any via fxp0
ipfw add 05010 nat 2 ip from any to any via em0

ipfw add 05050 allow ip from any to any

Re: 2 провайдера: setfib + natd ?

Добавлено: 2011-11-03 8:49:19
smoul
Я так понимаю, за год ничего не изменилось? И в свежих версиях freebsd ничего не изменилось?
#uname -a
FreeBSD alpha.skylink.local 8.2-RELEASE FreeBSD 8.2-RELEASE #0: Sun Sep 4 04:31:56 NOVST 2011 admin@:/usr/src/sys/i386/compile/NAT i386
#setfib 1 netstat -rn
Routing tables

Internet:
Destination Gateway Flags Refs Use Netif Expire
default 172.20.0.1 UGS 0 65 re1
127.0.0.1 link#6 UH 0 0 lo0
172.20.0.0/24 link#3 U 26 65 re1
192.168.2.0/24 link#1 U 33 36 alc0
192.168.50.0/24 link#2 U 0 34 re0
#setfib 0 netstat -rn
Routing tables

Internet:
Destination Gateway Flags Refs Use Netif Expire
default 192.168.2.1 UGS 174 15902990 alc0
127.0.0.1 link#6 UH 0 12172 lo0
172.20.0.0/24 link#3 U 63777 44983038 re1
172.20.0.211 link#3 UHS 0 186 lo0
192.168.2.0/24 link#1 U 5521373 5657864 alc0
192.168.2.2 link#1 UHS 0 0 lo0
192.168.50.0/24 link#2 U 99 162856206 re0
192.168.50.9 link#2 UHS 0 55923 lo0

#ipfw list

00100 allow ip from any to any via lo0
01010 setfib 1 ip from any to 81.1.192.3
01020 setfib 1 ip from 81.1.192.3 to any
05200 fwd 192.168.2.1 ip from 192.168.2.2 to any
06100 allow ip from any to any via alc0
06200 allow ip from any to any via re0
07100 fwd 172.20.0.1 ip from 172.20.0.211 to any
07200 nat 1 ip from any to any via re1
07300 allow ip from any to any via re1

ping 81.1.192.3 идет всегда по setfib 0
setfib 0 traceroute 81.1.192.3 показывает маршрут
setfib 1 traceroute 81.1.192.3 НЕ показывает маршрут!

ситуация точно такая же. Несмотря на правила 01010 и 01020 пакеты всегда уходят на setfib 0

Re: 2 провайдера: setfib + natd ?

Добавлено: 2012-01-18 20:46:27
Dyr
У меня работает.

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

#ipfw list
00010 allow ip from any to any via lo0
00021 check-state
00030 setfib 1 ip from any to any via vlan500 keep-state
00032 setfib 1 ip from 10.1.128.0/17 to any keep-state
00033 setfib 1 ip from 212.xx.199.248/29 to any keep-state
00034 setfib 1 ip from any to 212.xx.199.248/29 keep-state
...
00096 skipto 275 ip from 94.xx.27.0/24 to not me in
00251 netgraph 251 ip from any to me recv vlan720 // Inside NAT
00252 netgraph 252 ip from any to 212.xx.199.251 recv vlan500 // Inside NAT for RosTelecom
00273 netgraph 273 ip from any to any via vlan720 // Netflow
00275 netgraph 273 ip from any to any via vlan500 // Netflow for RosTelecom
00400 pipe tablearg ip from any to table(4) xmit vlan100
00401 pipe tablearg ip from table(5) to any xmit vlan720
00402 pipe tablearg ip from table(5) to any xmit vlan500
00501 netgraph 501 ip from 10.1.0.0/16 to any xmit vlan720 // Outside NAT
00502 netgraph 502 ip from 10.1.0.0/16 to any xmit vlan500 // Outside NAT for RosTelecom
00700 allow ip from me to any xmit vlan720
00700 allow ip from me to any xmit vlan500
00999 allow ip from table(1) to any
00999 allow ip from any to table(1)
01400 allow ip from any to any established
65530 deny log logamount 100 ip from any to any
65535 allow ip from any to any
Для половины локалки работает один канал, для половины - другой. setfib 0 и setfib 1 traceroute с сервера исправно показывают разные маршруты.