This shows you the differences between two versions of the page.
rl:labs:08:contents:11 [2020/12/01 10:45] iulia.florea removed |
rl:labs:08:contents:11 [2023/11/05 12:57] (current) vlad_iulius.nastase |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ==== 9. [10p] Permitere trafic SSH ==== | + | ==== 11. [BONUS - 10p] Translatare selectivă de adrese ==== |
- | În acest moment, traficul de la stația ''red'' către celelalte stații din rețea este blocat. | + | Pentru situația în care adresa IP exterioară a gateway-ului este adresă statică (nu dinamică) se recomandă folosirea acțiunii ''SNAT'' în loc de ''MASQUERADE'' la translatarea de adrese. Pe lângă aceasta, SNAT are avantajul precizării unui spațiu de adrese care să fie noile adrese (cele substituite) și a porturilor. |
- | Dorim să permitem traficul SSH **de la** stația ''red'' **către** stația ''green''. Adăugați o regulă corespunzătoare pe stația ''host''. | + | <note tip> |
+ | Informații despre folosirea ''SNAT'' și diferența dintre ''SNAT'' și ''MASQUERADE'' găsiți [[http://www.netfilter.org/documentation/HOWTO/NAT-HOWTO-6.html|aici]]. | ||
+ | </note> | ||
- | <hidden> | + | Ștergeți regula anterioară de tip ''MASQUERADE'' și folosiți reguli de tip ''SNAT'' pentru a face următoarele translatări: |
- | <solution> | + | * conexiunile TCP către Internet de la stația ''red'' să iasă prin porturi din spațiul ''45000-50000''; |
- | <code bash> | + | * conexiunile TCP către Internet de la stația ''green'' să iasă prin porturi din spațiul ''50000-55000''; |
- | root@host:~# iptables -A FORWARD -s red -d green -p tcp --dport ssh -j ACCEPT | + | * conexiunile TCP către Internet de la stația ''blue'' să iasă prin porturi din spațiul ''55000-60000''; |
- | </code> | + | * toate celelalte conexiuni să fie realizate în mod obișnuit, având ca adresă sursă adresa IP de exterior a stației ''host'' (această regulă trebuie să fie ultima). |
- | </solution> | + | |
- | </hidden> | + | |
- | După ce ați adăugat regula, încercați realizarea unei conexiuni SSH de la stația ''red'' la stația ''green''. Observați că nu se realizează conexiunea. | + | Verificați translatarea corectă inițiind conexiuni HTTP (folosind ''wget'') către ''cs.pub.ro'' de pe fiecare dintre cele trei stații de tip container (''red'', ''green'' și ''blue'') și folosind ''tcpdump'' pe stația ''host'' pentru a captura traficul aferent. |
<hidden> | <hidden> | ||
<solution> | <solution> | ||
- | <code bash> | + | Ștergem regula de tip ''MASQUERADE'', adăugăm cele patru reguli de tip ''SNAT'' și verificăm prezența acestora în tabela ''nat'':<code bash> |
- | root@red:~# ssh green | + | root@host:~# iptables -t nat -F POSTROUTING |
- | ^C | + | root@host:~# iptables -t nat -A POSTROUTING -s 192.168.1.2 -p tcp -o eth0 -j SNAT --to-source 192.168.56.101:45000-50000 |
- | </code> | + | root@host:~# iptables -t nat -A POSTROUTING -s 192.168.2.2 -p tcp -o eth0 -j SNAT --to-source 192.168.56.101:50000-55000 |
- | </solution> | + | root@host:~# iptables -t nat -A POSTROUTING -s 192.168.3.2 -p tcp -o eth0 -j SNAT --to-source 192.168.56.101:55000-60000 |
- | </hidden> | + | root@host:~# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.56.101 |
- | + | root@host:~# iptables -t nat -L POSTROUTING -n -v | |
- | Afișați lista de reguli ''iptables'' de pe stația ''host''. De ce nu a reușit conexiunea? Țineți cont de ordinea regulilor afișate; sunt parcurse secvențial. | + | Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) |
- | + | ||
- | <hidden> | + | |
- | <solution> | + | |
- | <code bash> | + | |
- | root@host:~# iptables -L FORWARD -n -v | + | |
- | root@host:~# iptables -L FORWARD -n -v | + | |
- | Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) | + | |
pkts bytes target prot opt in out source destination | pkts bytes target prot opt in out source destination | ||
- | 6 360 REJECT all -- * * 192.168.1.2 0.0.0.0/0 reject-with icmp-port-unreachable | + | 0 0 SNAT tcp -- * eth0 192.168.1.2 0.0.0.0/0 to:192.168.56.101:45000-50000 |
- | 0 0 ACCEPT tcp -- * * 192.168.1.2 192.168.2.2 tcp dpt:22 | + | 0 0 SNAT tcp -- * eth0 192.168.2.2 0.0.0.0/0 to:192.168.56.101:50000-55000 |
+ | 0 0 SNAT tcp -- * eth0 192.168.3.2 0.0.0.0/0 to:192.168.56.101:55000-60000 | ||
+ | 0 0 SNAT all -- * eth0 0.0.0.0/0 0.0.0.0/0 to:192.168.56.101 | ||
</code> | </code> | ||
- | Regulile sunt parcurse secvențial. Conform primei reguli, tot traficul transmis de stația ''red'' este blocat. A doua regulă nu mai este parcursă. Trebuie să mutăm a doua regulă pe prima poziție. | ||
- | </solution> | ||
- | </hidden> | ||
- | |||
- | Pentru rezolvarea problemei ștergeți regula ''iptables'' introdusă anterior și **inserați** regula pe stația ''host''. Pentru inserare folosiți opțiunea ''-I'' a comenzii ''iptables''. Verificați că acum conexiunea SSH între ''red'' și ''green'' va fi realizată. | ||
- | |||
- | <note hint> | ||
- | Pentru a șterge o regulă puteți folosi opțiunea ''-D'' așa cum ați făcut și la [[:rl:labs:08:contents:04|exercițiul 4]]. | ||
- | |||
- | Pentru a insera o regulă folosiți opțiunea ''-I'' urmată de numele lanțului (''INPUT'', ''OUTPUT'' sau ''FORWARD''), urmată de indexul poziției unde doriți plasată regulă (1, 2, 3, ...) și apoi urmată de specificarea regulii. | ||
- | </note> | ||
- | |||
- | <hidden> | ||
- | <solution> | ||
- | <code bash> | ||
- | root@host:~# iptables -D FORWARD -s red -d green -p tcp --dport ssh -j ACCEPT | ||
- | root@host:~# iptables -I FORWARD -s red -d green -p tcp --dport ssh -j ACCEPT | ||
- | |||
- | 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 ACCEPT tcp -- * * 192.168.1.2 192.168.2.2 tcp dpt:22 | ||
- | 6 360 REJECT all -- * * 192.168.1.2 0.0.0.0/0 reject-with icmp-port-unreachable | ||
- | |||
- | root@red:~# ssh -l student green | ||
- | student@green's password: | ||
- | Welcome to Ubuntu 12.04.3 LTS (GNU/Linux 3.2.0-53-generic-pae i686) | ||
- | * Documentation: https://help.ubuntu.com/ | + | Pornim ''tcpdump'' pentru a captura mesaje destinate ''cs.pub.ro'' pe portul ''80'', aferent HTTP:<code bash> |
- | Last login: Thu Nov 14 14:18:53 2013 from 192.168.1.2 | + | root@host:~# tcpdump -n -i any ip dst host cs.pub.ro and tcp dst port 80 |
- | student@green:~$ logout | + | [...] |
- | Connection to green closed. | + | 16:43:45.683809 IP 192.168.1.2.43031 > 141.85.166.61.80: Flags [.], ack 1461, win 17520, length 0 |
+ | 16:43:45.683836 IP 192.168.56.101.45000 > 141.85.166.61.80: Flags [.], ack 1461, win 17520, length 0 | ||
+ | 16:43:45.684033 IP 192.168.1.2.43031 > 141.85.166.61.80: Flags [.], ack 2921, win 20440, length 0 | ||
+ | 16:43:45.684041 IP 192.168.56.101.45000 > 141.85.166.61.80: Flags [.], ack 2921, win 20440, length 0 | ||
+ | [...] | ||
+ | 16:44:12.865807 IP 192.168.2.2.60147 > 141.85.166.61.80: Flags [.], ack 4105, win 23256, length 0 | ||
+ | 16:44:12.865811 IP 192.168.56.101.50000 > 141.85.166.61.80: Flags [.], ack 4105, win 23256, length 0 | ||
+ | 16:44:12.885166 IP 192.168.2.2.60147 > 141.85.166.61.80: Flags [.], ack 5473, win 25992, length 0 | ||
+ | 16:44:12.885175 IP 192.168.56.101.50000 > 141.85.166.61.80: Flags [.], ack 5473, win 25992, length 0 | ||
+ | [...] | ||
+ | 16:44:27.929672 IP 192.168.3.2.59957 > 141.85.166.61.80: Flags [.], ack 5473, win 25992, length 0 | ||
+ | 16:44:27.929683 IP 192.168.56.101.59957 > 141.85.166.61.80: Flags [.], ack 5473, win 25992, length 0 | ||
+ | 16:44:27.929902 IP 192.168.3.2.59957 > 141.85.166.61.80: Flags [.], ack 6841, win 28728, length 0 | ||
+ | 16:44:27.929918 IP 192.168.56.101.59957 > 141.85.166.61.80: Flags [.], ack 6841, win 28728, length 0 | ||
</code> | </code> | ||
+ | Observăm că translatarea TCP se face în spațiul de porturi definit prin regulile de mai sus. | ||
</solution> | </solution> | ||
</hidden> | </hidden> |