Как настроить машрутизатор средствами FreeBSD
10 Jun 2011 | Автор: dd |В связи с появившимся в обилии свободным временем могу подтянуть все свои стародавние статейки относительно различных фрёвых сервисов, которые уже лет 6-7 валялись у меня на диске в ожидании когда же до них наконец то дойдут руки, и вот потихоньку это время настало.
Так что не боясь предстать капитаном очевидность в этот раз я распишу как организовать программный маршрутизатор средствами FreeBSD. И хотя писалось все это еще под 4.2, но тем не менее и под 7.4 все эти же рецепты применимы, разве только с той разницей, что все пакеты отличаются версиями с большую сторону. Сказать откровенно, я предпочитаю программные маршрутизаторы за их дешевизну, простоту и быстроту в настройке, поскольку для программного маршрутизатора сгодится любая древняя машинка, главное чтобы в ней была возможность поставить дополнительные сетевухи. При этом программный маршрутизатор отличается от аппаратных аналогов тем, что произведя один раз настройку маршрутизатора вы следующий настроите уже за полчаса, а не будите копаться в мануалах нового для вас агрегата, купленного клиентом с оказией, не понимая почему це фича вдруг оказалась багой. К тому же вменяемый аппаратный маршрутизатор стоит не малых денег и вполне сопоставим по стоимости с хорошим компом, который помимо того что будет с сотни раз мощнее, также при этом сможет, естественно при желании, стать принт-сервером, фаерволом, проксей, поточным антивирем и еще чем угодно, и что самое основное- это решение маштабируемое, то есть добавление нового интерфейса сопряжено с гораздо меньшими затратами, нежели при попытке расширения аппаратного маршрутизатора, главное подобрать материнку с 2-3 слотами под сетевуху, ибо найти две интегрированные не проблема. И естественно формула скорость работы/цена для программного маршрутизатора будет на порядки ниже аппаратного, так как стоимость гигабитного маршрутизатора уже будет сопоставима с покупкой мощного сервера для офиса. Ну это просто вода относительно того за что я люблю программные рутеры, а теперь собственно перейдем к самой настройке маршрутизатора.
Для начала устанавливаем систему FreeBSD 7.4 и настраиваем её в соответствии с нашими требованиями, то есть можно настроить как защищенную систему если она торчит в инет, или служит для защиты серверной фермы от локалки; ну а ленивцы могут ограничиться просто установкой нужных пакетов, если она будет служить просто для маршрутизации пакетов между сетями внутренней сети предприятия.
Собственно для начала имеем две сетки: 192.168.0.0/24 (основная) и 192.168.10.0/24 (дополнительная) которые нам и надо совокупить посредством нашего настроенного сервера FreeBSD, в который мы же загодя воткнули две-три-четыре и более сетевых карт (максимум который у меня прекрасно существовал было 5 сопряженных сетей, не считая вирутальных интерфейсов). Предположим что для сетевых интерфейсов мы выбрали IP адреса: 192.168.0.1 и 192.168.10.1
Смотрим что за интернерфейсы установлены в системе:
# ifconfig
тут нам главное понять какой интерфейс какой, для чего не плохо было бы ознакомиться с чипами карт. Порядок интерфейсов обычно идет от проца к периферии, а у дополнительных интерфейсов в зависимости от нумерации слотов, возрастая от видюхи. Но проверить все это можно эмперическим путем просто воткнув рабочий кабель в систему, посе чего интерфейс перейдет из статуса status: no carrier в status: active. Предположим у нас в системе два интерфейса rl0 и rl1.
Поняв какие интерфейсы будем сопрягать, идем в /etc/rc.conf и добавляем необходимый интерфейс, так как там уже должен присуствовать один из интерфейсов, если в процессе настройки системы FreeBSD мы поднимали сетку.
##### /etc/rc.conf #####
ifconfig_rl0=”inet 192.168.0.1 netmask 255.255.255.0″
ifconfig_rl1=”inet 192.168.10.1 netmask 255.255.255.0″
#####################
Чтобы поднять теперь интерфейс, выполним
# /etc/netstart
Второй интерфейс rl1 ожил и теперь пингуется из подсети 192.168.10.1, но для того чтобы сервер настроить как маршрутизатор необходимо в ядре разрешить пересылку пакетов между пакетами, за что отвечает парметр net.inet.ip.forwarding. Его значение в системе в данный момент:
# sysctl net.inet.ip.forwarding
net.inet.ip.forwarding: 0
где значение 0 означает что маршрутизация запрещена, поэтому для включения функционала маршрутизации, нам необходимо присвоить этому значению 1, для чего выполняем:
# sysctl net.inet.ip.forwarding=1
net.inet.ip.forwarding: 0 -> 1
Теперь настройка маршрутизации завершена и маршрутизатор будет фурычить до перезагрузки системы, после чего значение net.inet.ip.forwarding переключится обратно в 0. Для того чтобы избежать этого добавляем в файл /etc/rc.conf следующую строку:
gateway_enable=”YES”
после чего уже безбоязненно можем перегрузить машину.
При такой схеме наш маршрутизатор будет рутить только сопряженные с ним сети, представленные интерфейсами, или же алиасами на интерфейсах, в том же случае когда у нас в сети уже существуют маршрутизаторы, прикрывающие еще какие то сети, то тогда поднимаем на нашей машине статическую таблицу маршрутизации. Делается это также в файле /etc/rc.conf
##### /etc/rc.conf #####
static_routes=”network1 network2 network3″
route_network1=”-net 10.10.15.0/24 192.168.0.25″
route_network2=”-net 172.168.10.0/24 192.168.0.25″
route_network3=”-net 192.168.168.0/24 192.168.10.111″
#####################
то есть мы задаем названия маршрутов, которые дальше выводим в виде сетки, и внешнего, для нашего маршрутизатора, интерфейса шлюза.
Также в случае использовании настроенного сервера FreeBSD в качестве внутреннего маршрутизатора, необходимо на внешнем шлюзе, заданном для рабочих станций и серверов сети дефолтным маршрутом, поднять маршрутизацию на внутреннюю сеть задав маршрут в 192.168.10.0, через 192.168.0.1. На самом деле тут обычно и возникает самый косячный момент, особенно в случае использования интернет шлюзом аппаратных фаерволов типо D-Link, у которых вроде функционал рутинга имеется, но чтобы настроить удаленный маршрут надо долго и упорно танцевать с бубном, так что гораздо проще для нашего уже настроенного маршрутизатора задать дефолтовым маршрутом интернет-шлюз, а все машины предприятия завернуть на него- это добавит лишний хоп, но уберет проблему настройки маршрутизации на сторонних серверах.
Теги: FreeBSD, Сетевые протоколы, Сети
Автор:Павел на 27 Jun 2011
Пожалуйста объясните мне по подробней вот эти строки:
static_routes=”network1 network2 network3″
route_network1=”-net 10.10.15.0/24 192.168.0.25″
route_network2=”-net 172.168.10.0/24 192.168.0.25″
route_network3=”-net 192.168.168.0/24 192.168.10.111″
Что куда и как заворачивается, просто я во FreeBSD новичек и немного не в курсе… Заранее благодарю!
P.S.: Я так понимаю что 192.168.0.25, 192.168.10.111 – адреса свичей, или компьютеров соединяющих подсети одной локальной сети!? А адрес карточки на маршрутизаторе значение имеет????
[Reply]
anchous Reply:
June 27th, 2011 at 6:54 pm
Эти IP адреса (192.168.0.25, 192.168.10.111 ) адреса сетевых интерфейсов других, имеющихся в сети маршрутизаторов, которые смотрят в сопряженные с вашим рутером сетки.
То есть 0.25 смотрит в сеть 192.168.0.0/24, а 192.168.10.111 в сеть 192.168.10.0/24
[Reply]
Автор:Евгений на 09 Aug 2012
Добрый день! Недавно начал изучение FreeBSD и столкнулся со следующей проблемой(простейший пример маршрутизации описанный вами выше):
FreeBSD-сервер НЕ ВЫПОЛНЯЕТ МАРШРУТИЗАЦИЮ из одной сети в другую!
1. Свежеустановленная FreeBSD 9.0
2. Две сетевые карты em0 em1
3. IP-адреса маски, шлюз по умолчанию, опция gateway_enable, net.inet.ip.forwarding прописаны верно!
4. Ping с сервера в сеть №1 и в сеть №2 идет!
5. Ping с компьютеров на em0 и em1 тоже идет!
А ВОТ PING МЕЖДУ КОМЬЮТЕРАМИ ИЗ СЕТИ №1 и №2 не идет!!! В ЧЕМ МОЖЕТ БЫТЬ БЕДА???
[Reply]
anchous Reply:
August 9th, 2012 at 5:58 pm
приветствую.
судя по вашей ситуации у вас проблема с настройками маршрутизации внутри сети, то есть для какой то сети не корректно прописан дефолтный шлюз и пакеты уходят в молоко, по этой причине у вас пингуют интерфейсы рутера и не далее.
Попробуйте дать трейс и поймете куда уходят пакеты.
[Reply]
Автор:Евгений на 10 Aug 2012
Огромное спасибо за отклик. Tracert к сожалению помочь мне ничем не может. Вот более подробное описание:
- сеть №1 em0 (192.168.1.0/24) в ней PC Win7 (192.168.1.5/24 default gateway 192.168.1.60)
- сеть №2 em1 (192.168.0.0/24) в ней internet-router (192.168.0.1/24), *так же есть и другие компы… которые через этот шлюз выходят в интернет*.
- freebsd 9.0
——- rc.conf———–:
hostname=”FreeBSD1″
defaultrouter=”192.168.0.1″
gateway_enable=”YES”
ifconfig_em0=” inet 192.168.1.60 netmask 255.255.255.0″
ifconfig_em1=” inet 192.168.0.60 netmask 255.255.255.0″
sshd_enable=”YES”
moused_enable=”YES”
dumpdev=”NO”
——- ifconfig ———–:
em0: flags=8843 metric 0 mtu 1500
options=9b
ether 00:0c:29:df:f3:00
inet 192.168.1.60 netmask 0xffffff00 broadcast 192.168.1.255
inet6 fe80::20c:29ff:fedf:f300%em0 prefixlen 64 scopeid 0×2
nd6 options=29
media: Ethernet autoselect (1000baseT )
status: active
em1: flags=8843 metric 0 mtu 1500
options=9b
ether 00:0c:29:df:f3:0a
inet 192.168.0.60 netmask 0xffffff00 broadcast 192.168.0.255
inet6 fe80::20c:29ff:fedf:f30a%em1 prefixlen 64 scopeid 0×3
nd6 options=29
media: Ethernet autoselect (1000baseT )
status: active
——–netstat -rn: ———–
Destination Gateway Flags Refs Use Netif Expire
default 192.168.0.1 UGS 0 0 em1
127.0.0.1 link#7 UH 0 0 lo0
192.168.0.0/24 link#3 U 0 325 em1
192.168.0.60 link#3 UHS 0 0 lo0
192.168.1.0/24 link#2 U 0 22 em0
192.168.1.60 link#2 UHS 0 0 lo0
——————————-
net.inet.ip.forwarding: 1
——————————-
ПИНГ С FREEBSD
ping 192.168.0.1 – OK
ping 192.168.1.5 – OK
——————————-
ПИНГ с WIN7 (192.168.1.5)
ping 192.168.1.60 – OK
ping 192.168.0.60 – OK
ping 192.168.0.1 – FCUK!!! – в смысле НЕТУ!
——————————-
ПИНГ с компов из сети 192.168.0.0 на комп 192.168.1.5 тоже не проходит. (шлюз для компов из этой сети менял на 192.168.0.60)
——————————-
Можно что-то посоветовать?
[Reply]
anchous Reply:
August 10th, 2012 at 2:30 pm
трейс как раз вам и должен был бы помочь, ибо точно бы диагностировал куда идет пакет и где происходит затыка, так как судя по вашей схеме, могу предположить что для машин подсети 192.168.0.0/24 дефолтным шлюзом стоит 192.168.0.1, на котором не прописан маршрут в подсеть 192.168.1.0
[Reply]
Автор:Евгений на 10 Aug 2012
ничего лишнего на систему не устанавливал.. типа фаервола.. ната и тд. система была абсолютно чистая, свежеустановленная… переустанавливал несколько раз… устанавливал и на виртуальной машине и на реальной, с оборудованием всё в порядке.
[Reply]
Автор:Евгений на 10 Aug 2012
********************************
упростил до минимума :
две сети (em0,em1), между ними FreeBSD.
в каждой сети по одному компу, с настройками шлюза на соответствующий интерфейс FreeBSD.
всё что описано выше остается так же.
tracert -d 192.168.1.5
—-
C:\Users\STV>tracert 192.168.1.5
Трассировка маршрута к 5.1.168.192.in-addr.arpa [192.168.1.5]
с максимальным числом прыжков 30:
1 <1 мс <1 мс <1 мс 60.0.168.192.in-addr.arpa [192.168.0.60]
2 * * * Превышен интервал ожидания для запроса.
Из другой сети так же!!!
Что делать???
[Reply]
anchous Reply:
August 10th, 2012 at 6:13 pm
с 9кой не работал, но вроде в ней никаких кардинальных изменений не было, так что все должно рвботать, посему проверяйте синтаксис файлов, маски, и могу посоветовать только шаманить: добавить на дефолтный рутер маршрут в подсеть; убрать со шлюза дефолтный маршрут- посмотреть без него; сменить адресацию второй подсети где один компутер на какую нить вроде 172.16.0.0, отрубить-врубить шлюзование
[Reply]
Автор:Сергей на 13 Oct 2012
Добрый день. Не могли бы помочь.
Сервер одним концом смотрит в 10.114.172.0/24, а другим в 10.114.173.0/24.
———
em0: inet 10.114.172.50 netmask 255.255.255.0
em1: inet 10.114.173.1 netmask 255.255.255.0
IPFW:
————-
cmd=”ipfw -q add”
oif=”em0″
iif=”em1″
oip=”10.114.172.50″
iip=”10.114.173.1″
MyLan=”10.114.173.0/24″
Lan1=”10.114.172.0/24″
Lan2=”10.114.171.0/24″
#netmask=”24″
#netin=”10.114.173.0″
ipfw -q -f flush
$cmd allow ip from $MyLan to $MyLan via $iif
$cmd allow ip from $Lan1 to $MyLan
$cmd allow ip from $MyLan to $Lan1
$cmd fwd 127.0.0.1,3128 tcp from $MyLan to not me 80 in recv $iif
$cmd allow ip from $oip to any out via $oif
$cmd allow ip from any to $oip in via $oif
$cmd allow ip from $MyLan to any in via $iif
$cmd allow ip from $MyLan to any out via $oif
$cmd allow ip from any to $MyLan in via $oif
$cmd allow ip from any to $MyLan out via $iif
————–
С компьютера 10.114.172.35 ping идет в другую сеть, а с 10.114.173.20 теряется на сервере. В чем может быть проблема?
[Reply]
anchous Reply:
October 13th, 2012 at 12:28 pm
приветствую.
попробуйте из сетки пингануть оба интерфейса шлюза, а также трейс- с большой вероятностью проблема в дефолтных маршрутах на конечных хостах, по которым пакеты уходят куда то не туда.
[Reply]