This shows you the differences between two versions of the page.
rl:labs:09:contents:04 [2013/11/26 11:13] razvan.deaconescu [04. Tutorial port forwarding (DNAT)] |
rl:labs:09:contents:04 [2024/12/04 17:52] (current) laura.ruse [04. [15p] Descărcare recursivă de resurse web] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ==== 05. Port forwarding ==== | + | ==== 04. [15p] Descărcare recursivă de resurse web ==== |
- | 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//. | + | La adresa ''%%http://red/folder%%'' se află o structură de directoare și fișiere. Pe stația ''host'', descărcați întreaga structură folosind o singură comandă ''wget'' cu parametrul corespunzător. |
- | 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''. | + | <note tip> |
+ | Pentru a identifica opțiunea corespunzătoare, căutați în pagina de manual a ''wget'' după șirul ''recursive''. | ||
+ | </note> | ||
- | 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> | + | Folosiți utilitarul ''tree'' pentru a lista conținutul directorului descărcat. Este posibil ca pachetul ''tree'' să fie deja instalat pe ''host''. Dacă nu este instalat, atunci puteți folosi următoarea comandă pentru a-l instala: |
- | root@host:~# iptables -t nat -A PREROUTING -p tcp --dport 10022 -j DNAT --to-dest red:22 | + | <code bash> |
+ | root@host:~# apt-get install tree | ||
</code> | </code> | ||
- | Verificăm aplicarea regulii prin consultarea lanțului ''PREROUTING'' din tabela NAT:<code bash> | + | Când rulați ''tree'' pe directorul descărcat observați prezența mai multor fișiere cu nume de forma ''index.html?C=S;O=D''. Aceste fișiere sunt fișiere de tip directory listing generate de serverul web și nu avem nevoie de ele. Ștergeți structura de directoare pe care tocmai ați descărcat-o pe stația ''host'' și descărcați-o din nou ignorând aceste fișiere. |
- | 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 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:10022 to:192.168.1.2:22 | + | |
- | </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 | + | Urmăriți discuția de [[http://stackoverflow.com/questions/273743/using-wget-to-recursively-fetch-a-directory-with-arbitrary-files-in-it|aici]]. Să aveți în vedere și partea din discuția care conține șirul //%%"without the hostname"%%//. |
- | 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. | + | Structura de directoare trebuie să fie similară cu:<code> |
+ | root@host:~# tree folder/ | ||
+ | folder/ | ||
+ | ├── embedded | ||
+ | │ ├── Qualcomm | ||
+ | │ │ ├── Krait | ||
+ | │ │ │ └── info.txt | ||
+ | │ │ └── Scorpion | ||
+ | │ │ └── info.txt | ||
+ | │ └── TI | ||
+ | │ ├── OMAP3 | ||
+ | │ │ └── info.txt | ||
+ | │ └── OMAP4 | ||
+ | │ └── info.txt | ||
+ | └── mobile | ||
+ | ├── Apple | ||
+ | │ ├── iPadAir | ||
+ | │ │ └── info.txt | ||
+ | │ └── iPhone5S | ||
+ | │ └── info.txt | ||
+ | |||
+ | ├── Nexus4 | ||
+ | │ └── info.txt | ||
+ | └── Nexus7 | ||
+ | └── info.txt | ||
- | Folosim comanda de conectare SSH de mai sus de pe stația ''green'':<code bash> | + | 14 directories, 8 files |
- | root@green:~# ssh -l root $ADRESA_IP_MV -p 10022 | + | |
- | [...] | + | |
- | root@red:~# | + | |
</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//. | + | <hidden> |
- | + | <solution> | |
- | Ș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''. | + | Pentru descărcarea inițială folosim comanda ''wget'' cu opțiunea ''-r'' apoi rulăm ''tree'':<code bash> |
- | + | root@host:~# wget -r http://red/folder/ | |
- | <note tip> | + | [...] |
- | Aplicați regula doar pentru pachetele ce **sosesc** pe interfața ''eth0''. Adică ''eth0'' este interfața de **intrare**. | + | root@host:~# tree red/ |
- | </note> | + | [...] |
- | + | ||
- | <solution -hidden> | + | |
- | Ștergem vechea regulă și aplicăm regula nouă, ce ține cont de interfața de intrare:<code bash> | + | |
- | root@host:~# iptables -t nat -D PREROUTING -p tcp --dport 10022 -j DNAT --to-destination 192.168.1.2:22 | + | |
- | root@host:~# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 10022 -j DNAT --to-destination 192.168.1.2:22 | + | |
- | 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> | + | Ștergem vechea structură:<code bash> |
- | student@mjolnir:~$ ssh $ADRESA_IP_VM -p 10022 | + | root@host:~# rm -fr folder/ |
- | root@host.local's password: | + | </code> |
- | [...] | + | Ca să avem un output mai aranjat, rulăm următoarea comandă ''wget'':<code bash> |
- | root@red:~# | + | root@host:~# wget -r -nH -np --reject "index.html*" http://red/folder/ |
- | + | ||
- | root@green:~# ssh -l root 192.168.56.101 -p 10022 | + | |
- | ssh: connect to host 192.168.56.101 port 10022: Connection refused | + | |
</code> | </code> | ||
+ | Se vor descărca astfel doar fișierele utile, cele existente în structura de directoare de pe server. | ||
</solution> | </solution> | ||
+ | </hidden> |