This shows you the differences between two versions of the page.
rl:labs:09:contents:02 [2013/12/04 08:31] mariana.marasoiu [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 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> | + | |
- | Pentru a urmări traficul, pe stația ''host'' rulăm comanda<code bash> | + | |
- | root@host:~# tcpdump -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.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.com: ICMP 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 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 > 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.com: 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|]]. | ||
- | 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 -i any ip dst host 8.8.8.8 | + | <solution> |
- | tcpdump: verbose output suppressed, use -v or -vv for full protocol decode | + | Introducem regula de tip ''DNAT'' în lanțul ''PREROUTING'' pe stația ''host'' și validăm introducerea acestei reguli:<code bash> |
- | listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes | + | root@host:~# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.2:80 |
- | 10:23:07.632412 IP red > google-public-dns-a.google.com: ICMP echo request, id 707, seq 237, length 64 | + | root@host:~# iptables -t nat -L PREROUTING -n -v |
- | 10:23:07.632430 IP host.local > google-public-dns-a.google.com: ICMP echo request, id 707, seq 237, length 64 | + | Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) |
- | 10:23:08.633936 IP red > google-public-dns-a.google.com: ICMP echo request, id 707, seq 238, length 64 | + | pkts bytes target prot opt in out source destination |
- | 10:23:08.633954 IP host.local > google-public-dns-a.google.com: ICMP echo request, id 707, seq 238, length 64 | + | 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//. | |
- | Î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''). | + | </solution> |
- | + | </hidden> | |
- | 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ă 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> | + |