GNU/Linux >> Znalost Linux >  >> Linux

Linuxové IPTables:Příklady příchozích a odchozích pravidel (SSH a HTTP)

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.

  1. Smažte všechna existující pravidla:„iptables -F“
  2. Povolit pouze příchozí SSH:„iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT“
  3. 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.

  1. Pravidlo požadavku:Toto je požadavek, který přichází od klienta na server pro příchozí připojení.
  2. 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.

  1. Pravidlo požadavku:Toto je požadavek, který jde ze serveru ven na odchozí připojení.
  2. 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í:

  1. Smazat všechna existující pravidla
  2. Nastavit výchozí zásady řetězce
  3. Povolit příchozí SSH
  4. Povolit příchozí HTTP
  5. 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)

Linux
  1. Linux Cat Command:Použití a příklady

  2. Příkaz Linux Sed:Použití a příklady

  3. Linux nice and renice Command Tutorial (7 příkladů)

  1. Linuxové příkazy – přehled a příklady

  2. Jak na to:Linux General – IPTtables obecně

  3. Linux IPTables:Jak přidat pravidla brány firewall (s příkladem Allow SSH)

  1. CentOS / RHEL :Jak blokovat příchozí a odchozí porty pomocí iptables

  2. Příklady příkazů mkdir a rmdir v Linuxu

  3. Příklady příkazů swapon a swapoff v Linuxu