iptables: różnica między pakietami NEW, ESTABLISHED i RELATED

46

Część zapory na serwerze:

iptables -A INPUT -p tcp --dport 22 -m state NEW --state -m recent --set

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 100 --hitcount 10 -j DROP

Kiedy szukam online, zawsze widzę, że NOWOŚĆ jest używana w tej regule, ale trudno mi zrozumieć, dlaczego USTANOWIONE i POWIĄZANE nie są używane.

Lubię to :

iptables -A INPUT -p tcp --dport 22 -m state NEW,ESTABLISHED,RELATED --state -m recent --set

iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED,RELATED -m recent --update --seconds 100 --hitcount 10 -j DROP

Czy ktoś może mi wyjaśnić, kiedy dokładnie NOWY pakiet zmienia się w USTALONY i POWIĄZANY?

Kris
źródło

Odpowiedzi:

46

Rozważ NOWE połączenie telefoniczne, zanim odbiornik odbierze połączenie. USTANOWIONY pakiet to ich „Hello”. A pakiet POWIĄZANY byłby, gdybyś dzwonił, aby powiedzieć im o wiadomości e-mail, którą zamierzasz wysłać. (Adres e-mail jest POWIĄZANY.)

Jeśli moja analogia nie jest tak świetna, osobiście uważam, że strony podręcznika radzą sobie z nią dobrze:

NOWOŚĆ - co oznacza, że ​​pakiet nawiązał nowe połączenie lub w inny sposób jest powiązany z połączeniem, które nie widziało pakietów w obu kierunkach, oraz

ESTABLISHED - oznacza, że ​​pakiet jest powiązany z połączeniem, które widziało pakiety w obu kierunkach,

POWIĄZANE - co oznacza, że ​​pakiet rozpoczyna nowe połączenie, ale jest powiązany z istniejącym połączeniem, takim jak transfer danych FTP lub błąd ICMP.

iptables (8) - strona podręcznika użytkownika systemu Linux

Aaron Copley
źródło
9
Z ciekawości wiesz, jak określa pakiety PODOBNE? Czy istnieje jakiś mechanizm, którego aplikacje mogą użyć, aby zasygnalizować iptables, że połączenie będzie połączeniem pokrewnym, czy jest to tylko część stanowej części iptables?
Matthew Scharley,
9
Jest obsługiwany przez szereg modułów jądra o nazwie ip_conntrack_ *, każdy napisany dla określonego protokołu, który używa niepowiązanych połączeń (takich jak FTP). Aby odpowiedzieć na twoje pytanie, myślę, że musisz załadować podobny moduł do swojej aplikacji.
Kyle Smith
4
Ok dziękuję. Ale wracając do reguły z NOWYM, czy nie jest możliwe, aby pakiet wyglądał tak, jakby był już USTALONY i czy nie jest przez to zablokowany?
Kris
2
@Kris: Trudno sfałszować wychodzące pakiety, więc po sformułowaniu strony podręcznika w odpowiedzi nie rozumiem. Masz rację, że możliwe jest sfałszowanie pakietu, który wygląda na związany z otwartym połączeniem, ale nawet bez zapory ogniowej stos TCP po prostu upuściłby pakiet na podłogę, gdyby jeszcze nie wiedział o otwartym połączeniu z nadawca. Jeśli jest to zapora sieciowa na routerze, nadal można utrzymać ten stan, sprawdzając pakiety SYN/ ACK/ RST/ etc przechodzące przez router, i spodziewałbym się, że iptables to zrobi.
Matthew Scharley
2
@Kris: Coś podobnego do tego (choć technicznie nie identyczne) jest używane przez VNC Software, takie jak TeamViewer, do tunelowania przez zapory ogniowe / routery. Proces ten nazywa się dziurkowaniem . Krótko mówiąc, masz komputer hosta (który może znajdować się za ograniczającą zaporą ogniową), z którym chcesz się połączyć z innego urządzenia (przez Internet). Oba komputery otwierają indywidualne połączenie z oddzielnym serwerem (np. TeamViewer Server), który „pośredniczy” między nimi, więc wygląda na ich zapory ogniowe, jakby pakiety były powiązane, a tym samym te komputery są w stanie ustanowić osobne połączenie z każdym inny.
Lewita
14

Przydzielenie zarówno serwerowi, jak i klientowi restrykcyjnego INPUTi otwartego OUTPUT, tj .:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT

Oraz z rozszerzeń iptables (8) na przykładzie FTP w trybie aktywnym:

1. NOWOŚĆ

NOWOŚĆ Pakiet nawiązał nowe połączenie lub w inny sposób jest powiązany z połączeniem, które nie widziało pakietów w obu kierunkach.

Klient na porcie 50000(dowolny losowy nieuprzywilejowany port) łączy się z serwerem FTP na porcie 21, serwer potrzebowałby przynajmniej tego, aby zaakceptować to połączenie przychodzące:

iptables -A INPUT --dport 21 -m state --state NEW -j ACCEPT

2. USTANOWIONE

USTANOWIONY Pakiet jest powiązany z połączeniem, które widziało pakiety w obu kierunkach.

Teraz po stronie klienta, otworzył połączenie wychodzące do serwera na porcie 21przy użyciu portu lokalnego 50000i potrzebuje następujące iptables, aby umożliwić reakcję przybyć od server (21)do client (50000):

sudo iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

3. POWIĄZANE

POWIĄZANE Pakiet rozpoczyna nowe połączenie, ale jest powiązany z istniejącym połączeniem, takim jak transfer danych FTP lub błąd ICMP.

Teraz po ustanowieniu połączenia FTP i zbliżeniu się połączenia danych, klient otworzy gniazdo serwera (tak, przy aktywnym kliencie FTP staje się serwerem połączenia danych) na porcie 60000(według mojego zrozumienia klient oznaczy ten port 60000co RELATEDdo drugiego połączenia z 50000->21) i wyśle ​​ten numer portu do serwera za pomocą PORTpolecenia FTP . Następnie serwer FTP otworzy nowe połączenie ze swojego portu 20do portu 60000na kliencie, i cóż, klient wymaga teraz następujących elementów, aby zezwolić na to nowe połączenie:

sudo iptables -A INPUT -m state --state RELATED -j ACCEPT

Na koniec, aby to zadziałało, musisz włączyć ip_conntrack_ftpmoduł jądra, aby system mógł oznaczać połączenia / pakiety jako RELATED(to rozumiem, nie kopałem zbyt wiele na tym):

modprobe ip_conntrack_ftp
Jaime Hablutzel
źródło
ustalone wymaga tylko uprzednio lokalnie utworzonego przepływu jednokierunkowego, a nie trójstronnego uzgadniania tcp, czy moje rozumowanie jest prawidłowe?
sdaffa23fdsf
Dzięki za odpowiedź, za ustalone powiedziałeś „iptables, aby umożliwić odpowiedź z serwera (21) do klienta (50000)”, jeśli jest to serwer od klienta, dlaczego to jest WEJŚCIE, a nie WYJŚCIE?
Medya,
@Medya, ponieważ z perspektywy klienta pakiety wysyłane z serwera (21) do klienta (50000) są pakietami przychodzącymi, więc dla klienta jest to pakiet INPUT.
Jaime Hablutzel