This shows you the differences between two versions of the page.
rl:labs:08:contents:11 [2020/12/01 16:06] iulia.florea |
rl:labs:08:contents:11 [2023/11/05 12:57] (current) vlad_iulius.nastase |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ==== 11. [BONUS - 10p] Blocare acces din Internet la rețeaua locală ==== | + | ==== 11. [BONUS - 10p] Translatare selectivă de adrese ==== |
- | Pentru simularea unei situații reale, vom considera stația ''red'' ca fiind o stație din rețeaua locală (LAN), iar stația ''green'' o stație din Internet, conectate între ele prin stația ''host'', pe post de gateway. | + | 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ă blocăm traficul TCP **inițiat** din Internet către rețeaua locală, adică traficul TCP inițiat **de la** stația ''green'' **către** stația ''red''. Traficul inițiat de stația ''red'' către stația ''green'' precum și traficul de răspuns de la stația ''green'' către stația ''red'' va fi permis. | + | <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> | ||
- | Ca exemplu practic, de pe stația ''red'' vor putea fi inițiate conexiuni SSH către stația ''green'' folosind comanda<code bash> | + | Ștergeți regula anterioară de tip ''MASQUERADE'' și folosiți reguli de tip ''SNAT'' pentru a face următoarele translatări: |
- | ssh green | + | * conexiunile TCP către Internet de la stația ''red'' să iasă prin porturi din spațiul ''45000-50000''; |
- | </code>, dar de pe stația ''green'' **nu** vor putea fi inițiate conexiuni SSH către stația ''red'' folosind comanda<code bash> | + | * conexiunile TCP către Internet de la stația ''green'' să iasă prin porturi din spațiul ''50000-55000''; |
- | ssh red | + | * 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). |
- | Configurați ''iptables'' pe stația ''host'' pentru a realiza acest lucru. | + | 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. |
- | + | ||
- | <note tip> | + | |
- | Folosiți modulul ''state'' al ''iptables''. Accesați pagina de manual ''iptables'' și căutați după ''%%--%%state''. Pe distribuțiile mai noi accesați pagina de manual ''iptables-extensions''. Pagina de manual este instalată și accesibilă pe stația ''host'', **nu** pe stațiile ''red'', ''green'' sau ''blue''. | + | |
- | </note> | + | |
<hidden> | <hidden> | ||
- | <solution -hidden> | + | <solution> |
- | Adăugăm regula care blochează traficul TCP inițiat de la stația ''green'' către stația ''red'': | + | Ș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> |
- | <code bash> | + | root@host:~# iptables -t nat -F POSTROUTING |
- | root@host:~# iptables -A FORWARD -s green -d red -p tcp -m state --state NEW -j DROP | + | 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 |
- | + | 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 | |
- | root@host:~# iptables -L -n -v | + | 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 |
- | root@host:~# iptables -L FORWARD -n -v | + | root@host:~# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.56.101 |
- | Chain FORWARD (policy ACCEPT 65 packets, 11592 bytes) | + | root@host:~# iptables -t nat -L POSTROUTING -n -v |
+ | Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) | ||
pkts bytes target prot opt in out source destination | pkts bytes target prot opt in out source destination | ||
- | 2 120 DROP tcp -- * * 192.168.2.2 192.168.1.2 tcpflags: 0x17/0x02 | + | 0 0 SNAT tcp -- * eth0 192.168.1.2 0.0.0.0/0 to:192.168.56.101:45000-50000 |
+ | 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> | ||
- | Încercăm realizarea de conexiuni SSH de la stația ''green'' la stația ''red'' (nu va funcționa) și de la stația ''red'' la stația ''green'' (va funcționa): | + | Pornim ''tcpdump'' pentru a captura mesaje destinate ''cs.pub.ro'' pe portul ''80'', aferent HTTP:<code bash> |
- | <code bash> | + | root@host:~# tcpdump -n -i any ip dst host cs.pub.ro and tcp dst port 80 |
- | root@green:~# ssh red | + | [...] |
- | ^C | + | 16:43:45.683809 IP 192.168.1.2.43031 > 141.85.166.61.80: Flags [.], ack 1461, win 17520, length 0 |
- | root@green:~# | + | 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 | |
- | root@red:~# ssh green | + | 16:43:45.684041 IP 192.168.56.101.45000 > 141.85.166.61.80: Flags [.], ack 2921, win 20440, length 0 |
[...] | [...] | ||
- | root@green:~# | + | 16:44:12.865807 IP 192.168.2.2.60147 > 141.85.166.61.80: Flags [.], ack 4105, win 23256, length 0 |
- | </code> | + | 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 | |
- | Traficul inițiat de la stația ''green'' către stația ''red'' este "capturat" de regula ''iptables'' de pe lanțul ''FORWARD'': | + | 16:44:12.885175 IP 192.168.56.101.50000 > 141.85.166.61.80: Flags [.], ack 5473, win 25992, length 0 |
- | <code bash> | + | [...] |
- | root@host:~# iptables -L FORWARD -n -v | + | 16:44:27.929672 IP 192.168.3.2.59957 > 141.85.166.61.80: Flags [.], ack 5473, win 25992, length 0 |
- | Chain FORWARD (policy ACCEPT 65 packets, 11592 bytes) | + | 16:44:27.929683 IP 192.168.56.101.59957 > 141.85.166.61.80: Flags [.], ack 5473, win 25992, length 0 |
- | pkts bytes target prot opt in out source destination | + | 16:44:27.929902 IP 192.168.3.2.59957 > 141.85.166.61.80: Flags [.], ack 6841, win 28728, length 0 |
- | 2 120 DROP tcp -- * * 192.168.2.2 192.168.1.2 tcpflags: 0x17/0x02 | + | 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> |