Chcę wprowadzić kilka prostych reguł iptables, aby odmawiać wszystkich połączeń przychodzących i zezwalać na wychodzące. Jak mogę to zrobić?
17
Wypróbuj to z dostępem roota:
# Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Accept on localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Allow established sessions to receive traffic
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Pamiętaj, że spowoduje to brutalne odcięcie wszystkich działających połączeń - dotyczy to między innymi połączenia SSH, którego możesz użyć do administrowania serwerem. Używaj tego tylko, jeśli masz dostęp do lokalnej konsoli.
Zobacz odpowiedź Miphixa, aby dowiedzieć się, jak dodać wyjątek dla SSH.
Jeśli pracujesz zdalnie przez SSH, możesz dodać to (
-I
wstawia przed wszystkimi innymi regułamiINPUT
):Jeśli usługa SSH nasłuchuje na innym porcie, będziesz musiał użyć tego portu zamiast
22
.W przeciwnym razie możesz przypadkowo utracić dostęp.
źródło
Pamiętaj, że inne odpowiedzi nie obejmują IPv6! Jeśli twój system akceptuje ruch IPv6, żadna reguła iptables nie będzie miała zastosowania do ruchu ipv6.
zamiast bezpośrednio używać iptables / ip6tables, zalecam użycie iptables-restore i zapisywanie. Narzędzia te pozwalają określić konfigurację iptables z wieloma regułami i łatwo załadować ją za pomocą jednego polecenia.
utwórz plik (nazwałem go iptables.rules) o następującej treści:
Uwaga: dodałem dodatkowy przykład, jeśli chcesz zezwolić ICMP i ruch na określone porty.
teraz możesz załadować go za pomocą następujących poleceń:
Teraz Twoje zasady obejmują również IPv6 i są łatwe w zarządzaniu.
Dodatkowa uwaga dla użytkowników Debiana: jeśli jesteś zadowolony ze swoich reguł, możesz je
apt install iptables-persistent
przywrócić po ponownym uruchomieniu. Reguły nie są automatycznie zapisywane podczas zamykania, więc uruchom,netfilter-persistent save
aby zaktualizować trwałe reguły.źródło
Obie powyższe odpowiedzi są w jakiś sposób poprawne, ale nie są wystarczająco dokładne, aby udzielić odpowiedzi. (Przepraszam, nie mam wystarczającej reputacji, aby dodać komentarz, więc napisanie pełnej odpowiedzi).
W moim przypadku spotkałem przeciążony serwer apache, przepełniony zadaniami cron, nadmiernie wykorzystujący procesor. Limity wątków były przechowywane w bazie danych SQL, ale osiągnąłem limit połączeń. Chciałem ograniczyć przychodzące połączenia apache z lokalnego hosta (ta część jest opcjonalna), ale wszystkie pozostałe połączenia są możliwe. W tym te, które zostały faktycznie ustanowione.
Zrobiłem to z rozkazem
sudo iptables -I INPUT -p tcp --dport 80 -m state --state NEW -j REJECT
Oznacza to: dla każdego przychodzącego pakietu tcp na porcie 80, załaduj
state
moduł, a jeśli jest to pierwszy pakiet (połączenie przychodzące), odrzuć go. Do localhost możesz po prostu użyć-s 127.0.0.0/8
A do użytku w świecie rzeczywistym, w niektórych przypadkach możesz dodać „NIEPRAWIDŁOWE” do stanów
NEW,INVALID
, ponieważ można wysyłać „złośliwe” pakiety, próbując ominąć regułę. A także zamień na,-j DROP
aby zaoszczędzić ruch wychodzący (nie wyśle sygnału nawigacyjnego odrzucenia)źródło