This shows you the differences between two versions of the page.
rl:labs:09:contents:05 [2013/11/29 10:03] razvan.deaconescu [05. [10p] Port forwarding] |
rl:labs:09:contents:05 [2023/11/05 13:08] (current) vlad_iulius.nastase |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ==== 05. [10p] Port forwarding ==== | + | ==== 05. [5p] Accesare URL conținând caractere speciale ==== |
- | La exercițiile de până acum am folosit NAT pentru a permite stațiilor cu adrese private dintr-o rețea locală să acceseze Internetul. NAT poate fi folosit și pentru a permite unei stații din rețeaua locală să fie accesată din Internet, adică să se inițieze conexiuni din Internet. Acest proces poartă numele de //port forwarding//. | + | Unele URL-uri pot avea caractere interpretate special în shell rezultând într-un comportament ciudat la descărcare. |
- | Dorim să putem accesa prin SSH, din Internet, stația ''red''. Acest lucru nu este posibil în mod implicit întrucât stația ''red'' are adresă IP privată. Soluția este "deschiderea unui port" pe gateway (adică stația ''host'') și redirectarea acestui port (//port forwarding//) către portul aferent serviciului SSH (portul TCP ''22'') de pe stația ''red''. | + | Pentru a evidenția acest lucru, pe stația ''host'' folosiți pentru a descărca resursa de la link-ul ''%%http://localhost/login.php?name=Lab10&email=rl@upb.ro%%'':<code bash> |
+ | root@host:~# wget http://localhost/login.php?name=Lab10&email=rl@upb.ro | ||
+ | [1] 3284 | ||
+ | root@host:~# --2013-12-05 09:02:10-- http://localhost/login.php?name=Lab10 | ||
+ | Resolving localhost (localhost)... 127.0.0.1 | ||
+ | Connecting to localhost (localhost)|127.0.0.1|:80... connected. | ||
+ | HTTP request sent, awaiting response... 200 OK | ||
+ | Length: 72 [text/html] | ||
+ | Saving to: `login.php?name=Lab10' | ||
- | Vom aplica pe stația ''host'' o regulă prin care redirectăm traficul ce vine către ''host'' pe portul ''10022'' către portul ''22'' (SSH) al stației ''red'' (adresa IP ''192.168.1.2''):<code bash> | + | 100%[======================================>] 72 --.-K/s in 0s |
- | root@host:~# iptables -t nat -A PREROUTING -p tcp --dport 10022 -j DNAT --to-destination 192.168.1.2:22 | + | |
- | </code> | + | |
- | Verificăm aplicarea regulii prin consultarea lanțului ''PREROUTING'' din tabela NAT:<code bash> | + | 2013-12-05 09:02:10 (13.3 MB/s) - `login.php?name=Lab10' saved [72/72] |
- | root@host:~# iptables -t nat -L PREROUTING -n -v | + | |
- | Chain PREROUTING (policy ACCEPT 1 packets, 474 bytes) | + | |
- | pkts bytes target prot opt in out source destination | + | [1]+ Done wget http://localhost/login.php?name=Lab10 |
- | 0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:10022 to:192.168.1.2:22 | + | root@host:~# |
</code> | </code> | ||
- | Pentru a verifica rezultatul de mai sus, de pe sistemul fizic (stația fizică, ''mjolnir'') deschidem un nou terminal și ne conectăm prin SSH folosind portul ''10022'' la stația ''host'':<code bash> | + | <note tip> |
- | student@mjolnir:~$ ssh -l root $ADRESA_IP_MV -p 10022 | + | După output-ul comenzii de mai, pentru a vă reapărea prompt-ul consolei, apăsați pe ''Enter'' ca să vă reapară prompt-ul. |
- | root@192.168.138.129's password: | + | </note> |
- | [...] | + | |
- | root@red:~# | + | |
- | </code> unde ''$ADRESA_IP_MV'' este adresa interfeței ''eth0'' a stației ''host''. | + | |
- | Observăm că în urma autentificării ne găsim pe stația ''red''. //Port forwarding// a funcționat. | + | Observați că procesul intră în background (linia cu ''[1] 3284'' înseamnă că a fost pornit un job). Acest lucru se întâmplă întrucât simbolul ''&'' (//ampersand//) nu este escapat și se folosește rolul său special din shell: pornirea unui proces în background. Se observă din output că este separată comanda înainte de ''&'', adică rezultă comanda ''wget http://localhost/login.php?name=Lab10''. |
- | Folosim comanda de conectare SSH de mai sus de pe stația ''green'':<code bash> | + | Ștergeți fișierul descărcat prin comanda de mai sus:<code bash> |
- | root@green:~# ssh -l root $ADRESA_IP_MV -p 10022 | + | root@host:~# ls |
- | [...] | + | PacketTracer5 folder login.php?name=Lab10 |
- | root@red:~# | + | root@host:~# rm login.php\?name\=Lab10 |
+ | root@host:~# ls | ||
+ | PacketTracer5 folder | ||
</code> | </code> | ||
- | Observăm că și de pe stația ''green'' am accesat stația ''red'' prin //port forwarding//. Dorim să limităm //port forwarding// doar pentru conexiuni de la stațiile din Internet. Pentru aceasta trebuie să actualizăm regula de //port forwarding//. | + | Folosiți [[http://steve-parker.org/sh/escape.shtml|escaping în shell]] pentru a folosi în mod corect URL-ul și pentru a descărca resursa disponibilă la acel link. |
- | Ștergeți regula de //port forwarding// și adăugați o regulă nouă care să permită **doar** stațiilor din Internet să acceseze prin //port forwarding// stația ''red''. | + | Fișierul final descărcat trebuie să arate în acest fel (să conțină //Lab10// și //rl@upb.ro//). Folosiți ''cat log<TAB>'' pentru rula comanda de mai jos, ca să obțineți //autocompletion// din partea shell-ului (''<TAB>'' înseamnă apăsarea tastei ''TAB''):<code bash> |
+ | root@host:~# cat login.php\?name\=Lab10\&email\=rl@upb.ro | ||
+ | <html> | ||
+ | <body> | ||
- | <note tip> | + | Welcome Lab10<br> |
- | Aplicați regula doar pentru pachetele ce **sosesc** pe interfața ''eth0''. Adică ''eth0'' este interfața de **intrare**. Folosiți opțiunea ''-i'' a ''iptables'' pentru precizarea interfeței de **intrare**. | + | Your email address is: rl@upb.ro |
- | </note> | + | </body> |
- | + | </html> | |
- | Realizați apoi din nou conectare SSH pe portul ''10022'' al stației ''host'' de pe stația fizică și de pe stația ''green''. Dacă ați configurat corect, nu va merge conexiunea SSH de pe stația ''green'' dar va merge în continuare de pe stația fizică. | + | </code> |
- | <solution -hidden> | + | <hidden> |
- | Ștergem vechea regulă și aplicăm regula nouă, ce ține cont de interfața de intrare:<code bash> | + | <solution> |
- | root@host:~# iptables -t nat -D PREROUTING -p tcp --dport 10022 -j DNAT --to-destination 192.168.1.2:22 | + | Cel mai simplu este să plasăm întregul URL între apostroafe:<code bash> |
- | root@host:~# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 10022 -j DNAT --to-destination 192.168.1.2:22 | + | root@host:~# wget 'http://localhost/login.php?name=Lab10&email=rl@upb.ro' |
- | root@host:~# iptables -t nat -L PREROUTING -n -v | + | |
- | Chain PREROUTING (policy ACCEPT 1 packets, 474 bytes) | + | |
- | pkts bytes target prot opt in out source destination | + | |
- | 0 0 DNAT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:10022 to:192.168.1.2:22 | + | |
</code> | </code> | ||
- | Verificăm conectarea de la stația fizică și de la stația ''green''. Prima merge în continuare, dar a doua nu mai merge:<code bash> | + | Resursa de la acel URL se va descărca în mod corect:<code bash> |
- | student@mjolnir:~$ ssh $ADRESA_IP_VM -p 10022 | + | root@host:~# cat /var/www/login.php |
- | root@host.local's password: | + | <html> |
- | [...] | + | <body> |
- | root@red:~# | + | |
- | root@green:~# ssh -l root 192.168.56.101 -p 10022 | + | Welcome <?php echo $_GET["name"]; ?><br> |
- | ssh: connect to host 192.168.56.101 port 10022: Connection refused | + | Your email address is: <?php echo $_GET["email"]; ?> |
+ | </body> | ||
+ | </html> | ||
</code> | </code> | ||
</solution> | </solution> | ||
+ | </hidden> |