LinuxForum.Fans
Тема

openSUSE шлюз и маршрутизатор для 3 каналов интернет

Автор: Elrik12 37 сообщений 21274 просмотров
#297

Добрый день много уважаемые пользователи ос семейства linux. Мой вопрос может показаться слегка избитым ведь сколько было сказано написано и объяснено про SUSEfirewall2. Но мой вопрос относится к актуальной и очень болезненной теме. На предприятии имеется 3 интернет канала :
1 из них отвечает за доступ в интернет руководства предприятия и отделов типа бухгалтерии и кадров в общем 40-50 ПК .
2 канал отвечает за доступ в интернет (назовем вторичный отдел) вторичных отделов 50-60 ПК
3 канал отвечает за доступ к обще образовательным и государственным ресурсам интернета
На каждый канал по отдельности поднять Шлюз не составляет особого труда но как можно совместить все три канала на 1 сервере и как указать каким юзверям ходить в интернет, через какой канал. На Сервере установлена операционная система openSUSE 10.3 имеются 4 сетевых интерфейса.

#332

Очень интересная тема... Не пойму немного про каналы... 3 канала это 3 разных провайдера? отделы в разных подсетях?

#340

Да вы абсолютно правы я это немножко упустил((( предприятие имеет 3 канала интернет. подсети в сети подняты например для бухгалтерии своя подсеть для расчетного отдела своя подсеть итд.

#343

Я бы предложил поднять 3 виртуальных машины с проксёй и каждую посадить на свой канал.

#347

Уважаемый Loky я это очень прекрасно понимаю Задумка такая поднять 3 виртуальные машины на XEN с на стройками для каждой группы пользователей но вот вопрос как настроить чтобы с 1 внутреннего интерфейса это разруливалось на три я так понимаю придется также поднимать шлюз с маршрутизацией на три виртуальных шлюза.

#469

но если не ошибаюсь, одна сетевая карта не может быть в разных подсетях? следовательно если 3 сетевухи смотрят в интернет, то и на отделы должно смотреть тоже 3 сетевухи... итого, потребуется 6 сетевых карт? а вот реально ли это реализовать?

#476
Elrik12 написал:
Уважаемый Loky я это очень прекрасно понимаю Задумка такая поднять 3 виртуальные машины на XEN с на стройками для каждой группы пользователей но вот вопрос как настроить чтобы с 1 внутреннего интерфейса это разруливалось на три я так понимаю придется также поднимать шлюз с маршрутизацией на три виртуальных шлюза.

Ничего не мешает тебе одну сетевух раздать трём виртуальным машинам в режиме bridge.
Только вот xen для этого слабо подходит. К сожалению у него совершенно идиотское управление сетями. Поищи другой гипервизор.

#516

Например, можно попробовать KVM. По крайней мере, проблем с bridge'м не было пока.

#702

Окститесь!!! Какие виртуальные машины! Есть такая приблуда (уже в комплекте) iproute2 называется.
Суть технологии примерно такова. (в дополнение к включению NAT и маршрутизации с помощью SUSE firewall)
1. Создаем дополнительные таблицы маршрутизации для всех своих внешних интерфейсов.
2. Привязываем пакеты из внутренней сети (по ip адресу или по типу трафика) к определенной таблице.
В результате каждый ходит в инет через то соединение, которое нам надо.
Подробности внимательно читаем здесь, здесь и здесь

#1613

UTiM конечно же в будущем когда времени будет чуток побольше на самообразование я естественно освою инструменты такие как iptables и iproute2. Но по крайней мере на ближайшие месяца 3-4 нужно срочно поднять шлюз. по этому хочется более освоить инструмент который в некотором роде уже осваивается а уже потом приниматься изучать более классические решения.

Hrafn не могли бы вы более подробней описать гипервизор Kernel-based Virtual Machine (KVM) о его настройке и запуске в системе openSUSE. Все что нарыл в интернете сводится к не скольким строчкам :
MODULES_LOADED_ON_BOOT=”kvm kvm-intel” добовление в /etc/sysconfig/kernel обеспечивает загрузку модулей при старте системы kvm и kvm-intel (для AMD будет kvm-amd)
qemu-kvm --hda --no-acpi vdisk.img --cdrom XP.ISO --boot d --m 1024 эта строчка насколько я понял под монтирует iso образ с выключеным режимом ASPI
qemu-kvm --hda vdisk.img --cdrom XP.ISO

--boot c --m 1024
эти строки отвечают за загрузку с нашего как я понял виртуального диска для продолжения установки после текстовой инсталляции.
qemu-kvm --hda vdisk.img --cdrom /dev/cdrom --boot c --m 1024 Эта строка после инсталляции загружает операционную систему и монтирует обычный привод cdrom.
Но я не нашёл как создается виртуальные жёсткие диски ни как настраивается этот гипервизор ни как определяются какие устройства будут задействованы в установленной системе.

Уважаемый Loky не могли бы вы посоветовать тот гипервизор который бы наиболее подходил к моей проблеме И в довесок написать не большое руководство как настраивается bridge с маршрутизацией на несколько каналов.

Заранее с благодарностью всем Elrik.

#1635
Elrik12 написал:
UTiM конечно же в будущем когда времени будет чуток побольше на самообразование я естественно освою инструменты такие как iptables и iproute2. Но по крайней мере на ближайшие месяца 3-4 нужно срочно поднять шлюз. по этому хочется более освоить инструмент который в некотором роде уже осваивается а уже потом приниматься изучать более классические решения.

Можете меня обозвать троллем, но я не могу спокойно смотреть на это перректальное удаление гландов. Какие 3-4 месяца!!! Изучать iptables вам необязательно, в SUSE есть SuseFirewall, пекрасно настраиваемый через Yast. Вам только надо туда зайти и последовательно указать:
1. Какие интерфейсы у вас внешние, а какие внутренние.
2. Включить трансляцию/маскарадинг на внешних интерфейсах
3. Указать, какие внутренние сети маскарадить (фактически разрешить им выход в инет)
Все займет пять минут. Ходить правда все будут только через один шлюз - по умолчанию.
Далее читаем по тем ссылкам, что я вам дал - там все про iproute2, но с разной степенью детализации (самое трудное - отсеять лишнюю информацию - которая на самом деле не лишняя - а просто пока ненужна). У такого "тугодума" как я это заняло пару часов с параллельным производством опытов в командной строке. В результате - родил скрипт (типа как в третьей ссылке), который создает доп. таблицы маршрутизации со своими шлюзами и делает привязку внутренних сетей (по IP) к этим таблицам. К сожалению старый форум на данный момент не доступен, там мешок данных по данной теме, в том числе и от уважаемого Loky - про SuseFirewall (или сдесь Loky не настоящий? :cool: ) Реанимируют - дам ссылки.

#1758

:D UTiM а можно допустим запустить не 1 фаервол 1 сквид а скажем несколько (не затрагивая виртуализацию) чтобы можно было настроить для каждого канала свой шлюз и свой прокси в моей ситуации это было бы просто замечательно так как для меня бы упростилось бы управление пользователей ходящих в интернет. да и большое тебе спасибо за ссылки на описание iproute2 и iptables !

#1794

По сути вам всего-лиш надо:

Elrik12 написал:
:D ... настроить для каждого канала свой шлюз ...

Плодить сквиды и фаерволы для каждой подсети отдельно нет необходимости, они и в единственном числе "понимают", что подсети и пользователи могут быть разные - каждая со своим набором правил. Кстати - "голый" сквид вам может понадобиться только для кесширования трафика (что для современных каналов не актуально) или резки трафика по url. Для авторизации, комфортного подсчета трафика, управления пользователями и просмотра статистики вам все равно к нему надо будет прикручивать дополнительные приблуды (типа SAMS). Возможно, вам этого и ненужно. Я просто не знаю степени вашего "незнания" на данном этапе. Лучше двигаться от простого к сложному. На первом этапе достаточно SuseFirewall и iproute. Далее можно в эту цепочку включить сквид в качестве прозрачного прокси - (кесшируем и режем по url) - далее - по требованию. Кстати, на iptables я вам ссылок не давал, iptables-сом рулит SuseFirewall. Метить пакеты iptables-ом по типу трафика, как в первой ссыке, вам (пока) не нужно, нужно понять принцип и всего-лиш указать командами iproute к какой таблице маршрутизации какие подсети привязываются (третья ссылка). Суть минимальных и достаточных телодвижений с SuseFirewall я вам изложил в предыдущем посте. Если возникнет потребность рулить SuseFirewall "по взрослому" - вот ссылка - там в тексте есть ссылки на более подробную информацию на русском. Однако боюсь - с непривычки запутаетесь. Вот ссылка -пример по настройке iproute для двух интерфейсов. Так что пытайтесь что-нибудь сделать сами и задавайте наводящие вопросы...

BigKvak написал:
но если не ошибаюсь, одна сетевая карта не может быть в разных подсетях? следовательно если 3 сетевухи смотрят в интернет, то и на отделы должно смотреть тоже 3 сетевухи... итого, потребуется 6 сетевых карт? а вот реально ли это реализовать?

Внутрь достаточно и одной сетевухи, но с тремя IP адресами из каждой подсети. У меня даже "круче" на одном (из нескольких) внешних интерфейсов сидят два внешних канала с разными IP (естественно - от одного провайдера).

#2936

Utim насколько я понял из предоставленных статей этот скрипт есть сама основа маршрутизации между двумя интернет каналами. При его адаптации под свои нужды присвоения прав запуска и запустив. Вы водит вот такую штуковину:
linux-r8ir:~ # /etc/init.d/route
+ IP_LOCAL=192.162.1.1
+ IP_INET1=10.110.3.16
+ IP_INET2=192.162.2.1
+ IF_LOCAL=eth2
+ IF_INET1=eth0
+ IF_INET2=eth1
+ NET_LOCAL=192.162.1.0/24
+ NET_INET1=10.110.3.0/24
+ NET_INET2=192.162.2.0/24
+ GW1=10.110.3.253
+ GW2=192.162.2.1
+ ip route flush table T1
+ ip route flush table T2
+ ip route add 10.110.3.0/24 dev eth0 src 10.110.3.16 table T1
+ ip route add 192.162.1.0/24 dev eth2 table T1
+ ip route add 192.162.2.0/24 dev eth1 table T1
+ ip route add 127.0.0.0/8 dev lo table T1
+ ip route add default via table T1
Error: an inet address is expected rather than "table".
+ ip route add 192.162.2.0/24 dev eth1 src 192.162.2.1 table T2
+ ip route add 192.162.1.0/24 dev eth2 table T2
+ ip route add 10.110.3.0/24 dev eth0 table T2
+ ip route add 127.0.0.0/8 dev lo table T2
+ ip route add default via table T2
Error: an inet address is expected rather than "table".
+ ip route add 10.110.3.0/24 dev eth0 src 10.110.3.16
RTNETLINK answers: File exists
+ ip route add 192.162.2.0/24 dev eth1 src 192.162.2.1
RTNETLINK answers: File exists
+ ip route add default via
Command line is not complete. Try option "help"
+ ip rule delete table T1
+ ip rule delete table T2
+ ip rule delete table T1
+ ip rule delete table T2
+ ip rule add from 10.110.3.16 table T1
+ ip rule add from 192.162.2.1 table T2
+ ip rule add fwmark 10 table T1
+ ip rule add fwmark 20 table T2
+ ip route flush cache
+ exit 0

Вот а скрипт который также приведен в той статье после адаптации и тестирования вы водит вот такую фигню:

linux-r8ir:~ # /etc/init.d/iptables
+ IP_LOCAL=192.162.1.1
+ IP_INET1=10.110.3.16
+ IP_INET2=192.162.2.1
+ IF_LOCAL=eth2
+ IF_INET1=eth0
+ IF_INET2=eth1
+ NET_LOCAL=192.162.1.0/24
+ NET_INET1=10.110.3.0/24
+ NET_INET2=192.162.2.0/24
+ NET_SUB1=192.162.3.0/24
+ NET_SUB2=192.162.4.0/24
+ GW1=10.110.3.253
+ GW2=192.162.2.2
+ IPT=/sbin/iptables
+ /sbin/iptables -t nat -F
/etc/init.d/iptables: line 22: /sbin/iptables: No such file or directory
+ /sbin/iptables -t mangle -F
/etc/init.d/iptables: line 23: /sbin/iptables: No such file or directory
+ /sbin/iptables -t mangle -A PREROUTING -s 192.162.3.0/24 -d '!' 192.162.1.0/24 -j MARK --set-mark 10
/etc/init.d/iptables: line 25: /sbin/iptables: No such file or directory
+ /sbin/iptables -t mangle -A PREROUTING -s 192.162.4.0/24 -d '!' 192.162.1.0/24 -j MARK --set-mark 11
/etc/init.d/iptables: line 26: /sbin/iptables: No such file or directory
+ /sbin/iptables -t nat -A POTROUTING -m mark --mark 10 -j MASQUERADE
/etc/init.d/iptables: line 28: /sbin/iptables: No such file or directory
+ /sbin/iptables -t nat -a POTROUTING -m mark --mark 11 -j MASQUERADE
/etc/init.d/iptables: line 29: /sbin/iptables: No such file or directory
+ exit 0


помогите разобраться где я делаю ошибку и где находится действующий путь к iptables как показала практика (/sbin/iptables) несуществующий.

#2940

На старом форуме я задавал подобный вопрос. Помог пользователь LU™, предложив для прочтения замечательный документ:

#2942

Спасибо большое сейчяс пойдем курить мануалку )!

хм этот Мануал как бы вам сказать чуть не подходит под мою проблему :( !

#3005

я организовывал с двумя каналами, прикрутить 3-ий несложно, принцип понятен, как делал - http://terset.livejournal.com/
Только непонятно, при чем тут Susefirewall, дело ведь в роутинге, и отвечает за роутинг ip route, + /etc/iproute2/rt_tables

#3018
Elrik12 написал:

+ ip route add default via table T1
Error: an inet address is expected rather than "table".

Тонкий намек, что слово table - не ip- адрес. В скрипте ошибка - там далее в комментах это сказано.
Второй скрипт - с маркировкой пакетов через iptables - вообще не про вас пока...
А в файл /etc/iproute2/rt_tables - имена доп.таблиц внесли?

Короче, вот вам пример реально работающего скрипта (для простоты понимания - на два интерфейса) с подробными комментариями. Айпишники и звездочки - заменить на свое. Однако рекомендую, прежде, чем драть скрип и адаптировать под себя - все таки уяснить суть и поиграться с командами в командной строке...

text

#!/bin/sh
# имеем двух провайдеров C(кабель) и S(стрим)
# таблицы созданы заранее в файле /etc/iproute2/rt_tables
# а именно добавлены строки (цифра - перед именем - просто синоним):
# 300 inet_strim
# 400 inet_cable
#
#Присваиваем имена таблиц переменным - для удобства
TC="inet_cable"
TS="inet_strim"

IP_LOCAL="192.168.1.128" # адрес маршрутизатора-шлюза в локальной сети. IP_INET_C="**.***.***.***" # адрес нашего маршрутизатора в сети C. IP_INET_S="***.***.***.***" # адрес нашего маршрутизатора в сети S.

IF_LOCAL="eth0" # имя интерфейса на локальную сеть IF_INET_C="eth4" # имя интерфейса на провайдера C. IF_INET_S="eth5" # имя интерфейса на провайдера S.

NET_LOCAL="192.168.1.0/24" # локальная сеть.- здесь одна -а может быть и много NET_INET_C="***.***.***.***/**" # адрес сети в которой гейт нашего C провайдера. NET_INET_S="***.***.***.***/**" # адрес сети в которой гейт нашего S провайдера.

GW_C="***.***.***.***" # гейт C провайдера. GW_S="***.***.***.***" # гейт S провайдера.

NS_S_1="212.188.4.10" # DNS Stream NS_S_2="195.34.32.116" # DNS Stream NS_C_1="***.***.***.***" # DNS Cable NS_C_2="***.***.***.***" # DNS Cable

#обнуляем таблицы - на случай рестарта ip route flush table $TC ip route flush table $TS

#добавляем маршруты

#для С ip route add default via $GW_C dev $IF_INET_C table $TC #шлюз - маршрут по умолчанию ip route add $NET_INET_C dev $IF_INET_C table $TC #провайдер ip route add $NET_LOCAL dev $IF_LOCAL table $TC #локалка ip route add "127.0.0.0/8" dev "lo" table $TC #сам #для S ip route add default via $GW_S dev $IF_INET_S table $TS #шлюз - маршрут по умолчанию ip route add $NET_INET_S dev $IF_INET_S table $TS #провайдер ip route add $NET_LOCAL dev $IF_LOCAL table $TS #локалка ip route add "127.0.0.0/8" dev "lo" table $TC #сам

#в дефолтную таблицу маршрутизации #Маршруты для провайдерских ДНС - чтоб знал, через какие интерфейсы к ним ближе ходить!

ip route add $NS_S_1 dev $IF_INET_S ip route add $NS_S_2 dev $IF_INET_S ip route add $NS_C_1 dev $IF_INET_C ip route add $NS_C_2 dev $IF_INET_C

#удаляем старые правила (привязки сетей к таблицам) на случай перезапуска скрипта (циклом!) PRF='null' for RULE in $(ip rule list) ; do if [ $PRF = 'from' ] && [ $RULE != 'all' ] ; then ip rule del from $RULE fi PRF=$RULE done

#добавляем правила (приписываем сети и сервера к таблицам маршрутизации) ip rule add from $NET_LOCAL table $TS #наша локалка вся - к стриму ip rule add from "192.168.1.1" table $TC #серваки и блатных - к кабелю #...................................

# Только если из внешних сетей обращаются к ресурсу на шлюзе: суть из какого интерфейса пакет пришел-туда ответит шлюз #все пакеты пришедшие с ip адреса провайдера C маршрутизировать по таблице TC #ip rule add from $IP_INET_C table $TC #все пакеты пришедшие с ip адреса провайдера S маршрутизировать по таблице TS #ip rule add from $IP_INET_S table $TS

#сбрасываем кеш ip route flush cache

exit 0

terset написал:
я организовывал с двумя каналами, прикрутить 3-ий несложно, принцип понятен, как делал - http://terset.livejournal.com/
Только непонятно, при чем тут Susefirewall, дело ведь в роутинге, и отвечает за роутинг ip route, + /etc/iproute2/rt_tables

Роутинг вы настроили - теперь понятно КАК должны ходить пакеты, но кто ж их туда пустит без разрешения? В Susefirewall вы включаете маскарадинг, и говорите кому и куда можно ходить...

#3026
UTiM написал:
А в файл /etc/iproute2/rt_tables - имена доп.таблиц внесли?

да разумеется внес как и было предложено в статье!

Спасибо UTiM скрипт очень читабельный благодаря вашим комментариям !!!
Все очень понятно разжованно и расставлено по полочкам теперь пойду экспериментировать!!!

#127664

Оч. понравилось обсужденеи на форуме - пишу свою проблему:

Имеем: шлюз с тремя сетевыми интерфейсами на openSUSE linux 11.3 (32bit). Два внешних смотрят в интернет (два разных провайдера). Внутренний интерфейс смотрит в локальную сеть. Также на шлюзе поднят squid (v3.0.STABLE25) и suseFirewall. Первый провайдер выдает адреса через DHCP, у второго - внешний IP.
Необходимо: http-запросы из локалки в зависимости от ip-шников юзеров пересылать через squid либо к одному провайдеру, либо к другому.
Ознакомившись с темой принял решение делать маршрутизацию через ip на одном squid'е.
Для этого создал две дополнительные таблицы маршрутизации provider_1 и provider_2. Прописал таблицы в /etc/iproute2/rt_tables. Указал маршруты к соответствующим сетям, указал правила для маршрутизации, написал скрипт в автозагрузку (/etc/init.d/after.local). В squid'е прописал acl и указал "tcp_outgoing_address" и "server_persistent_connections off" как и рекомендуют. В suseFirewall'е включил роутинг и маскарадинг.
Но… При попытке обращения к любому сайту через любого провайдера выдается сообщение что не удается определить ip-адрес источника:
===========================
"ERROR
The requested URL could not be retrieved

The following error was encountered while trying to retrieve the URL: http://www.google.ru/

Unable to determine IP address from host name "www.google.ru"

The DNS server returned:
Server Failure: The name server was unable to process this query.
==========================

Сетевые параметры:

Провайдер 1 (DHCP):
IP: 10.8.5.14
Mask: 255.255.0.0
Gate: 10.8.0.1
DNS1: 10.8.0.101
DNS2: 192.168.10.101
DNS3: 192.168.10.102

Провайдер 2 (Manual):
IP: 80.242.156.56
Mask: 255.255.255.252
Gate: 80.247.156.55
DNS1: 192.8.128.130
DNS2: 192.8.128.137

Содержимое скрипта (адаптировано для перезапуска):
==========================
#!/bin/sh
#Manual policy routing for 2 internet providers
#
ip route flush table provider_1
ip route flush table provider_2
#
ip route add default via 10.8.0.1 table provider_1
ip route add default via 80.242.156.55 table provider_2
#
ip route add 10.8.0.0/16 dev eth1 src 10.8.5.14 table provider_1
ip route add 80.242.156.56/30 dev eth2 src 80.242.156.56 table provider_2
#
ip route add 195.8.128.130 dev eth2
ip route add 195.8.128.137 dev eth2
ip route add 10.8.0.101 dev eth1
ip route add 192.168.10.101 dev eth1
ip route add 192.168.10.102 dev eth1
#
ip route add 192.168.0.0/24 dev eth0 table provider_1
ip route add 192.168.0.0/24 dev eth0 table provider_2
#
ip rule del table provider_1
ip rule del table provider_2
#
ip rule add from 10.8.5.14 lookup provider_1
ip rule add from 80.242.156.56 lookup provider_2
#
ip route flush cache
==========================

В squid'е прописано:
==========================
http_port 192.168.0.10:3128

acl prov_1 src 192.168.0.15-192.168.0.32
acl prov_1 src 192.168.0.44-192.168.0.128

tcp_outgoing_address 10.8.5.14 prov_1
tcp_outgoing_address 80.242.156.56 prov_2

server_persistent_connections off
==========================

В suseFirewall'е включен роутинг и маскарадинг:
FW_ROUTE="yes"
FW_MASQUERADE="yes"
FW_MASQ_DEV="zone:ext"
FW_MASQ_NETS="192.168.0.0/24"

Не могу понять в чем дело. Все форумы перерыл. Люди пишут у них все работает! Конфиги, вроде, теже у всех. Переписывал скрипт с легкими вариациями на тему "ip route add 127.0.0.0/8 dev lo table provider_1" [provider_2] – добавление локального маршрута в таблицу первого/второго провайдера; "ip route add 195.8.128.130 dev eth2 table provider_2", " ip route add 10.8.0.101 dev eth1 table provider_1" – помещал DNS'ы из основной таблицы main в таблицы к провайдерам. Но это также ничего не дало.
В логах файрвола ничего криминального не обнаружил. На всякий случай пробовал отключать: rcSuSEfirewall2 stop – без результата.
Что самое интересное: по отдельности каналы работают. Т.е. если вставить один кабель в сетевуху и указать дефолтный шлюз в таблице main (именно в main!!!) – все живет прекрасно! Такое впечатление, что не обрабатываются дополнительные таблицы маршрутизации provider_1 и provider_2 (или криво обрабатываются как-то...).
Судя по сообщениям браузера есть проблемы с DNS. Но почему squid не может определить DNS-сервера – это вопрос. Кстати, в /etc/resolve.conf nameserver'ы прописаны, а squid оттуда должен считывать. Логи squid'а тоже малоинформативны - ничего не нашел.
Приветствуется любая помощь!

P.S.
Насчет DHCP – пока прописываю IP вручную, далее думаю через алиасы привязывать.

Войдите или зарегистрируйтесь, чтобы ответить.