This shows you the differences between two versions of the page.
rl:labs:09:contents:02 [2022/12/13 11:02] florin.stancu [02. [10p] Format de pachete la translatare] |
rl:labs:09:contents:02 [2023/11/05 13:06] (current) vlad_iulius.nastase |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ==== 02. [10p] Format de pachete la translatare ==== | + | ==== 02. [10p] Port forwarding pentru accesare serviciu web ==== |
- | Ne propunem să 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ți 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-ul) prin 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.8) 56(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> | + | |
- | <note> | + | [your.name@fep-62-2 ~]$ curl http://10.9.X.Y:8080 |
- | Atunci când rulăm comanda ''tcpdump'' secvența de urmat este: | + | |
- | - Se rulează comanda ''tcpdump'' cu opțiunile aferente într-un terminal, activând astfel captura de pachete. Utilitarul ''tcpdump'' așteaptă acum transmiterea de pachete pe interfețele pe care ascultă. | + | |
- | - Într-un alt terminal se rulează o comandă specifică unui client de rețea care generează trafic. | + | |
- | - Se revine în terminalul în care rulează comanda ''tcpdump'' și se urmăresc pachetele capturate. | + | |
- | - Când nu mai este nevoie de utilitarul ''tcpdump'' se întrerupe captura de pachete folosind combinația de taste ''Ctrl+c''. | + | |
- | </note> | + | |
- | + | ||
- | Pentru a urmări traficul, pe stația ''host'' rulăm comanda<code bash> | + | |
- | root@host:~# tcpdump -n -i eth0 ip dst host 8.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 > 8.8.8.8: ICMP echo request, id 625, seq 6, length 64 | + | |
- | 12:59:21.977708 IP host > 8.8.8.8: ICMP echo request, id 625, seq 7, length 64 | + | |
</code> | </code> | ||
- | <spoiler (click pentru expandare) Detalii rulare masina virtuala VMware local> | + | <hidden> |
- | <note important> | + | <solution> |
- | După rularea comenzii de mai sus, probabil vi se va bloca terminalul. În mașina virtuală VMware apare o mini-fereastră care vă indică intrarea plăcii de rețea în modul //promiscuous//. Apăsați pe butonul ''OK'' al ferestrei pentru a debloca mașina virtuală și, astfel, terminalul. | + | Introducem regula de tip ''DNAT'' în lanțul ''PREROUTING'' pe stația ''host'' și validăm introducerea acestei reguli:<code bash> |
- | </note> | + | root@host:~# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.2:80 |
- | </spoiler> | + | root@host:~# iptables -t nat -L PREROUTING -n -v |
- | + | Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) | |
- | 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''. | + | 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 | |
- | 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 -n -i veth-red ip dst host 8.8.8.8 | + | |
- | tcpdump: verbose 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 > 8.8.8.8: ICMP echo request, id 626, seq 6, length 64 | + | |
- | 13:01:13.559726 IP red > 8.8.8.8: ICMP 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|]]. | + | 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> | |
- | 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> | + | </hidden> |
- | root@host:~# tcpdump -n -i any ip dst host 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 > 8.8.8.8: ICMP echo request, id 707, seq 237, length 64 | + | |
- | 10:23:07.632430 IP host > 8.8.8.8: ICMP echo request, id 707, seq 237, length 64 | + | |
- | 10:23:08.633936 IP red > 8.8.8.8: ICMP echo request, id 707, seq 238, length 64 | + | |
- | 10:23:08.633954 IP host > 8.8.8.8: 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 host 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ă rezolvarea 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> | + |