<?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; bash</title>
	<atom:link href="http://www.getoto.net/tag/bash/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.getoto.net</link>
	<description>And from the ashes the Phoenix rose reborn</description>
	<lastBuildDate>Fri, 20 Aug 2010 13:39:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<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;">echo &quot;1&quot; &gt; /proc/sys/net/ipv4/ip_forward</pre>
</li>
<li>Посредством sysctl системата (може да не е налична):
<pre class="brush: plain;">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;">#!/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;">#!/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>
		<item>
		<title>The Perfect SOHO router &#8211; Part 2</title>
		<link>http://www.getoto.net/2009/12/06/the-perfect-soho-router-part-2/</link>
		<comments>http://www.getoto.net/2009/12/06/the-perfect-soho-router-part-2/#comments</comments>
		<pubDate>Sun, 06 Dec 2009 16:30:31 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[Статии]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[cd 3]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[compaq deskpro]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[deborphan]]></category>
		<category><![CDATA[dhcp]]></category>
		<category><![CDATA[firewall]]></category>
		<category><![CDATA[installation]]></category>
		<category><![CDATA[intel ether express]]></category>
		<category><![CDATA[LAN]]></category>
		<category><![CDATA[lang]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[mb hdd]]></category>
		<category><![CDATA[ram 256]]></category>
		<category><![CDATA[router]]></category>
		<category><![CDATA[secure]]></category>
		<category><![CDATA[simple]]></category>
		<category><![CDATA[soho]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://www.getoto.net/?p=30</guid>
		<description><![CDATA[В тази част ще инсталираме нашият рутер, ще изхвърлим абсолютно всичко излишно и инсталираме необходимият ни софтуер. Идеята зад целият процес е да минимизираме както използваното дисково пространство така и самата употреба на диска. По този начин също така ще намалим количеството използван софтуер което ще улесни нашата поддръжка.]]></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>В тази част ще инсталираме нашият рутер, ще изхвърлим абсолютно всичко излишно и инсталираме необходимият ни софтуер. Идеята зад целият процес е да минимизираме както използваното дисково пространство така и самата употреба на диска. По този начин също така ще намалим количеството използван софтуер което ще улесни нашата поддръжка.</p>
<p><strong>Желязото</strong><br />
За този проект използваме следният хардуер</p>
<blockquote><p>Compaq Deskpro series small factor machine<br />
CPU: 333 mhz<br />
RAM: 256 mb<br />
HDD: 6,4 GB<br />
LAN: 1 x Intel Ether Express (onboard), 1 x Davicom.</p></blockquote>
<p>Като цяло това е една доста мършава машина по сегашни стандарти но за целта е напълно достатъчна. Поради факта че мрежовата карта на Davicom като цяло е голям боклук ще я ползваме за вътрешна, тъй като там ще се справя с по малко проблеми.</p>
<p><strong>Инсталация на базова система</strong><br />
Това е като цяло прост процес. Намерете си любимото CD с дебиан 3.1 и да започваме. Първата важна точка в дневният ред е по какъв начин да разделим диска. Аз лично препоръчвам следната конфигурация:</p>
<blockquote><p>/boot &#8211; 100 MB<br />
/ &#8211; 2 GB<br />
swap &#8211; 256 MB<br />
/home &#8211; REST</p></blockquote>
<p>Това разделяне ще ни даде относително голяма свобода на работа както и възможност за по нататъшно развитие.</p>
<p>Друг важен момент е в коя лан карта да сложим мрежа. Както обосновахме по-горе поради ниското качество на едната карта ще я използваме за вътрешна, а вградената ще използваме за външна. Общият принцип е че тази карта която ще използваме за външна трябва да бъде с мрежа по време на инсталация. Не е невъзможно това да се пренебрегне но в последствие има доста повече работа.</p>
<p>Следва да инсталираме системата. Аз препоръчвам клона testing, тъй-като в него има по нови версии на софтуера и е достатъчно стабилен за нашите цели. По време на самата инсталация не избирайте никакъв профил от предложените ви. Изберете сигурна парола за root и не създавайте допълнителен потребител.</p>
<p><strong>Минимизиране</strong><br />
След като вече сме завършили инсталацията време е да я минимизираме. За целта ще използваме пакета <a href="http://packages.debian.org/testing/admin/deborphan">deborphan</a>. Той се използва за да покаже пакети които не се използват. Нашата цел с неговото инсталиране е да премахнем абсолютно всичко което не ни е нужно. За целта ще се наложи неколкократно извикване на следният ред</p>
<pre class="brush: bash;">apt-get remove --purge \
`deborphan -a --no-show-section --guess-all | \
grep -v &quot;ssh\|deborphan\|bash\|apt\|nano\|kernel\|ssl&quot;`</pre>
<p><em><small>Редът е разделен на няколко реда за четимост</small></em><br />
Идеята на този ред е да изчисти абсолютно всички пакети които не са необходими или не се използват като пропусне пакетите които имат ssh, deborphan, apt, nano, kernel, ssl или bash в името си.<br />
Необходимо е тази команда да се изпълни няколко пъти тъй като софтуерът не е рекурсивен. Тази стъпка не е строго необходима но помага.<br />
Допълнително инсталираме пакета <a href="http://packages.debian.org/testing/admin/localepurge">localepurge</a> с чиято помощ ще отстраним ненужните локали. С него изберете същите езици/локали които сте избрали при инсталацията.</p>
<p><strong>Инсталиране на необходимият ни софтуер</strong><br />
Първо нека да доведем системата до най-новото състояние в клона който сме избрали</p>
<pre class="brush: bash;">apt-get update
apt-get --purge dist-upgrade
apt-get --purge dist-upgrade -f</pre>
<p>Следва да премахнем всички налични за момента кернели и да инсталираме такъв който ние искаме. Специално за дебиан кернелът се намира в пакет с име от типа kernel-image, linux-image. Открийте и премахнете всички подобни пакети</p>
<pre class="brush: bash;">apt-get remove --purge [package list]</pre>
<p>Сега следва да инсталираме кернел по наше желание. Ще използваме такъв който се предоставя от проекта дебиан тъй като конфигурацията му е достатъчно добра за нуждите ни.</p>
<pre class="brush: bash;">apt-get install linux-image-2.6.18-4-686</pre>
<p>Кернелът е достатъчно бърз и има всичко което ще ни трябва.Поради изборът ни на услуги ще се налоги да инсталираме малко допълнителен софтуер</p>
<pre class="brush: bash;">apt-get install iptables iproute bind9 bind9-host dhcp lighttpd php4-cgi php4-cli phpsysinfo mrtg samba ntp ntpdate proftpd ncftp vim logwatch rkhunter denyhosts iptraf mtr-tiny snmp snmpd iputils-ping lsof openssh-server sudo</pre>
<p>В процеса на инсталация ще бъдат инсталирани допълнителни пакети от които зависи работата на желаните от нас.Последната задача която стои пред нас на този етап от инсталацията е да добавим собствен потребител със негов собствен ssh ключ за повишаване на сигурността и да му гарантираме правото да изпълнява команди посредством sudo.</p>
<pre class="brush: bash;">adduser managementuser
cd ~managementuser/
mkdir .ssh
cat /root/managementuser-key.pub &gt; .ssh/authorized_keys2
chown -R managementuser:managementuser .ssh
usermod -G sudo managementuser
visudo</pre>
<p><strong>Забележка:</strong> файлът <strong>/root/managementuser-key.pub</strong> е публичният ssh ключ който сме генерирали предварително и копирали по някакъв начин на нашият рутер. Ключове се генерират най-лесно със <strong>ssh-keygen</strong>.<br />
Командата visudo редактира файла /etc/sudoers. Там трябва да добавим/откоментираме редът</p>
<pre class="brush: bash;">%sudo ALL=NOPASSWD: ALL</pre>
<p>който позволява на всички принадлежащи в групата sudo да изпълняват всички команди без парола.</p>
<p><strong>Заключение</strong><br />
Като цяло в това се състои нашата базова инсталация. От тук на сетне тя трябва да бъде настроена. Всички останали задачи ще изпълняваме посредством ssh като първо се свързваме с нашият потребител <strong>managementuser</strong> и в последствие ставаме <strong>root</strong> посредством <strong>sudo su -</strong></p>
<p>Серията продължава в <a href="http://www.getoto.net/2009/12/06/the-perfect-soho-router-part-3/">The Perfect SOHO router &#8211; Part 3</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.getoto.net/2009/12/06/the-perfect-soho-router-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A dead simple webserver in bash</title>
		<link>http://www.getoto.net/2009/12/06/a-dead-simple-webserver-in-bash/</link>
		<comments>http://www.getoto.net/2009/12/06/a-dead-simple-webserver-in-bash/#comments</comments>
		<pubDate>Sun, 06 Dec 2009 13:33:57 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[Статии]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[FILE]]></category>
		<category><![CDATA[simple]]></category>
		<category><![CDATA[sleep]]></category>
		<category><![CDATA[swiss army knife]]></category>
		<category><![CDATA[tcp ip]]></category>
		<category><![CDATA[var]]></category>
		<category><![CDATA[web web]]></category>
		<category><![CDATA[webserver]]></category>
		<category><![CDATA[wrapper script]]></category>

		<guid isPermaLink="false">http://www.getoto.net/?p=16</guid>
		<description><![CDATA[Тук ще представя една относително елементарна идея за мизерен web сървър. Предупреждавам няма никаква функционалност и доста ограничени възможности. Защо Ами по ред причини. Може да искате да имате много елементарни статистики, да речем натоварване на машината. Може да искате да паркирате някаква много елементарна страничка. Не искате да пускате пълнофункционален сървър и може би [...]]]></description>
			<content:encoded><![CDATA[<p>Тук ще представя една относително елементарна идея за мизерен web сървър. Предупреждавам няма никаква функционалност и доста ограничени възможности.</p>
<p><strong>Защо</strong><br />
Ами по ред причини. Може да искате да имате много елементарни статистики, да речем натоварване на машината. Може да искате да паркирате някаква много елементарна страничка. Не искате да пускате пълнофункционален сървър и може би още тон причини.</p>
<p><strong>Предпоставки</strong><br />
Ще предположим следното:</p>
<ul>
<li>Този web сървър ще е статичен</li>
<li>Ще сервира една единствена страница/файл независимо какво иска клиента</li>
<li>Ще работи на порт 8080</li>
</ul>
<p><strong>Теория на операцията</strong></p>
<ul>
<li>Трябва ни нещо което да посрещне входящата заявка &#8211; в случая ще ползваме <strong>netcat</strong> който популярно е наричан “TCP/IP swiss army knife” заедно с един малък wrapper script.</li>
<li>Трябва по някакъв начин да разберем че е дошла заявка &#8211; в случая това изобщо не ни интересува. В момента в който дойде трафик на нашия порт значи някой праща заявка, като свърши трафика значи заявката е свършила и ще си сервираме нашият отговор.</li>
<li>Трябва да конструираме правилен отговор за да не объркаме клиента който ни пита за нещо.</li>
<li>След това си вмъкваме нашето съобщение/файлче.</li>
<li>И накрая разбира се терминираме сесията.</li>
</ul>
<p><strong>Реализация</strong><br />
Wrapper script-а който ще напишем за netcatима една единствена цел. Да стартира netcat след като той излезе, като слага известно забавяне. Забавянето е необходимо от гледна точка на предпазване от DoS атака. Не е ефективно но е елементарно. А и все пак се очаква че това нещо няма да работи на production машина.</p>
<p><strong>/var/www/bashserver/netcat-server.sh</strong></p>
<pre class="brush: bash;">#!/bin/bash
#
# Simple wrapper for keeping nc alive as it exits after successfull request
# at least on debian it acts this way.
# Author: vvitkov
# ver: 0.1
# date: 18.07.2007
# licence: CC BY-SA 3.0

NC=$(which nc)
while [ ] ; do
$NC -l -p  8080 -e /var/www/bashserver/webserver.sh
sleep 1
done</pre>
<p>Идеята на цялото това нещо е да се върти безкраен цикъл в който се пуска nc с определени параметри, чака се да излезе, изчаква се две секунди, и след това цялата въртележка на нова сметка.<br />
Параметрите с които се пуска nc са както следва:</p>
<ul>
<li><strong>-l</strong> &#8211; локален режим. Тоест nc ще работи като сървър.</li>
<li><strong>-p</strong> &#8211; порта на който ще слуша.</li>
<li><strong>-е</strong> &#8211; при връзка изпълни този скрипт и върни каквото върне той.</li>
</ul>
<p>С това първата ни задачка по посрещането на трафика е изпълнена.</p>
<p><strong>/var/www/bashserver/webserver.sh</strong></p>
<pre class="brush: bash;">#!/bin/bash
#
# Simple bash webserver. Nothing fancy
# Author: vvitkov
# ver: 0.1
# date: 18.07.2007
# licence: CC NC-BY-SA 3.0

# Our simple file which we will serve
FILE='/var/www/bashserver/message.txt'
# Construct propper headers
echo -e &quot;HTTP/1.0 200 OK\r&quot;
echo -e &quot;Content-Type: `/usr/bin/file -bi \&quot;$FILE\&quot;`\r&quot;
echo -e &quot;\r&quot;

# Now lets spit our data
cat &quot;$FILE&quot;

# And lets finish the transmission.
echo -e &quot;\r&quot;</pre>
<p>Простичко нали. И което е по интересното върши добра работа.</p>
<p><strong>Идеи за развиване</strong><br />
Модифициране на <strong>webserver.sh</strong> така че да приема параметър с който да се описва порта на който да слуша. Втори параметър който да указва кой файл точно да се изпълнява а не да е твърдо закодирано за <strong>webserver.sh</strong>. Евентуално дори трети параметър който да се предава към файла който изпълняваме и да указва кой файл да връщаме.<br />
Модифициране на <strong>webserver.sh</strong> така че да бъде научен да разбира от заявките, а не просто да сервира един единствен файл.</p>
<p><strong>Заключение</strong><br />
Този вебсървър е със много ограничено приложение и кажи речи пълна неизползваемост, но за определени цели върши работа.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.getoto.net/2009/12/06/a-dead-simple-webserver-in-bash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
