Титла: Малко по-задълбочено за рутацията на нет Публикувано от: boby_to в Nov 12, 2006, 19:04 Здравейте. Имам малко въпросчета
![]() Благодаря ви предварително. Извинявам се ако вече е писано по тази тема но аз не можах да открия нищо. Титла: Малко по-задълбочено за рутацията на нет Публикувано от: kennedy в Nov 12, 2006, 20:06 Искаш да направиш следното:
Имаш нет по лан на твоя компютър. Добавяш още един абонамент който искаш да ползваш на друг компютър който е зад твоя някъде в лана, но искаш да бъде с "реалното" ИП на 2-я абонамент. Правилно ли съм разбрал? Титла: Малко по-задълбочено за рутацията на нет Публикувано от: Hapkoc в Nov 12, 2006, 20:37 Единия вариант е да вържеш кабела от доставчика ти в един и същи комутатор като кабелите от двете машини и просто на всяка да настроиш въответния IP адрес.
Другия вариант е да правиш SNAT/DNAT от/към тази машина. Горе долу така: iptables -t nat -A POSTROUTING -s $MACHINE2_LOCAL_ADDR -d ! $LOCAL_NET -j SNAT --to $MACHINE2_GLOBAL_ADDR iptables -t nat -A PREROUTING -d $MACHINE2_GLOBAL_ADDR -j DNAT --to $MACHINE2_LOCAL_ADDR MACHINE2_LOCAL_ADDR е адреса на втората машина в рамките на локалната ти мрежа. MACHINE2_GLOBAL_ADDR е въпросния втори публичен (а не "реален") адрес, който ти дава доставчика ти. LOCAL_NET е CIDR адреса на локалната ти мрежа (от вида 192.168.1.0/24). (забележка: тези правила би трябвало да работят, но са примерни и леко "наивни") За да работи въпросната схема трябва да настроиш втория адрес от доставчика ти на същата мрежова платка като първия. Това може по няколко начина да стане, примерно: ip addr add $MACHINE2_GLOBAL_ADDR dev $EXT_IF където EXT_IF е интерфейса, на който е вързах кабела към доставчика. За да важи тази настройка и след като рестартираш машината трябва да се опише във файл/ове, който/ито е/са зависими от дистрибуцията ти. И още нещо - термин "рутация" не мисля че съществува в българския език, а дори да има, вероятно не означава това, което имаш предвид. Или ползвай жаргонното "рутиране" (на мен не ми допада много, но пък е по-кратко), или ползвай коректния термин - маршрутизиране. Титла: Малко по-задълбочено за рутацията на нет Публикувано от: VladSun в Nov 12, 2006, 20:53 На първата машина:
На втората машина си вдигни нормално PUB_IP_2. ПС: не вдигай второто ип никъде на първата машина. ППС: @Наркос Защо да се прави S/DNAT, когато IP-то е публично? Титла: Малко по-задълбочено за рутацията на нет Публикувано от: Hapkoc в Nov 12, 2006, 23:47 VladSun, при схемата, която предлагаш не се ли получава нещо такова:
inet <---> eth0 [ router ] eth1 <---> [ switch ] <---> eth0 [ pc2 ] router.eth0: public.ip.address.1 router.eth1: private.ip.address.1 pc2.eth0: public.ip.address.2 Ако правилно съм разбрал ми се струва, че ще трябва поне да се укаже безкласова маршрутизация на pc2 към private.ip.address.1. Нещо от рода на: route add default gw private.ip.address.1 dev eth0 Иначе не се сещам как pc2, нямайки адрес в рамките на частната мрежа, ще се сети да прати пакетите обратно към маршрутизатора. Може нещо да пропускам де. Титла: Малко по-задълбочено за рутацията на нет Публикувано от: gat3way в Nov 13, 2006, 00:19
Това няма да свърши работа според мен. Пакетите от втората машина ще достигат докъдето трябва, но обратното не. Ще обясня защо. Нека машината с PUB_IP_2 се опита да установи TCP сесия с yahoo.com. Праща си SYN пакета със source addr - PUB_IP_2, първата машина го forward-ва, оттам нататък по веригата рутери SYN пакетът достига до yahoo.com. От yahoo се изпраща очакваният от втората машина SYN-ACK. Той пътува обратно по веригата рутери стигайки до пред-пред-последният hop - рутер на ISP-то. Оттам следва интересното. Според рутинг таблицата му PUB_IP_2 е адрес, който се води в един етернет сегмент с този в който е един от интерфейсите на рутера (както PUB_IP_1). Следва логично рутера да провери в ARP таблицата си отговаря ли някои MAC адрес на PUB_IP_2. Тъй като няма как да отговаря,защото в действителност те не са в един етернет сегмент (между рутера и машината с адрес PUB_IP_2 стои клиентският рутер с адрес PUB_IP_1) - рутерът на ISP-то ще прати ARP заявка за да открие коя е машината с PUB_IP_2. Отговор няма да пристигне и съответно рутерът на провайдъра ще върне ICMP destination unreachable. С tcp сесията дотук.. Има според мен няколко начина това да се реши: Първият: на рутера на доставчика да се сложи един статичен маршрут (route add PUB_IP_2 gw PUB_IP_1). Вторият: разрешаване на proxyarp на първата машина. Трябва да има и включен IP forwarding (echo 1 > /proc/sys/net/ipv4/ip_forward) Третият: Включване на втората машина в суич заедно с външният интерфейс на първата машина и кабелът от доставчика (както предложи Наркос) Четвъртият е най-забавен: ако доставчикът подържа някакъв динамичен рутинг протокол (да речем OSPF) може да се договорите с провайдъра за детайлите за авторизация (ако има) и да се вдигне quagga с OSPF рутиране на първата машина. За само 2 клиентски публични адреса това наистина е убиване на муха с топ, но пък също би разрешило проблема ![]() Титла: Малко по-задълбочено за рутацията на нет Публикувано от: VladSun в Nov 13, 2006, 00:21 @ Наркос
Да, прав си ![]() Точно това имах предвид. Поне на мен ми се струваше ясно, че трябва gateway-а на втората машина да е вътрешният адрес на първата машина. Но ... си абсолютно прав, че това трябваше да се спомене. Имал съм спорове с хора, много по-напред с материала от мен, за това дали е възможно адреса на gateway-a да е извън рамките на мрежата. Тогава спорех въз основа на практически опит, но пак срещах възражения. За да е ясна картинката на boby_to - ето пълната реализация (с малко мързел благодарение на Наркос и gate3way): inet <---> eth0 [ router ] eth1 <---> [ switch ] <---> eth0 [ pc2 ] router.eth0: public.ip.address.1 router.eth1: private.ip.address.1 router: route add -host PUB_IP_2 dev INTERNAL_ETH iptables -A FORWARD -s PUB_IP_2 -j ACCEPT iptables -A FORWARD -d PUB_IP_2 -j ACCEPT echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp ( мерси, gat3way ) pc2.eth0: public.ip.address.2 pc2: default gateway private.ip.address.1 Титла: Малко по-задълбочено за рутацията на нет Публикувано от: VladSun в Nov 13, 2006, 00:25 @Gat3way
мдам, и това за proxyarp го бях забравил - при мен всичките рутери винаги са с включен proxyarp и поради това ми е убягнало в случая. Титла: Малко по-задълбочено за рутацията на нет Публикувано от: gat3way в Nov 13, 2006, 00:34 Vladsun, proxyarp е хубаво нещо
![]() Наркос, няма нужда от такива магии. /proc/sys/net/ipv4/conf/all/arp_ignore =0 на първата машина решава идеално точно този проблем и прави излишни тези магии с "безкласова маршрутизация"...в случая ![]() Машина 1 ще отговаря на вътрешния интерфейс на арп заявки за мак адреса на външния интерфейс. Ако на машина 2 е сложен default gw външния адрес на машина 1 няма да имаш проблем в случая...изпробвал съм го. Това обаче само при горното условие, в противен случай наистина трябва да се правят магии ![]() Въобще, линукския netowrking stack позволява доста неканонични дивни, които нерядко вършат доста полезна работа ![]() |