Jak zezwolić na wychodzące SMTP na iptables Debian Linux


13

Jeśli zdecyduję się zezwolić na cały ruch w łańcuchu OUTPUT ( iptables -P OUTPUT ACCEPT), poczta wysyła się dobrze. Gdy tylko zablokuję serwer przy użyciu tych reguł, poczta wychodząca przestaje działać. Wszystko inne działa, co jest dziwne.

Czy ktoś widzi tu coś, co powstrzymałoby moją pocztę wychodzącą od wysyłania? Jestem zszokowany, wielokrotnie przeglądałem te zasady i wypróbowałem wiele różnych wersji.

 iptables -F
 iptables -P INPUT DROP
 iptables -P FORWARD DROP
 iptables -P OUTPUT DROP


 iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
 iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

 iptables -A INPUT  -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
 iptables -A OUTPUT -p tcp --sport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

 iptables -A INPUT  -p tcp --sport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
 iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

 iptables -A INPUT -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
 iptables -A OUTPUT -p tcp --sport 443 -m state --state NEW,ESTABLISHED -j ACCEPT

 iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
 iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT

 iptables -A OUTPUT -p tcp --sport 25 -j ACCEPT
 iptables -A OUTPUT -p tcp --sport 587 -j ACCEPT

 iptables -A OUTPUT  -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
 iptables -A INPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

 iptables -A OUTPUT  -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
 iptables -A INPUT  -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

 iptables -A INPUT -i lo -j ACCEPT
 iptables -A OUTPUT -o lo -j ACCEPT

 iptables -A OUTPUT -p udp  --dport 53 -j ACCEPT
 iptables -A INPUT -p udp  --sport 53 -j ACCEPT

 iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
 iptables -A INPUT -p tcp --dport 443 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT


 iptables -N LOGGING
 iptables -A INPUT -j LOGGING
 iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7
 iptables -A LOGGING -j DROP

Odpowiedzi:


18

Masz regułę, aby zezwolić na ruch, ale nie masz reguły, aby zezwolić na ruch powrotny.

Zgaduję, że chciałeś, aby te 2 reguły były -A INPUTzamiast tego:

iptables -A OUTPUT -p tcp --sport 25 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 587 -j ACCEPT

Jednak użycie portu źródłowego jako metody zezwalania na ruch powrotny jest złym sposobem zabezpieczenia systemu. Wystarczy, że użyjesz jednego z tych portów źródłowych, a zestaw reguł zapory stanie się bezużyteczny.

O wiele lepszym pomysłem byłoby usunięcie wszystkich -A INPUT ... --sportreguł i użycie tylko jednej reguły:

iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Zasada działania polega na tym, że kiedy system tworzy połączenie wychodzące, jądro rejestruje połączenie w tabeli śledzenia. Następnie, gdy wracają pakiety ze zdalnego systemu, sprawdza, czy są one powiązane z jakimkolwiek połączeniem w tabeli śledzenia. Bit jest jeden, który zezwala na ruch bezpośrednio związanych z sesją. Będą to pakiety TCP wracające do strumienia. The
ESTABLISHED
RELATEDbit zezwala na ruch związany z połączeniem, ale nie jest częścią samego połączenia. Mogą to być na przykład pakiety ICMP, na przykład „ICMP nie może fragmentować”. Te pakiety nie są częścią strumienia TCP, ale są niezwykle ważne, aby utrzymać strumień przy życiu (co jest również kolejną rzeczą, której nie obejmuje Twój zestaw reguł i bez której występują dziwne problemy z połączeniem i utrata).

Ta reguła działa również dla ruchu UDP, ale ponieważ UDP jest bezstanowy, nie jest taki sam. Zamiast tego jądro musi śledzić wychodzące pakiety UDP i po prostu zakłada, że ​​kiedy pakiety UDP powracają na tej samej kombinacji host / port, i to w krótkim czasie, są one powiązane.


Dziękuję za odpowiedź. Myślę, że nie chcę wpuszczać ruchu z powrotem, ponieważ wykonuję tylko wychodzące połączenie SMTP? Zastanawiałem się, czy jeśli dodam regułę do łańcucha INPUT, pozwolę na powrót SMTP. To jest serwer sieciowy, który musi tylko połączyć się z zewnętrznym hostem SMTP, aby wysłać pocztę .... dzięki!
916 Networks,

Jeśli nie dopuścisz do powrotu ruchu powrotnego, w jaki sposób Twój system będzie odbierał wszystkie komunikaty „tak, mam twoje dane”, których używają protokoły TCP i SMTP?
Patrick

To ma sens. Właśnie dodałem twoją regułę i całkowicie zadziałała. Doceniam odpowiedź! Próbowałem głosować, ale powiedziałem, że nie mam wystarczającej reputacji (nowość w Unix StackExchange)
916 Networks,

Dodałem wyjaśnienie, w jaki sposób ta reguła działa.
Patrick
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.