This shows you the differences between two versions of the page.
rl:labs:11:contents:07 [2019/01/12 09:48] flavia.oprea [07. [15p] Filtrare de trafic între containere] |
rl:labs:11:contents:07 [2024/01/08 03:27] (current) viorel.mocanu [07. [30p] Instanțe Compute Engine] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ==== 07. [15p] Filtrare de trafic între containere ==== | + | ==== 07. [30p] Instanțe Compute Engine ==== |
- | Pe configurația de la exercițiul anterior puteți configura reguli de firewall folosind utilitarul ''iptables'' pe stația ''host''. Acum stația ''host'' are rol de gateway și va prelucra toate pachetele trimise între containere. | + | În pagina de start a Google Cloud avem un buton **Create a VM**. |
- | Realizați o configurație de firewall astfel încât serviciile nesigure (telnet, FTP, pe porturile implicite) să fie blocate pe containere. De asemenea, stația ''green'' nu poate fi accesată de pe stația ''blue'' prin SSH (dar poate fi accesată de pe stația ''red'' și de pe stația ''host''). Pentru informații de utilizare a utilitarului ''iptables'' pentru filtrare, urmăriți [[rl:labs:08]]. | + | Prima data creăm instanța **Host**. |
- | <note important> | + | Vom selecta următoarele configurații: |
- | Pentru regulile ''iptables'' aveți două opțiuni: | + | |
- | * folosiți numele interfețelor de intrare ieșire (opțiunile ''-i'' și ''-o'') | + | În secțiunea //Machine configuration//: **e2-small**. |
- | * folosiți adresele IP sursă și destinație | + | |
- | **Nu** folosiți numele stațiilor; adică nu folosiți șirurile ''red'', ''green'' și ''blue'' în regulile ''iptables''. | + | În secțiunea //Boot Disk// alegeți imaginea sistemului de operare: **Ubuntu 22.04 x86_64**. |
+ | |||
+ | |||
+ | {{ :rl:labs:12:contents:boot-disk.png?600 }} | ||
+ | |||
+ | Expandând secțiunea //Advanced options// putem accesa secțiunea //Networking//. | ||
+ | |||
+ | În această secțiune setăm tipul de interfață de rețea ( gVNIC sau VirtIO ). | ||
+ | |||
+ | <note tip>**gVNIC** - Google Virtual NIC este un tip de interfață virtuală de rețea creat pentru Compute Engine ca alternativă la virtIO, oferind performanțe mai bune și o mai bună consistență.</note> | ||
+ | |||
+ | Alegem VPC-ul corespunzător creat anterior. | ||
+ | |||
+ | În meniul de selecție pentru adresa IP internă ( **Primary internal IPv4 address** ) putem selecta ca adresă IP fie o adresă de tip efemer, fie una custom. Adresele IP de tip efemer nu se vor schimba dacă instanța va fi oprită sau repornită, se schimbă doar în cazul în care instanța va fi ștearsă. | ||
+ | |||
+ | În meniul de selecție pentru adresa IP externă ( **External IPv4 address** ) vom folosi adresa IP creată la exercițiul anterior **doar pentru interfața către internet**, pentru celelalte interfețe nu vom adaugă nicio adresa publică. În cazul în care această nu apare, vom crea altă adresa IP publică. | ||
+ | |||
+ | {{ :rl:labs:12:contents:host-vpcs.png?600 }} | ||
+ | |||
+ | |||
+ | Pentru a ne putea conecta pe instanțele create prin SSH avem două modalități. | ||
+ | |||
+ | Prima modalitate este să folosim conectarea din browser, GCP va genera automat chei de ssh pentru terminalul din browser, iar numele de utilizator creat implicit pe instanță este numele de utilizator aferent Google (Ex. **popescuion@gmail.com** va avea utilizatorul implicit **popescuion**). | ||
+ | |||
+ | A doua modalitate este utilizarea de chei proprii de SSH, le puteți salva în secțiunea **Security -> Manage Access -> Add Item** fie în momentul în care creați mașina virtuală, fie editând detaliile ulterior. Nu adăugați chei de ssh pentru utilizatorul implicit folosind terminalul pentru că vor fi șterse. Această metodă necesită creare unor chei de SSH în prealabil. | ||
+ | |||
+ | <note warning> | ||
+ | Odată adăugată cheia, GCP va crea și un utilizator nou, la fel că cel menționat în cheie. De exemplu, dacă cheia are formatul **<CHEIE_PUBLICA> andrei@hostname-andrei**, atunci GCP va crea un nou utilizator andrei pe care îl puteți folosi să va conectați prin SSH. | ||
</note> | </note> | ||
- | <solution> | + | {{ :rl:labs:12:contents:ssh-keys.png?600 }} |
- | Configurăm, pe stația ''host'' regulile de filtrare aferente:<code bash> | + | |
- | root@host:~# iptables -A FORWARD ! -o eth0 -p tcp --dport 23 -j REJECT | + | |
- | root@host:~# iptables -A FORWARD ! -o eth0 -p tcp --dport 21 -j REJECT | + | |
- | root@host:~# iptables -A FORWARD -i veth-blue -o veth-green -p tcp --dport 22 -j REJECT | + | |
- | root@host:~# iptables -L FORWARD -n -v | + | |
- | Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) | + | |
- | pkts bytes target prot opt in out source destination | + | |
- | 0 0 REJECT tcp -- * !eth0 0.0.0.0/0 0.0.0.0/0 tcp dpt:23 reject-with icmp-port-unreachable | + | |
- | 0 0 REJECT tcp -- * !eth0 0.0.0.0/0 0.0.0.0/0 tcp dpt:21 reject-with icmp-port-unreachable | + | |
- | 0 0 REJECT tcp -- veth-blue veth-green 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 reject-with icmp-port-unreachable | + | |
- | </code> | + | |
- | Apoi verificăm configurația prin conectare de pe fiecare container către celelalte containere:<code bash> | ||
- | root@red:~# telnet 20.20.20.2 23 | ||
- | Trying 20.20.20.2... | ||
- | telnet: Unable to connect to remote host: Connection refused | ||
- | root@red:~# telnet 20.20.20.2 21 | ||
- | Trying 20.20.20.2... | ||
- | telnet: Unable to connect to remote host: Connection refused | ||
- | root@red:~# ssh 20.20.20.2 | ||
- | [...] | ||
- | root@green:~# | ||
- | root@red:~# telnet 30.30.30.2 21 | ||
- | Trying 30.30.30.2... | ||
- | telnet: Unable to connect to remote host: Connection refused | ||
- | root@red:~# telnet 30.30.30.2 23 | ||
- | Trying 30.30.30.2... | ||
- | telnet: Unable to connect to remote host: Connection refused | ||
- | root@red:~# ssh 30.30.30.2 | ||
- | [...] | ||
- | root@blue:~# | ||
- | root@blue:~# ssh 10.10.10.2 | + | Continuăm cu celelalte instanțe **Blue**, **Red** și **Green**. |
- | [...] | + | |
- | root@red:~# | + | |
- | root@blue:~# ssh 20.20.20.2 | + | În secțiunea //Machine configuration//: **e2-small**. |
- | ssh: connect to host 20.20.20.2 port 22: Connection refused | + | |
+ | În secțiunea //Boot Disk// alegeți imaginea sistemului de operare: **Ubuntu 22.04 x86_64**. | ||
+ | |||
+ | Expandând secțiunea //Advanced options// putem accesa secțiunea //Networking//. | ||
+ | |||
+ | În meniul de selecție pentru adresa IP internă ( **Primary internal IPv4 address** ) vom selecta adresa de tip efemer. | ||
+ | |||
+ | În meniul de selecție pentru adresa IP externă ( **External IPv4 address** ) nu vom selecta nicio adresă, folosind **None**. | ||
+ | |||
+ | În cazul în care ați adăugat cheia de SSH publică pe toate cele 4 instanțe, vă puteți loga pe instanța **Host** folosind adresa IP publică a acesteia. În cazul în care folosiți (recomandat) și un agent ssh, puteți adăuga la comanda ssh și opțiunea -A, iar ulterior vă puteți loga de pe instanța **Host** pe celelalte 3. | ||
+ | <code bash> | ||
+ | ssh -i [private_key] <google-username>@[ip_public] -A | ||
</code> | </code> | ||
- | Observăm că porturile 21 și 23 (aferente telnet și FTP) sunt filtrate; la fel și comunicația SSH între stația ''blue'' și ''green''. Cerințele exercițiul sunt satisfăcute. | + | Pentru a ne putea conecta prin ssh de pe **Host** și la celelalte instanțe fără a utiliza ssh-agent, va trebui să copiem cheia privată de pe stația locală pe **Host**: |
- | </solution> | + | |
+ | <code bash> | ||
+ | # pe Linux: | ||
+ | scp -i [private_key] [private_key] <google-username>@[ip_public]:~ | ||
+ | </code> | ||
+ | (pe Windows, puteți folosi WinSCP) | ||
+ | |||
+ | Verificați conectivitatea la Internet pe cele 4 instanțe (**Host**, **Red**, **Green**, **Blue**). |