<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Reborn &#187; routing</title>
	<atom:link href="http://www.getoto.net/tag/routing/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.getoto.net</link>
	<description>And from the ashes the Phoenix rose reborn</description>
	<lastBuildDate>Wed, 04 Jan 2012 22:47:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>USB Networking за Nokia N900</title>
		<link>http://www.getoto.net/2010/06/19/usb-networking-za-nokia-n900/</link>
		<comments>http://www.getoto.net/2010/06/19/usb-networking-za-nokia-n900/#comments</comments>
		<pubDate>Sat, 19 Jun 2010 10:22:12 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[hardware]]></category>
		<category><![CDATA[Статии]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[maemo]]></category>
		<category><![CDATA[n900]]></category>
		<category><![CDATA[networking]]></category>
		<category><![CDATA[nokia]]></category>
		<category><![CDATA[routing]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[usb]]></category>

		<guid isPermaLink="false">http://www.getoto.net/?p=128</guid>
		<description><![CDATA[От известно количество време съм собственик на Nokia N900 MID. В цялото словосъчетание като че ли Multimedia Internet Device е важната част, но не отразява дори с малко какво може устройството. Накратко това е по скоро таблет със малко GSM чарколяцо отколкото телефон с браузър. За бонус играчката е доста отворена (по подразбиране си идва [...]]]></description>
			<content:encoded><![CDATA[<p>От известно количество време съм собственик на Nokia N900 MID. В цялото словосъчетание като че ли <strong>M</strong>ultimedia <strong>I</strong>nternet <strong>D</strong>evice е важната част, но не отразява дори с малко какво може устройството.<br />
Накратко това е по скоро таблет със малко GSM чарколяцо отколкото телефон с браузър. За бонус играчката е доста отворена (по подразбиране си идва със шел към нея), базирана е на прилични стандарти и като цяло е готина занимавка.</p>
<h1>Какво ще разглеждаме днес</h1>
<p><a href="http://www.getoto.net/wp-content/uploads/2010/06/nokia-n900-a.jpg"><img class="alignnone size-full wp-image-129" title="Nokia N900 MID" src="http://www.getoto.net/wp-content/uploads/2010/06/nokia-n900-a.jpg" alt="Nokia N900 MID" width="500" height="383" /></a><br />
<strong>Устройство:</strong> Nokia N900<br />
<strong>Хардуер:</strong> ARM A8 Cortex SOC, 256MB RAM, 32GB Internal Flash, 3,5 inch 800&#215;480 touchscreen дисплей, пълна qwerty клавиатура<br />
<strong>Софтуер:</strong> Maemo 5, частично базиран на дебиан (кодово име Fremantle) &#8211; не не е Freemantle, и аз го бърках доста.<br />
<strong>Възможности:</strong> Сърфиране из нета, пощенски клиент, таблет, мултимедийна станция (да поддържа и UPnP и DLNA), четене на документи, чат клиент, фотоапарат, бърза редакция на прости документи, календар и даже телефон. Поглеждайки всичката функционалност достъпна в устройството човек добива чувството че телефона е по скоро сложен защото са има място на платката отколкото че специално са си мислили да го слагат (но пък всеки може да си мисли каквото си иска). Едно от най приятните неща свързани с тази играчка е факта че можете съвсем спокойно да си инсталирате доста прилични количества софтуер, без почти никакъв риск. Ако официалният или community based софтуер не ви достига никой не ви спира да седнете и да си хакнете нещо което на вас ви трябва/харесва. Nokia предоставят всички необходими инструменти за разработка &#8211; включително виртуална машина със всичкия необходим софтуер и емулатор в който да си тествате софтуера който пишете.</p>
<h1>Какво ще правим днес</h1>
<p>Днес ще ви покажа как можете да използвате USB кабела за да се свържете със вашия телефон посредством SSH, да му дадете малко Internet (защото наоколо няма WI-FI а не ви се плаща на българските оператори кожодери) и как да убедите стандартните приложения че има интернет. Платформата върху която ще реализираме цялото упражнение (освен Телефона/Таблета/Играчката) е Ubuntu 9.04 (Jaunty) и Ubuntu 9.10 (Karmic). Все пак разполагам само с това под ръка.</p>
<h1>Как ще протече целият процес</h1>
<ul>
<li>Инсталиране на необходимият софтуер върху устройството</li>
<li>Конфигуриране на USB мрежата от страна на устройството</li>
<li>Конфигуриране на USB мрежата от страна на Компютъра</li>
<li>Конфигуриране на автоматична активация/деактивация на USB мрежата от страна на устройството</li>
<li>Конфигуриране на рутирането от страна на компютъра</li>
<li>Обучаване на стандартните маемо приложения че имат интернет :)</li>
</ul>
<p>Изхождаме от предположението че имате Wi-Fi под ръка. Не че иначе не е постижимо но ще отнеме повечко време и ще е доста неудобно. Въпреки че клавиатурата е удобна за писане, не е най-добрата когато става въпрос за специални знаци и *nix команди.</p>
<h1>Инсталиране на необходимия софтуер върху устройството</h1>
<p>За да си свършим задачките ще ни е необходим малко софтуер. В случая ще ни е необходим root достъп за да променим няколко системни файла. Цялата операция може да се осъществи от самото устройство, но смятам че е по удобно да я свършите с помощта на малко по голяма и удобна клавиатура като тази на вашият компютър/лаптоп.</p>
<p>За целта на занятието ще ни е необходим следният софтуер:</p>
<ul>
<li>rootsh &#8211; за да придобием root достъп от конзолата на устройството (ако изпитаме нужда)</li>
<li>SSH сървър &#8211; налични са OpenSSH и Dropbear &#8211; по ваш избор. Аз лично предпочитам OpenSSH. Намира се в хранилището extras-testing</li>
<li>﻿personal-ip-address &#8211; това е аплет за един от десктопите който ще ви покаже ип адреса на устройството. Това е по скоро удобство</li>
<li>libicd-network-null &#8211; това е модул за мрежовата подсистема който позволява създаване на фалшиви мрежови връзки. Устройството по подразбиране поддържа само wireless и gprs (официално). Намира се в хранилището extras-devel което по подразбиране не е въведено</li>
</ul>
<p>За начало може да инсталирате само SSH сървъра и после останалата част ако прецените че ви е нужна. За да инсталирате SSH сървър е необходимо да добавите хранилището extras тестинг през нормалният пакетен мениджър на Maemo. Докато сте там може да си инсталирате и rootsh &#8211; полезен е. В процеса на инсталация ще бъдете попитани да си въведете новата root парола (без нея няма как да се логнете на играчката).</p>
<p>След като инсталирате софтуера пробвайте да се закачите :) трябва да се случи и вие вече сте root с абсолютни права върху устройството. Бъдете внимателни и не правете нищо лудо (като <strong>rm -rf /</strong>)</p>
<h1>Конфигуриране на USB мрежата от страна на устройството</h1>
<p>Все пак за да можем да имаме мрежа тя трябва да е конфигурирана и от двете страни на кабела. Сега след като вече сте се логнали в устройството е време да се захващаме за работа.</p>
<p>Отворете <strong>/etc/network/interfaces</strong><br />
Там трябва да откриете нещо подобно на:</p>
<pre class="brush: bash; title: ; notranslate">auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
auto usb0
iface usb0 inet static
	address 192.168.2.15
	netmask 255.255.255.0
	gateway 192.168.2.14</pre>
<p>Ако не изглежда така постарайте се и нека заприлича. Важното в случая са редовете след <strong>auto usb0</strong> адреса си го изберете както ви подхожда но го запомнете. Адреса в реда с <strong>gateway</strong> ще ни е необходим малко по късно за другият край на мрежата. Това е една добра конфигурация която ще разширим малко по късно.</p>
<p>Сега е време да изпробвате дали сте направили всичко правилно :)</p>
<pre class="brush: bash; light: true; title: ; notranslate">ifup usb0
ifconfig</pre>
<p>Ако в изхода от <strong>ifconfig</strong> идите нещо подобно на:</p>
<pre class="brush: bash; light: true; title: ; notranslate">usb0      Link encap:Ethernet  HWaddr FE:84:91:74:71:F7
          inet addr:192.168.2.15  Bcast:192.168.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3373 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7065 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:168768 (164.8 KiB)  TX bytes:2344721 (2.2 MiB)</pre>
<p>Всичко работи както би трябвало.</p>
<h1>Конфигуриране на USB мрежата от страна на Компютъра</h1>
<p>След като сте конфигурирали единият край на мрежата време е да конфигурирате и другия :) тоест вашият компютър лаптоп. Последно време започнах да оценявам удобствата на Gnome Network Manager така че ще покажа как се случват работите там.<br />
Първата стъпка е да включите телефона си посредством USB кабела към вашата машина. На въпроса в какъв режим да се представя пред вашият компютър изберете <strong>PC-Suite mode</strong>. След кратко мислене във NetworkManager-а ще се появят две нови устройства. Жична мрежа и GSM модем. Би трябвало да изглежда по подобен начин. (извинявам се но вече при мен е конфигурирано)<br />
<a href="http://www.getoto.net/wp-content/uploads/2010/06/NM-01.png"><img class="alignnone size-medium wp-image-134" title="NM-01" src="http://www.getoto.net/wp-content/uploads/2010/06/NM-01-300x189.png" alt="" width="300" height="189" /></a><br />
Време е да изберете опцията за редактиране на връзки, да изберете вашата връзка (най-вероятно е Auto USB0) и да я конфигурирате, както е показано в следващите две снимки:</p>
<p><a href="http://www.getoto.net/wp-content/uploads/2010/06/NM-02.png"><img class="alignnone size-medium wp-image-135" title="NM-02" src="http://www.getoto.net/wp-content/uploads/2010/06/NM-02-219x300.png" alt="" width="219" height="300" /></a><a href="http://www.getoto.net/wp-content/uploads/2010/06/NM-03.png"><img class="alignnone size-medium wp-image-136" title="NM-03" src="http://www.getoto.net/wp-content/uploads/2010/06/NM-03-218x300.png" alt="" width="218" height="300" /></a><br />
За да проверим дали всичко е наред изключете кабела, включете го отново и изберете пак PC-Suite mode. Едно нещо за което трябва да внимавате е да не променяте мак адреса който е открит от Network Manager-a след малко ще обясним на телефона как да използва винаги него.<br />
Сега вече трябва да можете да пингнете вашият телефон закачен през кабелчето :)</p>
<h1>Конфигуриране на автоматична активация/деактивация на USB мрежата от страна на устройството</h1>
<p>Сега след като вече имаме връзка между компютъра и телефона базирана на USB кабела време е да обучим телефона да не променя тази връзка и да я активира/спира автоматично всеки път когато изберете PC-Suite mode. За целта са необходими няколко стъпки:</p>
<ul>
<li>Обясняване на телефона винаги да използва същият мак адрес за да може връзката да се активира автоматично от страната на компютъра</li>
<li>добавяне на автоматично активиране на интерфейса при влизане в PC-Suite Mode</li>
<li>Добавяне на правилен gateway и рутинг при активиране на интерфейса</li>
<li>автоматично деактивиране на интерфайса при излизане от PC-Suite mode</li>
</ul>
<h2>Обясняване на телефона винаги да използва същият мак адрес за да може връзката да се активира автоматично от страната на компютъра</h2>
<p>Това е необходимо поради причината че при всеки рестарт на телефона мак адреса на usb интерфейса се генерира на ново. И като цяло е винаги различен. Приучаването се състои в дефинирането на опция за кернел модула който се грижи за този мрежов интерфейс (<strong>g_nokia</strong>). Логнете се като root на вашият телефон (това звучи яко) и изпълнете</p>
<pre class="brush: bash; light: true; title: ; notranslate">echo &gt; &quot;options g_nokia host_addr=C6:EB:3E:B7:65:D7&quot; &gt; /etc/modprobe.d/g_nokia</pre>
<p>Или всеки един мак адрес който ви харесва (например: <strong>C0:FF:EE:C0:FF:EE</strong> или <strong>01:23:45:67:89:AB</strong>). Ако сменяте мак адреса ще се наложи да рестартирате телефона за да прихване новата настройка.</p>
<h2>добавяне на автоматично активиране на интерфейса при влизане в PC-Suite Mode</h2>
<p>При избиране на PC-Suite mode от менюто при включване се изпълнява скрипта <strong>/usr/sbin/pcsuite-enable.sh</strong>. За да активираме автоматично интерфейса трябва да добавим в края му необходимите ни команди. Намерете секцията:</p>
<pre class="brush: bash; title: ; notranslate">kill -USR1 $SYNCD_PID
logger &quot;$0: sent SIGUSR1 to syncd&quot;

exit 0</pre>
<p>и я заменете с:</p>
<pre class="brush: bash; title: ; notranslate">kill -USR1 $SYNCD_PID
logger &quot;$0: sent SIGUSR1 to syncd&quot;
ifup usb0
echo &quot;nameserver 8.8.8.8&quot; &gt;&gt; /etc/resolv.conf
echo &quot;nameserver 8.8.4.4&quot; &gt;&gt; /etc/resolv.conf

exit 0</pre>
<p>Реално добавяме 3 команди:</p>
<ul>
<li>ifup usb0 &#8211; автоматично ще вдигне нашият интерфейс</li>
<li>echo &#8222;nameserver x.x.x.x&#8220; &gt;&gt; /etc/resolv.conf &#8211; ще добави допълнителни сървъри за имена към стандартните (направил съм го с цел да се избягнат някои шантави и/или проблемни DNS сървъри. Посочените адреси са публичните DNS сървъри на google. Ако не ви харесват можете да ги замените с други по ваше усмотрение.</li>
</ul>
<h2>Добавяне на правилен gateway и рутинг при активиране на интерфейса</h2>
<p>За да сме сигурни че телефонът няма да сътвори глупости от типа на използване на GPRS за разни глупости ще подменим пътят по подразбиране и gateway-а. За целта добавете в дефиницията за интерфейса в <strong>/etc/network/interfaces</strong></p>
<pre class="brush: bash; title: ; notranslate">	up route del default
	up route add default gw  192.168.2.14</pre>
<h2>автоматично деактивиране на интерфайса при излизане от PC-Suite mode</h2>
<p>При изваждане на USB кабела автоматично се изпълнява скрипта <strong>/usr/sbin/pcsuite-disable.sh</strong> където и ще добавим нашите инструкции за автоматично спиране на интерфейса.<br />
Намерете секцията:</p>
<pre class="brush: bash; title: ; notranslate">logger &quot;$0: do nothing to pass USB certs&quot;

exit 0</pre>
<p>и я заменете с:</p>
<pre class="brush: bash; title: ; notranslate">logger &quot;$0: do nothing to pass USB certs&quot;
ifdown usb0
echo &quot;nameserver 127.0.0.1&quot; &gt; /etc/resolv.conf

exit 0</pre>
<p>Както е видно спираме интерфейса и възстановяваме статуквото с DNS сървърите. След тези операции вече при включване на usb кабела и избиране на PC-Suite mode автоматично ще се вдига интерфейс с настройки да взема интернет от машината за която е закачен, но за съжаление машината за която е закачен все още не знае как да му даде интернет.</p>
<h1>Конфигуриране на рутирането от страна на компютъра</h1>
<p>Колкото и да улеснява Network Manager-а при някои операции (видяхте колко бързо се справи с откриването и разпознаването на телефона) все пак той крие и доста недостатъци. Като факта че част от стандартните парадигми с които е свикнал един системен администратор не работят както се очаква. Стандартният администратор би дефинирал usb0 интерфейса по начин подобен на този за телефонната страна със команди във up клаузата които да пуснат ip_forward и да добавят необходимите iptables правила и ще установи че нещо не се получава &#8230; За да ви спестя заигравките оставаме изцяло в свена на Network Manager-a. Той поддържа възможност за изпълняване на скриптове при определени събития (като включване/изключване на интерфейс и др.)<br />
Създайте следният файл: <strong>/etc/NetworkManager/dispatcher.d/99nokia-n900-routing</strong> със следното съдържание:</p>
<pre class="brush: bash; title: ; notranslate">#!/bin/sh -e
# Script to dispatch NetworkManager events
#
# Runs when NetworkManager fiddles with interfaces.
# Author vvitkov
# ver: 0.1
# based on NM standard dispatcher for ifupdown

if [ -z &quot;$1&quot; ]; then
    echo &quot;$0: called with no interface&quot; 1&gt;&amp;2
    exit 1;
fi

# Fake ifupdown environment
export IFACE=&quot;$1&quot;
export LOGICAL=&quot;$1&quot;
export ADDRFAM=&quot;NetworkManager&quot;
export METHOD=&quot;NetworkManager&quot;
export VERBOSITY=&quot;0&quot;

# Run the right scripts
case &quot;$2&quot; in
    up)
	export MODE=&quot;start&quot;
	export PHASE=&quot;up&quot;

	if [ $IFACE = 'usb0' ] ; then
		iptables -A POSTROUTING -t nat -s 192.168.2.15/32 -j MASQUERADE
		echo 1 &gt; /proc/sys/net/ipv4/ip_forward
	fi

	;;
    down)
	export MODE=&quot;stop&quot;
	export PHASE=&quot;down&quot;

	if [ $IFACE = 'usb0' ] ; then
		iptables -D POSTROUTING -t nat -s 192.168.2.15/32 -j MASQUERADE
		echo 0 &gt; /proc/sys/net/ipv4/ip_forward
	fi

	;;
    pre-up)
	export MODE=&quot;start&quot;
	export PHASE=&quot;pre-up&quot;
	;;
    post-down)
	export MODE=&quot;stop&quot;
	export PHASE=&quot;post-down&quot;
	;;
    *)
	echo &quot;$0: called with unknown action \`$2'&quot; 1&gt;&amp;2
	exit 1
	;;
esac</pre>
<p>Изпълнете отново магическите действия изключване на кабел, включване на кабел, избор на PC-Suite mode и кратко изчакване. Вече от вашият телефон съвсем спокойно трябва да можете да пингвате разни машини в интернет като примерно www.google.com.</p>
<h1>Обучаване на стандартните маемо приложения че имат интернет :)</h1>
<p>Въпреки че телефона има интернет приложенията които идват с него все още не знаят за това. Те разчитат на D-Bus да ги информира за подобни събития и докато не бъдат информирани си мислят че нет няма. Трябва да коригираме това :)<br />
За целта ще добавим нова фиктивна конекция която да активираме при вдигането на usb0 интерфейса на телефонът ни. За да можем да добавим фиктивната конекция ни е необходим пакета <strong>libicd-network-null</strong> който се намира в <strong>extras-devel</strong> хранилището за пакети. Тъй като ще използваме това хранилище само за един пакет не е нужно да го добавяме в стандартният пакетен мениджър.</p>
<ul>
<li>логнете се като root във вашият телефон</li>
<li>добавете в края на <strong>/etc/apt/sources.list.d/hildon-application-manager.list</strong> следният ред <strong>deb http://repository.maemo.org/extras-testing/ fremantle free non-free</strong></li>
<li>обновете списъка с пакети: <strong>apt-get update</strong></li>
<li>инсталирайте необходимият пакет: <strong>apt-get install libicd-network-null</strong></li>
<li>премахнете добавеният ред и обновете списъка с пакетите отново</li>
</ul>
<p>Вече имаме необходимата инфраструктура за създаване на фиктивна мрежова връзка. Изпълнете следното за да я добавите и активирате (на телефона):</p>
<pre class="brush: bash; title: ; notranslate">gconftool-2 -s -t string /system/osso/connectivity/IAP/DUMMY/type DUMMY
gconftool-2 -s -t string /system/osso/connectivity/IAP/DUMMY/name &quot;USBnet&quot;
gconftool-2 -s -t string /system/osso/connectivity/IAP/DUMMY/autoconnect false
killall icd2</pre>
<p>С това дефинираме фиктивна връзка с вътрешен идентификатор <strong>DUMMY</strong> и име <strong>USBnet</strong>.<br />
Единственото което остава да направим е да информирам D-Bus подсистемата при активирането на интерфейса да включи тази връзка и съответно при спирането на интерфейса да я изключи. Това се постига с добавянето на следните 2 реда към <strong>/etc/network/interfaces</strong> в секцията за usb0</p>
<pre class="brush: bash; title: ; notranslate">	up run-standalone.sh dbus-send --type=method_call --system --dest=com.nokia.icd /com/nokia/icd com.nokia.icd.connect string:DUMMY uint32:0
	down run-standalone.sh dbus-send --system --dest=com.nokia.icd /com/nokia/icd_ui com.nokia.icd_ui.disconnect boolean:true</pre>
<h1>Заключение</h1>
<p>Вече вашият телефон може да разполага с интернет посредством usb кабел. Тествайте сами и се убедете.<br />
Част от информацията е взаимствана от: <a href="http://wiki.maemo.org/N900_USB_networking">http://wiki.maemo.org/N900_USB_networking</a><br />
Ако имате въпроси питайте</p>
<p><em>Редакция: Променен е начина на изпълнение за вдигане на USB интерфейса за да позволи <a href="http://www.getoto.net/2011/03/20/modulna-sistema-za-dejstviya-v-pc-suite-rezhim-pri-nokia-n900/">модулно изпълнение на модификации</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.getoto.net/2010/06/19/usb-networking-za-nokia-n900/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>The Perfect SOHO router &#8211; Part 4</title>
		<link>http://www.getoto.net/2009/12/06/the-perfect-soho-router-part-4/</link>
		<comments>http://www.getoto.net/2009/12/06/the-perfect-soho-router-part-4/#comments</comments>
		<pubDate>Sun, 06 Dec 2009 16:57:58 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[Статии]]></category>
		<category><![CDATA[arp]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[default]]></category>
		<category><![CDATA[dhcp]]></category>
		<category><![CDATA[FIN]]></category>
		<category><![CDATA[firewall]]></category>
		<category><![CDATA[iproute]]></category>
		<category><![CDATA[iproute2]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[ipv]]></category>
		<category><![CDATA[masquerade]]></category>
		<category><![CDATA[packets]]></category>
		<category><![CDATA[port]]></category>
		<category><![CDATA[router]]></category>
		<category><![CDATA[routing]]></category>
		<category><![CDATA[secure]]></category>
		<category><![CDATA[simple]]></category>
		<category><![CDATA[soho]]></category>
		<category><![CDATA[TCP]]></category>

		<guid isPermaLink="false">http://www.getoto.net/?p=39</guid>
		<description><![CDATA[След като вече сме инсталирали нашият рутер и сме пуснали някои услуги е време да конфигурираме самият процес на рутиране. Това се постига чрез стандартни инструменти като route, iptables, arp, iproute2.

В тази част ще покажем трите най-популярни варианта за конфигуриране на рутирането.]]></description>
			<content:encoded><![CDATA[<blockquote><p>Това е четвъртата част от серия от статии в които ще обясня как да създадем перфектният SOHO рутер. Държа да отбележа че това е моята идея за рутер със всичките и предимства и недостатъци.</p>
<p>Серията се състои от следните статии:</p>
<ul>
<li><a href="http://www.getoto.net/2009/12/06/the-perfect-soho-router-part-1/">Общи насоки, идеи, нужни услуги и размисли</a> &#8211; тук ще се постарая аргументирано да обоснова защо съм избрал този комплект от софтуер и услуги</li>
<li><a href="http://www.getoto.net/2009/12/06/the-perfect-soho-router-part-2/">Инсталация на базовата система </a>- ще опиша методът по който ще инсталираме и минимизираме нашата система</li>
<li><a href="http://www.getoto.net/2009/12/06/the-perfect-soho-router-part-3/">Конфигуриране на DNS и DHCP услугите</a> &#8211; тук ще опиша обосновано конфигурациите които смятам за оптимални</li>
<li><a href="http://www.getoto.net/2009/12/06/the-perfect-soho-router-part-4/">Конфигуриране на рутирането</a> &#8211; като цяло тук е сърцето на нашият рутер. Ще предложа някои трикове за улесняване на живота, както и насоки към по-специфични задачи</li>
<li><a href="http://www.getoto.net/2009/12/06/the-perfect-soho-router-part-5/">Конфигуриране на елементарна система за наблюдение и статистика</a></li>
<li><a href="http://www.getoto.net/2009/12/06/the-perfect-soho-router-part-6/">Разширяване възможностите на нашият рутер</a> &#8211; ще опиша някои дреболии които могат да направят живота ни много по лесен, удобен и приятен</li>
</ul>
</blockquote>
<p>След като вече сме инсталирали нашият рутер и сме пуснали някои услуги е време да конфигурираме самият процес на рутиране. Това се постига чрез стандартни инструменти като route, iptables, arp, iproute2.</p>
<p>В тази част ще покажем следните варианти:</p>
<ul>
<li>Прост елементарен рутер &#8211; това е най елементарният но за сметка на това не предлага кой знае какви възможности</li>
<li>Рутер който изпълнява NAT/masquerade и firewall функции &#8211; това е може би най-разпространеният вариант.</li>
<li>Рутер който изпълнява баланс на трафика от два или повече доставчика &#8211; това вече е по-напреднала тема но въпреки всичко има полза от нея.</li>
</ul>
<p>Примерите и конфигурациите ще са доста опростени като ще покажем само скелета на системата, тъй като всеки има различни изисквания. В края на статията ще дам малко връзки с допълнителна информация за четене и помощ.</p>
<p><strong>Прост рутер</strong><br />
При тази ситуация нашият рутер просто развърта тряфика. В общият случай не се прави маскиране или филтрация на трафикатъй като като цяло е решено че не е необходимо. Това решение обикновенно се ползва при големи мрежи просто за да се сегментира мрежата. Постига се особенно елеменарно тъй като изисква включване на една единствена опци в кернела и разрешаването и за изпълнение. Опцията е IP FORWARDING. Може да бъде разрешена по два различни начина:</p>
<ol>
<li>Посредством proc системата (тя е налична при всички случаи):
<pre class="brush: bash; title: ; notranslate">echo &quot;1&quot; &gt; /proc/sys/net/ipv4/ip_forward</pre>
</li>
<li>Посредством sysctl системата (може да не е налична):
<pre class="brush: plain; title: ; notranslate">sysctl -w net.ipv4.ip_forward=1</pre>
</li>
</ol>
<p>Тази настройка разрешава препращане на пакети между интерфейсите на рутерът ни и така реално го стартираме. Необходимо е тази настройка да бъде сложена на такова място че при стартирането на нашата машина тя да бъде изпълнена автоматично. Добро място за тази настройка е <strong>/etc/rc.local</strong> или отделен файл който се изпълнява съвсем в края на процеса на стартиране.<br />
Както забелязвате това е един много опростен рутер който не предлага почти никакви ползи. За да работи правилно всяка от клиентските машини трябва да има собствен адрес, който е разпознаваем в обхвата на мрежата. Този рутер не изпълнява филтрация и не предпазва по никакъв начин машините зад него. Като цяло това решение е удачно за големи мрежи които искат да сегментират адресното си пространство и които имат сериозен рутер и firewall на входа им.</p>
<p><strong>Рутер който изпълнява NAT/masquerade и firewall функции</strong><br />
Това е може би най-често използваното решение. Предимствата му са че зад един адрес могат да се скрият (маскират) доста олям брой машини (теоретично почти неограничен стига да имаме процесорна мощ).<br />
Конфигурацията за този пример ще изградим при следните предпоставки:</p>
<ul>
<li>Външен интерфейс: <strong>eth0</strong> със съответно назначения му адрес и маска</li>
<li>Вътрешен интерфейс: <strong>eth1</strong> със съответно назначения му адрес и маска</li>
<li>Проста защита от DoS, DDoS атаки и сканиране</li>
<li>Лимит на специфични ICMP заявки</li>
<li>Достъп до http и ssh от външната страна на рутера ни</li>
<li>Достъп до http, ssh, dns, dhcp от вътрешната страна</li>
<li>SNAT за всички клиенти на рутера ни (дори при динамичен адрес)</li>
<li>Препращане на 10 порта за всеки клиент &#8211; за удобство на потребителите ни</li>
<li>Изрична филтрация на част от боклука във външната/вътрешната ни мрежа</li>
</ul>
<p>Темата за ограничения по TTL изрично ще я пропусна. Реализира се просто и има достатъчно документация по въпроса.</p>
<pre class="brush: bash; title: ; notranslate">#!/bin/bash

# Simple firewalling router
# author: vvitkov
# contact: http://www.getoto.net/az/
#
# Licence: CC NC-BY-SA v3
# Disclaimer: i take no responsibility for the consequences of using or not using this.
# It is up to you to decide what to do with this stuff.
# Please if you use this write me a note and don't remove the author info.

#######
# Settings, vars
#######
echo &quot;Setting Up Variables ...&quot;
IPT=&quot;/sbin/iptables&quot;
if [ -x /sbin/sysctl ] ; then
	SYSCTL=&quot;/sbin/sysctl -w&quot;
fi

# define external interface, ip, mask, broadcast
EXT_IF=&quot;eth0&quot;
EXT_IP=&quot;$(/sbin/ifconfig $EXT_IF | grep &quot;addr:&quot; | cut -d&quot;:&quot; -f2 | cut -f1 -d&quot; &quot;)&quot;
EXT_NM=&quot;$(/sbin/ifconfig $EXT_IF | grep &quot;addr:&quot; | cut -d&quot;:&quot; -f4 | cut -f1 -d&quot; &quot;)&quot;
EXT_BC=&quot;$(/sbin/ifconfig $EXT_IF | grep &quot;addr:&quot; | cut -d&quot;:&quot; -f3 | cut -f1 -d&quot; &quot;)&quot;

# define internal interface, ip, mask, broadcast
INT_IF=&quot;eth1&quot;
INT_IP=&quot;$(/sbin/ifconfig $INT_IF | grep &quot;addr:&quot; | cut -d&quot;:&quot; -f2 | cut -f1 -d&quot; &quot;)&quot;
INT_NM=&quot;$(/sbin/ifconfig $INT_IF | grep &quot;addr:&quot; | cut -d&quot;:&quot; -f4 | cut -f1 -d&quot; &quot;)&quot;
INT_BC=&quot;$(/sbin/ifconfig $INT_IF | grep &quot;addr:&quot; | cut -d&quot;:&quot; -f3 | cut -f1 -d&quot; &quot;)&quot;
INT_NET=&quot;$INT_IP&quot;/&quot;$INT_NM&quot;

# define the loopback
LO_IF=&quot;lo&quot;
LO_IP=&quot;127.0.0.1&quot;

# define allowed ports
EXT_IN_TCP=&quot;22 80&quot;
EXT_IN_UDP=&quot;33434:33524&quot;

INT_IN_TCP=&quot;22 53 67 68 80&quot;
INT_IN_UDP=&quot;53 67 68 33434:33524&quot;

#######
# Lets go
#######
echo &quot;Tunning ...&quot;
if [ -z $SYSCTL ] ; then
	# stop forwarding
	$SYSCTL net.ipv4.ip_forward=0
	# fix our routing a bit
	$SYSCTL net.ipv4.conf.default.accept_redirects=0
	$SYSCTL net.ipv4.conf.default.accept_source_route=0
	$SYSCTL net.ipv4.conf.default.send_redirects=0
	$SYSCTL net.ipv4.conf.default.rp_filter=1
	# don't log strange packets
	$SYSCTL net.ipv4.conf.default.log_martians=0
	# smurf rpotection
	$SYSCTL net.ipv4.icmp_echo_ignore_broadcasts=1
	$SYSCTL net.ipv4.icmp_ignore_bogus_error_responses=1
	$SYSCTL net.ipv4.conf.default.proxy_arp=0
	# keep quiet about arp requests/answers
	$SYSCTL net.ipv4.conf.default.arp_filter=1
	$SYSCTL net.ipv4.conf.default.arp_announce=2
	$SYSCTL net.ipv4.conf.default.arp_ignore=2
	# set the ttl to a windows like box (additional layer of security)
	$SYSCTL net.ipv4.ip_default_ttl=128
	# recycle fast unused buckets for packet infos
	$SYSCTL net.ipv4.tcp_tw_recycle=1
	$SYSCTL net.ipv4.tcp_tw_reuse=1
	# do not stamp the packets
	$SYSCTL net.ipv4.tcp_timestamps=0
else
	echo &quot;0&quot; &gt; /proc/sys/net/ipv4/ip_forward
	echo &quot;0&quot; &gt; /proc/sys/net/ipv4/conf/default/accept_redirects
	echo &quot;0&quot; &gt; /proc/sys/net/ipv4/conf/default/accept_source_route
	echo &quot;0&quot; &gt; /proc/sys/net/ipv4/conf/default/accept_send_redirects
	echo &quot;1&quot; &gt; /proc/sys/net/ipv4/conf/default/rp_filter
	echo &quot;0&quot; &gt; /proc/sys/net/ipv4/conf/default/log_martians
	echo &quot;1&quot; &gt; /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
	echo &quot;1&quot; &gt; /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
	echo &quot;0&quot; &gt; /proc/sys/net/ipv4/conf/default/proxy_arp
	echo &quot;1&quot; &gt; /proc/sys/net/ipv4/conf/default/arp_filter
	echo &quot;2&quot; &gt; /proc/sys/net/ipv4/conf/default/arp_announce
	echo &quot;2&quot; &gt; /proc/sys/net/ipv4/conf/default/arp_ignore
	echo &quot;128&quot; &gt; /proc/sys/net/ipv4/ip_default_ttl
	echo &quot;1&quot; &gt; /proc/sys/net/ipv4/tcp_tw_recycle
	echo &quot;1&quot; &gt; /proc/sys/net/ipv4/tcp_tw_reuse
	echo &quot;0&quot; &gt; /proc/sys/net/ipv4/tcp_timestamps
fi

# Clear all tables
echo &quot;Start on clean ...&quot;
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F

$IPT -X
$IPT -t nat -X
$IPT -t mangle -X

$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP

echo &quot;Setting custom chains ...&quot;
$IPT -N bad_packets
$IPT -N bad_tcp_packets
$IPT -N icmp_packets
$IPT -N tcp_in
$IPT -N udp_in
$IPT -N tcp_out
$IPT -N udp_out

echo &quot;Setting some protections ...&quot;
echo &quot;  General&quot;
$IPT -A bad_packets -p ALL -i $EXT_IF -s $INT_NET -j DROP
$IPT -A bad_packets -p ALL -m state --state INVALID -j DROP
$IPT -A bad_packets -p tcp -j bad_tcp_packets
$IPT -A bad_packets -p ALL -j RETURN

echo &quot;  TCP&quot;
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
$IPT -A tcp_in -p TCP -s 0/0 --destination-port 113 -j REJECT
$IPT -A bad_tcp_packets -p tcp -j RETURN

echo &quot;  ICMP&quot;
$IPT -A icmp_packets --fragment -p ICMP -j DROP
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -m limit --limit 1/s -j ACCEPT
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT
$IPT -A icmp_packets -p ICMP -j RETURN

echo &quot;  UDP&quot;
$IPT -A udp_in -p UDP -s 0/0 --dport 137 -j DROP
$IPT -A udp_in -p UDP -s 0/0 --dport 139 -j DROP
$IPT -A udp_in -p UDP -s 0/0 --dport 113 -j REJECT

echo &quot;Filling the chains ...&quot;
echo &quot;  UDP INCOMING&quot;
for PORT in $EXT_IN_UDP ; do
	$IPT -A udp_in -p UDP -i EXT_IF -s 0/0 --dport $PORT -j ACCEPT;
done
for PORT in $INT_IN_UDP ; do
	$IPT -A udp_in -p UDP -i INT_IF -s 0/0 --dport $PORT -j ACCEPT;
done
$IPT -A udp_in -j RETURN

echo &quot;  UDP OUTGOING&quot;
$IPT -A udp_out -p UDP -s 0/0 -j ACCEPT

echo &quot;  TCP INCOMING&quot;
for PORT in $EXT_IN_TCP ; do
	$IPT -A tcp_in -p TCP -i $EXT_IF -s 0/0 --dport $PORT -j ACCEPT
done
for PORT in $INT_IN_TCP ; do
	$IPT -A tcp_in -p TCP -i $INT_IF-s 0/0 --dport $PORT -j ACCEPT
done
$IPT -A tcp_in -p TCP -j RETURN

echo &quot;  TCP OUTGOING&quot;
$IPT -A tcp_out -p TCP -j ACCEPT

echo &quot;  INCOMING&quot;
$IPT -A INPUT -p ALL -i $LO_IF -j ACCEPT
$IPT -A INPUT -p ALL -j bad_packets
$IPT -A INPUT -p ALL -d 224.0.0.1 -j DROP
$IPT -A INPUT -p ALL -i $INT_IF -s $INT_NET -j ACCEPT
$IPT -A INPUT -p ALL -i $INT_IF -d $INT_BC -j ACCEPT
$IPT -A INPUT -p UDP -i $INT_IF --sport 68 --dport 67 -j ACCEPT
$IPT -A INPUT -p ALL -i $EXT_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p ALL -i ! $EXT_IF -m state --state NEW -j ACCEPT
$IPT -A INPUT -p TCP -i $EXT_IF -j tcp_in
$IPT -A INPUT -p UDP -i $EXT_IF -j udp_in
$IPT -A INPUT -p ICMP -i $EXT_IF -j icmp_packets
$IPT -A INPUT -m pkttype --pkt-type broadcast -j DROP

echo &quot;  FORWARD&quot;
$IPT -A FORWARD -p ALL -j bad_packets
$IPT -A FORWARD -p tcp -i $INT_IF -j tcp_out
$IPT -A FORWARD -p udp -i $INT_IF -j udp_out
$IPT -A FORWARD -p ALL -i $INT_IF -j ACCEPT
$IPT -A FORWARD -i $EXT_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -p ALL -i $EXT_IF -m state --state NEW -j ACCEPT

echo &quot;  OUTPUT&quot;
$IPT -A OUTPUT -m state -p icmp --state INVALID -j DROP
$IPT -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LO_IF -j ACCEPT
$IPT -A OUTPUT -p ALL -s $INT_IP -j ACCEPT
$IPT -A OUTPUT -p ALL -o $INT_IF -j ACCEPT
$IPT -A OUTPUT -p ALL -o $EXT_IF -j ACCEPT

echo &quot;  NAT&quot;
echo &quot;      PORT FORWARDING&quot;
TMP=&quot;`echo $INT_IP | cut -d\. -f1-3`&quot;
for HOST in `seq 2 254` ; do
        PORTR=$((10000+HOST*10)):$((10009+HOST*10))
        echo &quot;   $PORTR for $TMP.$HOST&quot;
        $IPT -A FORWARD -p udp -i $EXT_IF --dport $PORTR -d $TMP.$HOST -j ACCEPT
        $IPT -A FORWARD -p tcp -i $EXT_IF --dport $PORTR -d $TMP.$HOST -j ACCEPT
        $IPT -t nat -A PREROUTING -p udp -i $EXT_IF --dport $PORTR -j DNAT --to $TMP.$HOST
        $IPT -t nat -A PREROUTING -p tcp -i $EXT_IF --dport $PORTR -j DNAT --to $TMP.$HOST
done

$IPT -t nat -A POSTROUTING -o $EXT_IF -j SNAT --to $EXT_IP

if [ -z $SYSCTL ] ; then
	$SYSCTL net.ipv4.ip_forward=1
else
	echo &quot;1&quot; &gt; /proc/sys/net/ipv4/ip_forward
fi</pre>
<p>Като цяло това е един относително добър базов firewall. В него има няколко интересни момента а именно:</p>
<ul>
<li>Начинът по който вземаме адресите на мрежовите карти &#8211; както сте забелязали единствените променливи които не се извличат това са имената на интерфейсите. По този начин самият firewall става по гъвкав и приложим за почти всякакъв вид връзки.</li>
<li>Начина по който реализираме маскирането. Правим го със SNAT тъй като той е по лек отколкото MASQUERADE. За хората които ще кажат че при динамични връзки (pppoe, ip идващо от dhcp) това не е подходящо, да по принцип сте прави. Обаче ако използваме възможностите на DHCP клиента/pppoe клиента това може да бъде избегнато. В момента в който нашият адрес бъде подменен можем принудително да изпълним отново нашият firewall и той отново да си вземе правилния адрес и да се оправи както си му е редът.</li>
<li>Начинът по който препращаме портове на машините зад нас &#8211; използвана е конструкция която е валидна само в bash с която да се генерират две числа които използваме за начало и край на обхвата от портове. След това експлицитно ги отваряме във веригата FORWARD макар че това не е строго необходимо и в последствие ги препращаме чрез DNAT.</li>
<li>Обхватът от портове 33434:33524 &#8211; тези портове трябва да са отворени за да работи traceroute</li>
</ul>
<p><strong>Рутер който изпълнява баланс на трафика от два или повече доставчика</strong><br />
Тук ще дадем само частта която реално изпълнява балансирането на трафика. Вземаме пример само с два доставчика, но разширяването на примера не е проблем. Задачата е малко по обемиста тъй като за удобство ще използваме iproute. Самият пакет има доста криптичен синтаксис но след като му свикнете едва ли ще ви се разделя с него.</p>
<p>За да можем да балансираме трафик ни трябват следните инструменти:</p>
<ul>
<li>iproute2</li>
<li>поддръжка в кернела за multipath routing</li>
<li>Компилиран в кернела поне една дисциплина за multipath routing &#8211; аз лично препоръчвам wrr</li>
</ul>
<p>За да можем да използваме имена в конфигурацията е необходимо да ги добавим във файла <strong>/etc/iproute2/rt_tables</strong>. Индексите им са между 2 и 252. Ако ще балансирате повече от 200 доставчика … не четете на правилното място.</p>
<pre class="brush: bash; title: ; notranslate">#!/bin/bash
#
# Simple balancing router
# author: vvitkov
# contact: http://www.getoto.net/az/
#
# Licence: CC NC-BY-SA v3
# Disclaimer: i take no responsibility for the consequences of using or not using this.
# It is up to you to decide what to do with this stuff.
# Please if you use this write me a note and don't remove the author info.

### Settings
ISP1_NET=&quot;1.2.3.0/24&quot;
ISP1_GW=&quot;1.2.3.1&quot;
ISP1_IF=&quot;eth1&quot;
ISP1_OUR_HOST=&quot;1.2.3.99&quot;
ISP2_NET=&quot;9.8.7.0/24&quot;
ISP2_GW=&quot;9.8.7.1&quot;
ISP2_IF=&quot;eth2&quot;
ISP2_OUR_HOST=&quot;9.8.7.99&quot;

INT_NET=&quot;10.42.3.0/24&quot;

# Defining routing tables for source routing
if ( ip ru ls | grep main | grep 50 )
then
        ip r f t main
else
        ip ru a prio 50 t main
fi

if ( ip ru ls | grep isp_rules1 )
then
        ip r f t isp_rules1
else
        ip ru a from $ISP1_NET prio 201 t isp_rules1
fi

if ( ip ru ls | grep isp_rules2 )
then
        ip r f t isp_rules2
else
        ip ru a from $ISP2_NET prio 202 t isp_rules2
fi

# Clear all the existing routes
ip r f any
ip r f t default

# Host routes
ip r a $ISP1_NET dev $ISP1_IF src $ISP1_OUR_HOST
ip r a $ISP2_NET dev $ISP2_IF src $ISP2_OUR_HOST

# Local networks
ip r a 127.0.0.0/8 dev lo
ip r a $INT_NET dev eth0

# Default gateways
ip r a 0/0 via $ISP1_GW dev $ISP1_IF table isp_rules1 proto static
ip r a prohibit 0/0 table isp_rules1 metric 1 proto static

ip r a 0/0 via $ISP2_GW dev $ISP2_IF table isp_rules2 proto static
ip r a prohibit 0/0 table isp_rules2 metric 1 proto static

# lets shake it :)
ip r a 0/0 proto static table default nexthop via $ISP1_GW dev $ISP2_IF nexthop via $ISP2_GW dev $ISP2_IF

# Remote networks with static routes
ip r a &lt; NETWORK IN ISP1 &gt; via $ISP1_GW dev $ISP1_IF
ip r a &lt; NETWORK IN ISP2 &gt; via $ISP2_GW dev $ISP2_IF

# flush caches
ip r f c</pre>
<p>С това завършват примерите за конфигуриране на рутер. Знам че не са покрити всички възможности, но човек трябва да се потруди малко.</p>
<p>Серията продължава в <a href="http://www.getoto.net/2009/12/06/the-perfect-soho-router-part-5/">The Perfect SOHO router &#8211; Part 5</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.getoto.net/2009/12/06/the-perfect-soho-router-part-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

