Firewall a NAT
Cvičení
Tato kapitola byla poněkud teoretická a i když obsahovala řadu příkladů, nic není lepší, než si teorii vyzkoušet v labu. Návrhy následujících cvičení vychází z labu, který jsme nastavili na konci minulé kapitoly, kde máme dva kontejnery, které spolu mohou komunikovat přes vyhrazenou VLAN a mají nastavené statické IP adresy na dummy rozhraních.
Bude se nám hodit nástroj nc
(netcat), který nám umožní rychle a snadno udělat TCP server a TCP klienta na konkrétních portech. Pokud nc
nemáme nainstalovaný, tak stačí apt-get install netcat
.
Mimochodem: Linux má koncept privilegovaných portů: Na portech do 1023 včetně smí poslouchat jen procesy běžící jako root. Mimo jiné i proto HTTP servery jako například Apache dělají poměrně složitou rošádu s tím, že startují jako root, otevřou si socket na poslouchání na portu 80/tcp a pak se vzdají root privilegií a běží po zbytek času pod neprivilegovaným uživatelem. Pro nás to neznamená omezení, protože stejně v kontejnerech pracujeme jako root, ale hodí se to vědět.
Jednoduchý TCP server na portu 2345 spustíme pomocí (předem si ještě zjistíme IP adresu):
root@c1:~# ip addr
...
2: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
...
inet 10.0.3.9/24 brd 10.0.3.255 scope global dynamic eth0
root@c1:~# nc -l -p 2345
A připojíme se podobně snadno a vskutku program funguje jako cat
co však nevypisuje obsah souborů na STDOUT a nezapisuje STDIN do souboru, nýbrž přijímá a posílá data přes síťový socket a co přijme vypíše na STDOUT a co přečte ze STDIN to pošle po síti. Napíšeme si tedy pár zpráv:
root@c2:~# nc 10.0.3.9 2345
Test z c2...
Test z c1...
<Ctrl+C>
a
root@c1:~# nc -l -p 2345
Test z c2...
Test z c1...
<Ukončení streamu>
Tento nástroj můžeme snadno použít k testování pravidel v následujících namětech na lab:
- Nastavte na c1 i c2 policy pro filtrer INPUT a FORWARD na DROP.
- Nastavte na c1 i c2 povolení pro odpovědi na navázaná spojení a vyzkoušejte na spojení do Internetu.
- Povolte na c1 i c2 provoz na a z loopback rozhraní a vyzkoušejte (
ping 127.0.0.1
). - Povolte ICMP a ICMPv6 a vyzkoušejte (
ping
na adresu c1 z c2 a naopak). - Povolte připojení z c2 na c1 na port 2345/tcp a vyzkoušejte pomocí netcatu.
- Vyzkoušejte přesměrování (DNAT) portu 2345/tcp na oblíbený HTTP server a zkuste stáhnout index.html pomocí utility
curl
nebowget
- nezapomeňte na to, že tohle bude fungovat jen pokud přes router, který dělá přesměrování jdou oba směry komunikace, nejlepší místo tedy bude přímo na VM, pokud to není jasné proč, zkuste si nakreslit obrázek a nebo nastavte přesměrování na c1, zkuste se na něj připojit z c2 a sledujte pomocítcpdumpu
s jakými adresami přichází odpovědi. - Vyzkoušejte scénář s aspoň třemi kontejnery, kde všechny kontejnery budou propojeny privátní VLAN a jen jeden kontejner bude firewall a NAT GW pro ostatní, nastavte SNAT, aby se kontejnery dostaly do Internetu a DNAT tak, aby se VM dalo připojit na
nc
server na některém z kontejnerů, zároveň kontejnery zabezpečte analogicky dle prvních čtyř cvičení.