<?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>Блогът на Анатолий Дилов &#187; провайдер</title>
	<atom:link href="http://blog.adilov.net/tag/%d0%bf%d1%80%d0%be%d0%b2%d0%b0%d0%b9%d0%b4%d0%b5%d1%80/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.adilov.net</link>
	<description>(не)одушевеното около мен</description>
	<lastBuildDate>Sat, 12 Nov 2011 22:26:19 +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>FreeBSD + PF (Packet Filter) за /NAT/ router</title>
		<link>http://blog.adilov.net/technical/how-to/freebsd-pf-packet-filter-za-nat-router</link>
		<comments>http://blog.adilov.net/technical/how-to/freebsd-pf-packet-filter-za-nat-router#comments</comments>
		<pubDate>Thu, 09 Oct 2008 15:05:12 +0000</pubDate>
		<dc:creator>Анатолий</dc:creator>
				<category><![CDATA[How to]]></category>
		<category><![CDATA[Операционни Системи]]></category>
		<category><![CDATA[Софтуер]]></category>
		<category><![CDATA[compile]]></category>
		<category><![CDATA[config]]></category>
		<category><![CDATA[firewall]]></category>
		<category><![CDATA[freebsd]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[nat]]></category>
		<category><![CDATA[packet filter]]></category>
		<category><![CDATA[pf]]></category>
		<category><![CDATA[provider]]></category>
		<category><![CDATA[router]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[ttl]]></category>
		<category><![CDATA[доставчик]]></category>
		<category><![CDATA[Интернет]]></category>
		<category><![CDATA[конфигурация]]></category>
		<category><![CDATA[провайдер]]></category>

		<guid isPermaLink="false">http://blog.adilov.net/?p=96</guid>
		<description><![CDATA[Идеята на темата не е една. Всеки може да реши да прави подобно нещо по различни поводи. Аз ще спомена моите &#8211; те са два. Първо &#8211; имам повече от една машина, която се нуждае от пакети от външния свят ;) и второ &#8211; нуждата да насочвам определени рикуести да отиват на определени места. За [...]]]></description>
			<content:encoded><![CDATA[<p>Идеята на темата не е една. Всеки може да реши да прави подобно нещо по различни поводи. Аз ще спомена моите &#8211; те са два. Първо &#8211; имам повече от една машина, която се нуждае от пакети от външния свят ;) и второ &#8211; нуждата да насочвам определени рикуести да отиват на определени места. За втората причина няма да говоря сега, ще опиша как с FBSD платформа да имаме интернет на машините във вътрешната мрежа, въпреди, че isp-ът го забранява.<span id="more-96"></span></p>
<p>Проблемът в моя случай беше, че TTL-ът на върнатите от доставчика пакети беше 1 и след като минат през рутера не достигат машината към която трябва да отидат.</p>
<p>Дифолтния кърнел на FreeBSD няма съпорт за pf, затова трябва да се <a href="http://www.freebsd.org/doc/en/books/handbook/kernelconfig-building.html">прекомпилира кърнела</a> с 3 допълнителни значещи реда реда:<br />
#Packet Filter<br />
device pf                       # Support for OpenBSD&#8217;s Packet Filter<br />
device pflog                  # Enables logging the network traffic<br />
device pfsync                # Monitor &#8220;State Changes&#8221;</p>
<p>След като сме готови можем да напишем малко инфо какво и с кого да прави pf-a. Отваряме за едит /etc/rc.conf и вътре за pf ни трябва:<br />
pf_enable=&#8221;YES&#8221;<br />
pf_rules=&#8221;/etc/pf.conf&#8221;<br />
pf_flags=&#8221;"<br />
pflog_enable=&#8221;YES&#8221;<br />
pflog_logfile=&#8221;/var/log/pflog&#8221;<br />
pflog_flags=&#8221;"</p>
<p>Следващата стъпка е основното &#8211; правилата в /etc/pf.conf. Тук е малко по-особеното &#8211; трябва да се деасемблират пакетите, да се сетне нужната ни дължина, да се асемблират обратно и тогава да се изпратят. Дадените примери са за една машина, която ще се връзва и един ethernet interface, но не е проблем да са повече лан-картите, или пък от една лан-карта да отива кабел в switch, друг router или някакъво друго мрежо-capable дивайсче (Само за пример: в моя случай имам 2 лан-карти на FBSD машината, които се NAT-ват &#8211; за едната е закачена друга машина, а към втората има switch, за който са свързани още един рутер и wifi access point).</p>
<p>Ето какво ни трябва (без да влизам в подробности с обяснението кое за какво и как се използва) в /etc/pf.conf:<br />
#######################################<br />
## PACKETS MODIFYING #######################<br />
scrub in on $ext_if all min-ttl 25 max-mss 1400 fragment reassemble<br />
scrub out on $ext_if all min-ttl 65 max-mss 1400 fragment reassemble</p>
<p>scrub in<br />
scrub in all fragment reassemble<br />
scrub in on $ext_if all no-df fragment reassemble</p>
<p>#######################################<br />
## NAT ##################################<br />
# Internal Machines rules<br />
nat on $all_if from &lt;int_machines&gt; to any -&gt; ($ext_if)</p>
<p>Последните 2 реда са за пример &#8211; за всеки запис &#8211; нов нат като предходните. Ето краткото обяснение на горенаписаното:</p>
<p>scrub-овете служат да си поиграем с пакетите. Накратко какво става: на изходящите пакети слагаме TTL 65, а на входящите &#8211; 25. Така сме сигурни, че входящите пакети ще пристигнат до машината, която ги чака и няма да бъдат загубени по трасето.</p>
<p>nat-овете map-ват пакетите и след като се получи отговор се пращат до машината, която ги е изпратила първоначално. Идеята с няколко думи е, че ако машина М1 изпрати пакет до сървър S1, mинаващ през рутер R1, то nat-ът на R1 изпраща пакета &#8220;от негово име&#8221; като прави таблица, в която се пази информацията, че резултатът ще се препрати обратно до М1. S1 отговаря на R1 и nat-ът пренасочва пакета към M1.</p>
<p>И за променливите: $ext_if е лан-картата с жицата от доставчика. $all_if &#8211; списък с всички интерфейси, с които искам да работя. Изглежда по този начин: all_if=&#8221;{ rl0 re0 lo0 }&#8221;. int_machines&gt; е таблица с IP-тата на всички машини от вътрешната мрежа. Ето как се създава подобна таблица:<br />
table  {\<br />
&lt;ip -na pc/router/access-point/etc&gt;,\<br />
&lt;ip -na pc/router/access-point/etc&gt;\<br />
}<br />
Трябва да се обърне внимане на предпоследния ред &#8211; няма запетая накрая ;)<br />
също е таблица, изглежда по същия начин като  (с други ип-та вътре естествено :&gt;). За мое улеснение в таблицата с IP-тата на машините във вътрешната мрежа не съм набил IP-тата вътре. Предварително са създадени променливи с името на всяка от машините и нейното IP и после тези променливи са написани в таблицата. Още един плюс за таблиците &#8211; динамично може да се вкарват IP-та, но това е тема на друг разговор&#8230;</p>
<p>Бием един рестарт заради кърнела и сме готови :)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.adilov.net/technical/how-to/freebsd-pf-packet-filter-za-nat-router/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

