Iptables: „-p udp --state ESTABLISHED”

18

spójrzmy na te dwie reguły iptables, które są często używane, aby umożliwić wychodzący DNS:

iptables -A OUTPUT -p udp --sport 1024:65535 --dport 53 
   -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A INPUT -p udp --sport 53 --dport 1024:65535
   -m state --state ESTABLISHED -j ACCEPT

Moje pytanie brzmi: jak dokładnie powinienem rozumieć stan USTANOWIONY w UDP? UDP jest bezpaństwowcem.

Oto moja intuicja - chciałbym wiedzieć, czy jest to nieprawidłowe:

Strona podręcznika mówi mi to:

stan

Ten moduł, w połączeniu ze śledzeniem połączeń, umożliwia dostęp do
stan śledzenia połączenia dla tego pakietu.

  --stan ...

Iptables w zasadzie pamięta numer portu, który został użyty dla pakietu wychodzącego (co jeszcze mógłby zapamiętać dla pakietu UDP?) , A następnie zezwala na pierwszy przychodzący pakiet, który jest wysyłany z powrotem w krótkim czasie? Osoba atakująca musiałaby odgadnąć numer portu (czy to naprawdę byłoby zbyt trudne?)

O unikaniu konfliktów:

Jądro śledzi, które porty są blokowane (przez inne usługi lub przez poprzednie wychodzące pakiety UDP), aby porty te nie były wykorzystywane w nowych wychodzących pakietach DNS w określonym czasie? (Co by się stało, gdybym przypadkowo próbował uruchomić usługę na tym porcie w określonym przedziale czasowym - czy próba ta zostałaby odrzucona / zablokowana?)

Proszę znaleźć wszystkie błędy w powyższym tekście :-) Dzięki,

Chris

Chris Lercher
źródło

Odpowiedzi:

12

Iptables w zasadzie pamięta numer portu, który został użyty dla pakietu wychodzącego (co jeszcze mógłby zapamiętać dla pakietu UDP?),

Jestem pewien, że dla UDP porty i adresy źródłowe i docelowe są przechowywane.

Jeśli chcesz sprawdzić tabele stanu, zainstaluj conntrack i / lub netstat-nat.

(Co by się stało, gdybym przypadkowo próbował uruchomić usługę na tym porcie w określonym przedziale czasowym - czy próba ta zostałaby odrzucona / zablokowana?)

Ponieważ używasz OUTPUT i INPUT, mówisz o lokalnych usługach. Port jest już zajęty. Nie sądzę, że twój system pozwoli ci na uruchomienie innej usługi, ponieważ coś już nasłuchuje na tym porcie. Myślę, że możesz zatrzymać pierwszą usługę i rozpocząć inną, jeśli naprawdę tego chcesz, w takim przypadku odpowiedź prawdopodobnie trafiłaby do twojej usługi. To, co usługa robi z pakietem, zależy od zawartości pakietu i usługi.

Zoredache
źródło
Więc jeśli zacznę mówić wystąpienie Tomcat na porcie 8080, będę miał szansę 1: (65535-1023), że uruchomienie się nie powiedzie, jeśli przypadkowo zapytanie DNS uruchomi się na tym samym porcie? A może po prostu poczeka, aż upłynie czas? Jak długi jest domyślnie przedział czasowy?
Chris Lercher
6
W systemie Linux wydaje mi się, że efemeryczny zakres portów to zwykle 32768-61000 (patrz / proc / sys / net / ipv4 / ip_local_port_range). Nie obejmuje to twojego przykładowego portu 8080. Często konfigurowanie usług nasłuchujących na portach jest bardzo rzadkie w efemerycznym zakresie. Czas, w którym wpis UDP w tabeli wynosi zwykle 30 sekund (patrz / proc / sys / net / netfilter / nf_conntrack_udp_timeout)
Zoredache
2
+1 Dzięki, szczególnie za ścieżki / proc!
Chris Lercher,
1
Jeśli ktoś chce przedłużyć udp_timeout, użyjecho "net.netfilter.nf_conntrack_udp_timeout = 180" >> /etc/sysctl.conf
Kiran
8

NB: Ta odpowiedź została zredagowana.

Pomimo tego, co mówią strony podręcznika, ESTABLISHEDwydaje się oznaczać „stanowy”. W przypadku UDP oznacza to po prostu (jak sugerujesz) zapamiętywanie przez pewien czas każdego wychodzącego pakietu UDP (krotka „src ip, src port dst ip, dst port”) i rozpoznawanie jego odpowiedzi.

FWIW, moje normalne reguły dla ruchu DNS wyglądałyby mniej więcej tak:

# permit any outbound DNS request (NB: TCP required too)
iptables -A OUTPUT -p udp --sport 1024:65535 --dport 53  -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1024:65535 --dport 53  -j ACCEPT

# accept any packet that's a response to anything we sent
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

tj. kontroluj ruch w OUTPUTłańcuchu, a następnie pozwól iptablesmodułom stanu obsłużyć wszystko inne w INPUTłańcuchu.

Zobacz także to powiązane pytanie .

Alnitak
źródło
1
Wiem, że ja też powinienem zezwolić na TCP. Ale co oznaczałoby POWIĄZANIE dla UDP? Manpage: „POWIĄZANE, co oznacza, że ​​pakiet rozpoczyna nowe połączenie, ale jest powiązane z istniejącym połączeniem, ...” Połączenia dla UDP? Może to naprawdę ma większy sens niż USTANOWIONE, ale tego właśnie chciałbym się dowiedzieć.
Chris Lercher
Kiedy używam twoich reguł, ale ograniczam udp INPUT do POWIĄZANE, moje zapytania DNS nie działają. Wydaje się, że muszę zezwolić na USTANOWIENIE. Czy jest jakiś powód, aby zezwolić także na POKREWNE (dla UDP)?
Chris Lercher,
ok, wygląda na to, że USTANOWIONO znaczy więcej niż mówi strona podręcznika. W każdym razie, jeśli użyjesz filtrów WYJŚCIOWYCH, takich jak mój, i nie zaakceptujesz ruchu przychodzącego, wówczas ta reguła WEJŚCIE jest jedyną, której będziesz kiedykolwiek potrzebować.
Alnitak,
1
Biorąc pod uwagę to, co znaleźliśmy, POWIĄZANE pakiety udp nie istnieją AFAIK. Jednak (na przykład), jeśli kiedykolwiek wychodzisz z wychodzącego FTP z tej skrzynki, potrzebujesz reguły stanu ZWIĄZANE dla kanału danych. Pojedyncza reguła „ESTABLISHED, RELATED” jest AFAIK najbardziej optymalną pojedynczą regułą dla ruchu przychodzącego.
Alnitak,
1
tak naprawdę mogą istnieć RELATEDpakiety UDP dla RTP.
Alnitak
1

Twórcy iptables uznali, że stanem „USTANOWIONYM” była sytuacja, w której pakiety były widziane w obu kierunkach, niezależnie od protokołu między dwoma klientami.

rozszerzenie stanu jest częścią conntrack. Jądro rozumie stan z tabeli

/proc/net/nf_conntrack

Przykład stanów iptable dla UDP w tabeli nf_conntrack z punktu widzenia nadawcy. Wyobraźmy sobie, że wysyłasz zapytanie DNS na UDP

udp   17 20 src=192.168.1.2 dst=192.168.1.10 sport=35237 dport=53 \
 [UNREPLIED] src=192.168.1.10 dst=192.168.1.2 sport=53 \
 dport=35237 use=1

Pakiet został wysłany. Nie odpowiedział i och, tabela zawiera dane tego, czego się oczekuje w zamian (pakiet odpowiedzi DNS).

udp   17 20 src=192.168.1.2 dst=192.168.1.10 sport=35237 dport=53 \
  src=192.168.1.10 dst=192.168.1.2 sport=53 \
 dport=35237 use=1

Odpowiedź nadeszła, brak odpowiedzi, oznacza to, że połączenie UDP jest w USTAWIENIU przez krótki czas zdefiniowany w twoim systemie.

Nicolas Guérinet
źródło