Differences

This shows you the differences between two versions of the page.

Link to this comparison view

rl:labs:09:contents:02 [2013/11/26 10:37]
razvan.deaconescu [03. Format de pachete TCP la translatare]
rl:labs:09:contents:02 [2023/11/05 13:06] (current)
vlad_iulius.nastase
Line 1: Line 1:
-==== 02. Format de pachete la translatare ​====+==== 02. [10p] Port forwarding pentru accesare serviciu web ====
  
-Ne propunem analizăm antetul IP al pachetelor ce sunt generate de stațiile ''​red''​''​green'' ​și ''​blue'' ​și au ca destinație o rețea din Internet. Pentru acest lucru vom folosi utilitarul ​de captură ​''​tcpdump''​.+Pe stația ''​red'' ​este instalat un server de HTTP pe care dorim să îl accesăm de pe stația ​''​fep.grid.pub.ro''​. Pentru acest lucru trebuie trebuie să redirectațportul ​''​8080'' ​de pe stația ''​host''​ spre portul ''​80'' ​de pe stația ​''​red'' ​folosind DNAT (vezi [[rl:​labs:​08:​contents:​05|]]).
  
-Pe stația ''​red'' ​pornim comanda ​''​ping''​ către ''​8.8.8.8.''​:<code bash> +Pentru testare, deschideți terminal pe ''​fep.grid.pub.ro'' ​și accesați site-ul ​''​http://10.9.X.Y:8080''​ (înlocuiți cu IP-ulprin intermediul utilitarului ​''​curl''​. Vă va apărea un cod HTML cu mesajul //​Laboratorul 10 - pe red//. Exemplu: ​<code bash> 
-root@red:~# ping 8.8.8.8 +student@mjolnir:~$ ssh -X mihai.carabas@fep.grid.pub.ro 
-PING 8.8.8.8 ​(8.8.8.856(84) bytes of data. +mihai.carabas@fep.grid.pub.ro's password:
-64 bytes from 8.8.8.8: icmp_req=1 ttl=127 time=42.0 ms +
-[...] +
-</​code>​ +
-Pentru a urmări traficul, pe stația ​''​host'' ​rulăm comanda<code bash> +
-root@host:~# tcpdump ​-i eth0 ip dst 8.8.8.+
-tcpdump: verbose output suppressed, use -v or -vv for full protocol decode +
-listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes +
-12:59:20.976707 IP host.local > google-public-dns-a.google.com:​ ICMP echo request, id 625, seq 6, length 64 +
-12:59:21.977708 IP host.local > google-public-dns-a.google.comICMP echo request, id 625, seq 7, length 64 +
-</​code>​+
  
-Observăm că adresa IP sursă este ''​host.local''​ chiar dacă stația ''​red''​ este cea care execută comanda ''​ping''​ și generează pachetele de tip ''​ICMP echo request''​. +[your.name@fep-62-2 ~]$ curl http://10.9.X.Y:8080
- +
-Pentru a vedea pachetele așa cum sunt generate inițial, rulăm comandă ''​tcpdump''​ pe interfața ''​veth-red''​ în loc de ''​eth0'':​ <code bash> +
-root@host:~# tcpdump ​-i veth-red ip dst 8.8.8.8 +
-tcpdumpverbose output suppressed, use -v or -vv for full protocol decode +
-listening on veth-red, link-type EN10MB (Ethernet), capture size 65535 bytes +
-13:01:12.557692 IP red > google-public-dns-a.google.com:​ ICMP echo request, id 626, seq 6, length 64 +
-13:​01:​13.559726 IP red > google-public-dns-a.google.comICMP echo request, id 626, seq 7, length 64+
 </​code>​ </​code>​
-Observăm că pe interfața ''​veth-red''​ adresa IP sursă este adresa stației ''​red'',​ adică așa cum este generat de la început pachetul. Motivul este reprezentat de faptul că pachetele ce intră pe intefața ''​veth-red''​ sunt capturate înainte de rutare, iar procesul NAT este aplicat **după rutare** (vezi [[rl:​labs:​09:​contents:​01|]]. 
- 
-Pentru a vedea modul în care se translatează traficul capturăm traficul pe toate interfețele (cele de interes sunt ''​veth-red''​ și ''​eth0''​)<​code bash> 
-root@host:​~#​ tcpdump -i any ip dst 8.8.8.8 
-tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 
-listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes 
-10:​23:​07.632412 IP red > google-public-dns-a.google.com:​ ICMP echo request, id 707, seq 237, length 64 
-10:​23:​07.632430 IP host.local > google-public-dns-a.google.com:​ ICMP echo request, id 707, seq 237, length 64 
-10:​23:​08.633936 IP red > google-public-dns-a.google.com:​ ICMP echo request, id 707, seq 238, length 64 
-10:​23:​08.633954 IP host.local > google-public-dns-a.google.com:​ ICMP echo request, id 707, seq 238, length 64 
-</​code>​ 
- 
-În lista de mai sus observăm atât pachetele care sunt captuarate pe interfața ''​veth-red''​ (generate de stația ''​red''​) cât și cele capturate pe interfața ''​eth0''​ (translatate de stația ''​host''​). 
- 
-Capturați și pachetele de reply, care au ca **sursă** adresa ''​8.8.8.8''​. Folosiți șirul de argumente ''​ip src 8.8.8.8''​ pentru ''​tcpdump''​. 
- 
-Repetați testele de mai sus pentru stația ''​green''​. 
- 
-<​note>​ 
-Întrucât latența DNS poate fi semnificativă,​ recomandăm folosirea opțiunii ''​-n''​ a utilitarului ''​tcpdump'',​ opțiune care dezactivează rezolvara DNS. În exemplele de mai sus, nu am folosit opțiunea ''​-n''​ a utilitarului ''​tcpdump''​ pentru a identifica mai ușor numele stațiilor implicate în conversație. 
-</​note>​ 
- 
-==== 03. Format de pachete TCP la translatare ==== 
- 
-Dorim să urmărim modul structura pachetelor TCP înainte și după translatarea de adrese. În plus față de exercițiul de mai sus, vrem să urmărim și porturile. Pentru aceasta vom genera pachete TCP (HTTP) folosind ''​wget''​ de pe stația ''​red''​ și vom captura pachetele folosind ''​tcpdump''​ pe stația ''​host''​. 
- 
-Pe stația ''​host''​ capturați pe toate interfețele pachetele HTTP care au ca adresă destinație numele ''​google.com''​. 
- 
-<note tip> 
-Va trebuie să folosiți argumentele ''​ip dst host www.upb.ro''​ și ''​tcp dst port 80''​ la ''​tcpdump''​. Legați argumentele prin șirul ''​and''​. Urmăriți și [[http://​linux-circles.blogspot.ro/​2012/​11/​how-to-capture-packets-with-tcpdump.html|exemplele de aici]]. 
-</​note>​ 
- 
-Pe stația ''​red''​ folosiți ''​wget''​ pentru a obține pagina de la ''​google.com''​. 
- 
-Urmăriți translatarea adresei IP sursă și a portului sursă în cadrul capturii de pachete realizată cu ''​tcpdump''​ pe ''​host''​. 
- 
-<note important>​ 
-O să existe o latență (2-3 secunde) la afișarea pachetelor capturate cu ''​tcpdump''​ datorată rezolvării DNS. Puteți folosi opțiunea ''​-n''​ a ''​tcpdump''​ pentru a dezactivarea rezolvarea DNS și pentru a elimina latența. 
-</​note>​ 
- 
-Observați în cadrul capturii că portul sursă, ales de stația ''​red''​ este același cu cel folosit în urma translatării de stația ''​host''​. În general implementările de NAT vor păstra portul în urma translatării. În cazul rar în care acel port este ocupat pe stația ''​host''​ (posibil datorită unei alte translatării) se va aloca un alt port. 
- 
-Pe stația ''​host''​ capturați pe toate interfețele pachetele HTTP care au ca adresă numele ''​www.upb.ro'';​ nu contează dacă este sursă sau destinație,​ capturăm și pachetele de interogare și cele de rășpuns; la fel, portul poate fi sursă sau destinație. Pe stația ''​red''​ folosiți, din nou, ''​wget''​ pentru a obține pagina de la ''​google.com''​. Urmăriți translatarea adresei IP sursă și a portului sursă pentru pachetele de interogare și translatarea adresei IP destinație și a portului destinație pentru pachetele de răspuns. 
- 
-<​solution -hidden> 
-Rulăm comanda ''​tcpdump''​ pe stația ''​host''​ și comanda ''​wget''​ pe stația ''​red'':<​code bash> 
-root@host:​~#​ tcpdump -i any ip dst host www.upb.ro and tcp dst port 80 
-tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 
-listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes 
-16:​01:​43.895939 IP host.local.55630 > 141.85.166.61.http:​ Flags [S], seq 2218116970, win 14600, options [mss 1460,​sackOK,​TS val 25026596 ecr 0,​nop,​wscale 3], length 0 
-16:​01:​43.899247 IP red.55630 > 141.85.166.61.http:​ Flags [.], ack 3520002, win 14600, length 0 
-16:​01:​43.899254 IP host.local.55630 > 141.85.166.61.http:​ Flags [.], ack 3520002, win 14600, length 0 
-16:​01:​43.899809 IP red.55630 > 141.85.166.61.http:​ Flags [P.], seq 0:110, ack 1, win 14600, length 110 
-16:​01:​43.899817 IP host.local.55630 > 141.85.166.61.http:​ Flags [P.], seq 0:110, ack 1, win 14600, length 110 
-[...] 
- 
-root@red:~# wget www.upb.ro 
---2013-11-23 14:​03:​22-- ​ http://​www.upb.ro/​ 
-Resolving www.upb.ro (www.upb.ro)... 141.85.166.61 
-Connecting to www.upb.ro (www.upb.ro)|141.85.166.61|:​80... connected. 
-HTTP request sent, awaiting response... 200 OK 
-[...] 
-2013-11-23 14:03:22 (17.3 MB/s) - `index.html'​ saved [36519] 
-</​code>​ 
- 
-Pentru afișarea atât a pachetelor de interogare cât și a celor de răspuns, rulăm comenzile de mai jos:<​code bash> 
-root@host:​~#​ tcpdump -i any ip host www.upb.ro and tcp port 80 
-[...] 
-16:​06:​25.896565 IP red.55634 > 141.85.166.61.http:​ Flags [P.], seq 1:111, ack 1, win 14600, length 110 
-16:​06:​25.896576 IP host.local.55634 > 141.85.166.61.http:​ Flags [P.], seq 1:111, ack 1, win 14600, length 110 
-16:​06:​25.896796 IP 141.85.166.61.http > host.local.55634:​ Flags [.], ack 111, win 65535, length 0 
-16:​06:​25.896805 IP 141.85.166.61.http > red.55634: Flags [.], ack 111, win 65535, length 0 
-[...] 
  
-root@red:~# wget www.upb.ro +<​hidden>​ 
---2013-11-23 14:05:36--  ​http://​www.upb.ro/​ +<​solution>​ 
-Resolving www.upb.ro (www.upb.ro)... 141.85.166.61 +Introducem regula de tip ''​DNAT''​ în lanțul ''​PREROUTING''​ pe stația ''​host''​ și validăm introducerea acestei reguli:<​code bash> 
-Connecting ​to www.upb.ro (www.upb.ro)|141.85.166.61|:80... connected. +root@host:~# iptables ​-t nat -A PREROUTING ​-i eth0 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.2:80 
-HTTP request sentawaiting response... 200 OK +root@host:​~#​ iptables -t nat -L PREROUTING -n -v 
-[...+Chain PREROUTING (policy ACCEPT 0 packets0 bytes) 
-2013-11-23 14:05:36 (77.9 MB/s) - `index.html.1' saved [36519]+ pkts bytes target ​    prot opt in     ​out ​    ​source ​              ​destination ​         
 +    2   120 DNAT       ​tcp ​ --  eth0   ​* ​      0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:192.168.1.2:80
 </​code>​ </​code>​
 +Accesăm URL-ul %%http://<​adresa-ip-mv>:​8080/​index.html%% din browser-ul grafic (Firefox, Chrome) de pe stația fizică și apare mesajul //​Laboratorul 10 - pe red//.
 </​solution>​ </​solution>​
 +</​hidden>​
rl/labs/09/contents/02.1385455042.txt.gz · Last modified: 2013/11/26 10:37 by razvan.deaconescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0