V našem předchozím článku o firewallu IPTables jsme si přečetli, jak přidat pravidlo firewallu pomocí „iptables -A“.
Vysvětlili jsme také, jak povolit příchozí připojení SSH. Na vysoké úrovni to zahrnuje následující 3 kroky.
- Smažte všechna existující pravidla:„iptables -F“
- Povolit pouze příchozí SSH:„iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT“
- Zahodit všechny ostatní příchozí pakety:„iptables -A INPUT -j DROP“
Výše uvedené funguje. Ale není kompletní. Jedním z problémů výše uvedených kroků je, že neomezují odchozí pakety.
Výchozí zásady řetězce
Výchozí zásada řetězce je ACCEPT. Pokud nevíte, co řetěz znamená, raději si přečtěte náš úvodní článek iptables. Výchozí zásada řetězce INPUT i OUTPUT je tedy ACCEPT. Ve výše uvedených 3 krocích jsme na konci zahodili všechny příchozí pakety (kromě příchozího ssh). Neomezili jsme však odchozí provoz.
Jak si všimnete níže, vedle všech tří názvů řetězců (INPUT, OUTPUT a FORWARD) je uvedeno „(policy ACCEPT)“. To znamená, že výchozí zásada řetězce je ACCEPT.
# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:ssh DROP all -- anywhere anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Takže zde máte dvě možnosti.
Možnost 1:Přidat pravidla upouštění
Na konci přidejte následující tři pravidla zahození, která zahodí všechny příchozí, odchozí a předávané pakety (kromě těch, která jsou definována výše těmito třemi pravidly). Pokud to uděláte, výchozí zásada řetězce je stále ACCEPT, na čemž by nemělo záležet, protože stejně na konci zahodíte všechny pakety.
iptables -A INPUT -j DROP iptables -A OUTPUT -j DROP iptables -A FORWARD -j DROP
Možnost 2:Změňte výchozí zásadu řetězce na DROP
Na začátku proveďte následující tři příkazy, které změní výchozí zásadu řetězce na DROP.
iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP
Pokud nyní přidáte pravidlo allow ssh:„iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT“ a provedete iptables -L, všimnete si, že vedle všechny tři řetězce.
# iptables -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:ssh DROP all -- anywhere anywhere Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination
Ale je tu problém. Pravidlo povolit ssh příchozí spojení již nebude fungovat, protože všechny odchozí pakety jsou zahozeny.
Povolit příchozí připojení
Pokud je výchozí zásada DROP pro řetězce INPUT a OUTPUT, musíte pro každé příchozí pravidlo brány firewall zadat následující dvě pravidla.
- Pravidlo požadavku:Toto je požadavek, který přichází od klienta na server pro příchozí připojení.
- Pravidlo odpovědi:Toto je pro odpověď, která odejde ze serveru klientovi (pro odpovídající příchozí požadavek).
Příklad 1:Povolení příchozího připojení SSH
To umožňuje připojení SSH zvenčí k vašemu serveru. tj. Můžete ssh na váš server zvenčí.
To zahrnuje dva kroky. Nejprve musíme povolit příchozí nová připojení SSH. Jakmile je povoleno příchozí připojení ssh, musíme také povolit zpětnou odezvu pro toto příchozí připojení ssh.
Nejprve povolte příchozí požadavek na připojení SSH, jak je uvedeno níže.
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
Ve výše uvedeném příkladu:
- iptables -A INPUT:Přidá nové pravidlo do řetězce INPUT. U příchozího požadavku na připojení to musí být vždy INPUT.
- -i eth0:Toto se týká vstupního rozhraní. U příchozích připojení to vždy musí být „-i“.
- -p tcp:Označuje, že se jedná o protokol TCP.
- –dport 22:Označuje cílový port pro příchozí připojení. Port 22 je pro ssh.
- -m state:Označuje, že je použit modul porovnávání stavu. Více o možnosti „-m“ (a všech dostupných odpovídajících modulech pro iptables) probereme v budoucím článku.
- –stav NEW, ESTABLISHED:Možnosti pro modul porovnávání „stavu“. V tomto příkladu jsou povoleny pouze stavy NEW a ESTABLISHED. Při prvním spuštění požadavku na připojení SSH od klienta k serveru se použije stav NOVÝ. Stav ESTABLISHED se používá pro všechny další požadavky od klienta na server.
Dále Povolit odchozí (pouze stav ESTABLISHED) odpověď SSH připojení (pro odpovídající příchozí požadavek na připojení SSH).
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Ve výše uvedeném příkladu:
- iptables -A OUTPUT:Přidá nové pravidlo do řetězce OUTPUT. Protože se jedná o pravidlo odpovědi (pro odpovídající příchozí požadavek), které vychází ze serveru, mělo by to být OUTPUT.
- -o eth0:Označuje výstupní rozhraní. U odchozích připojení to musí být vždy „-o“.
- -p tcp:Označuje, že se jedná o protokol TCP.
- –sport 22:Odkazuje na zdrojový port pro odchozí připojení. Port 22 je pro ssh. Protože příchozí požadavek (z předchozího pravidla) přišel na „cílový“ port, odchozí odpověď bude procházet přes „zdrojový“ port.
- -m state:Označuje, že je použit modul porovnávání stavu.
- –stav ESTABLISHED:Protože se jedná o pravidlo odezvy, povolujeme pouze ESTABLISHED připojení (a nikoli žádné NOVÉ připojení).
Příklad 2:Povolení příchozího připojení HTTP
To umožňuje HTTP připojení zvenčí k vašemu serveru. tj. Svůj web běžící na serveru můžete zobrazit zvenčí.
Stejně jako výše uvedená pravidla pro příchozí SSH i toto zahrnuje dva kroky. Nejprve musíme povolit příchozí nové připojení HTTP. Jakmile je povoleno příchozí připojení HTTP, musíme povolit zpětnou odezvu pro toto příchozí připojení HTTP.
Nejprve povolte příchozí požadavek na připojení HTTP, jak je uvedeno níže.
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
Dále Povolit odchozí (pouze ESTABLISHED) odpověď HTTP připojení (pro odpovídající příchozí požadavek na připojení SSH).
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
Poznámka:Ve výše uvedeném pravidle požadavku a odpovědi HTTP je vše stejné jako v příkladu SSH kromě čísla portu.
Povolit odchozí připojení
Když je výchozí zásada DROP pro řetězce INPUT a OUTPUT, musíte pro každé odchozí pravidlo brány firewall zadat následující dvě pravidla.
- Pravidlo požadavku:Toto je požadavek, který jde ze serveru ven na odchozí připojení.
- Pravidlo odpovědi:Toto platí pro odpověď, která se vrací zvenčí na server (pro odpovídající odchozí požadavek).
Příklad 3:Povolení odchozího připojení SSH
To umožňuje připojení SSH z vašeho serveru ven. tj. ze svého serveru můžete ssh ssh na vnější server.
To zahrnuje dva kroky. Nejprve musíme povolit odchozí nové připojení SSH. Jakmile je povoleno odchozí připojení ssh, musíme také povolit odpověď pro toto odchozí připojení ssh.
Nejprve povolte požadavek na odchozí připojení SSH, jak je znázorněno níže.
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
Ve výše uvedeném příkladu:
- iptables -A OUTPUT:Přidá nové pravidlo do řetězce OUTPUT. U požadavku na odchozí připojení to musí být vždy OUTPUT.
- -o eth0:Označuje výstupní rozhraní. U odchozích připojení to musí být vždy „-o“.
- -p tcp:Označuje, že se jedná o protokol TCP.
- –dport 22:Odkazuje na cílový port pro odchozí připojení.
- -m state:Označuje, že je použit modul porovnávání stavu.
- –stav NEW, ESTABLISHED:Možnosti pro modul porovnávání „stavu“. V tomto příkladu jsou povoleny pouze stavy NEW a ESTABLISHED. Při prvním spuštění požadavku na připojení SSH ze serveru směrem ven se použije stav NOVÝ. Stav ESTABLISHED se používá pro všechny další požadavky ze serveru směrem ven.
Dále Povolit odchozí (pouze ESTABLISHED) odpověď na připojení SSH (pro odpovídající příchozí požadavek na připojení SSH).
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Ve výše uvedeném příkladu:
- iptables -A INPUT:Přidá nové pravidlo do řetězce INPUT. Protože se jedná o pravidlo odpovědi (pro odpovídající odchozí požadavek), které přichází zvenčí na server, mělo by to být INPUT.
- -i eth0:Označuje vstupní rozhraní. U příchozích připojení to vždy musí být „-i“.
- -p tcp:Označuje, že se jedná o protokol TCP.
- –sport 22:Označuje zdrojový port pro příchozí připojení. Protože odchozí požadavek (z předchozího pravidla) šel na „cílový“ port, bude příchozí odpověď pocházet ze „zdrojového“ portu.
- -m state:Označuje, že je použit modul porovnávání stavu.
- –stav ESTABLISHED:Protože se jedná o pravidlo odezvy, povolujeme pouze ESTABLISHED připojení (a nikoli žádné NOVÉ připojení).
Dáme vše dohromady
Vytvořte shellový skript rules.sh, který provede následující:
- Smazat všechna existující pravidla
- Nastavit výchozí zásady řetězce
- Povolit příchozí SSH
- Povolit příchozí HTTP
- Povolit odchozí SSH
Nejprve vytvořte rules.sh
$ vi rules.sh # 1. Delete all existing rules iptables -F # 2. Set default chain policies iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP # 3. Allow incoming SSH iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT # 4. Allow incoming HTTP iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT # 5. Allow outgoing SSH iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Dále spusťte rules.sh a zobrazte pravidla.
# chmod u+x rules.sh # ./rules.sh # iptables -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:ssh state NEW,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:http state NEW,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp spt:ssh state ESTABLISHED Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp spt:ssh state ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp spt:http state ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh state NEW,ESTABLISHED
Na základě toho byste měli být schopni napsat svá vlastní pravidla brány firewall pro příchozí a odchozí iptables. V IPTtabulkách je toho k pokrytí mnohem více. Zůstaňte naladěni!
Předchozí články ze série iptables:
- Výukový program brány firewall systému Linux:Tabulky IPTables, řetězce, základy pravidel
- IPTables Flush:Smazat / odebrat všechna pravidla na RedHat a CentOS Linux
- Linux IPTables:Jak přidat pravidla brány firewall (s příkladem Allow SSH)