Zablokować wszystkie połączenia przychodzące za pomocą iptables?

17

Chcę wprowadzić kilka prostych reguł iptables, aby odmawiać wszystkich połączeń przychodzących i zezwalać na wychodzące. Jak mogę to zrobić?

poliglota
źródło

Odpowiedzi:

27

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.

Yohann
źródło
2
Kiedy wykonuję pierwszą linijkę twojej reguły, odłączyłem się od SSH
holms
7
Pytanie brzmi „odrzuć wszystkie połączenia przychodzące”, a nie „odrzuć wszystkie połączenia przychodzące z wyjątkiem SSH” :)
Yohann
Za późno przeczytałem ostrzeżenie @holms o pierwszej regule ...
DenisKolodin,
Pamiętaj, że nie ma to wpływu na ruch ipv6. Przeczytaj moją odpowiedź poniżej, jeśli masz włączony ipv6.
bhelm
13

Jeśli pracujesz zdalnie przez SSH, możesz dodać to ( -Iwstawia przed wszystkimi innymi regułami INPUT):

iptables -I INPUT -p tcp --dport 22 -j ACCEPT

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.

Miphix
źródło
3

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:

*filter

# drop forwarded traffic. you only need it of you are running a router
:FORWARD DROP [0:0]

# Accept all outgoing traffic
:OUTPUT ACCEPT [623107326:1392470726908]


# Block all incoming traffic, all protocols (tcp, udp, icmp, ...) everything.
# This is the base rule we can define exceptions from.
:INPUT DROP [11486:513044]

# do not block already running connections (important for outgoing)
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# do not block localhost
-A INPUT -i lo -j ACCEPT

# do not block icmp for ping and network diagnostics. Remove if you do not want this
# note that -p icmp has no effect on ipv6, so we need an extra ipv6 rule
-4 -A INPUT -p icmp -j ACCEPT
-6 -A INPUT -p ipv6-icmp -j ACCEPT

# allow some incoming ports for services that should be public available
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

# commit changes
COMMIT

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ń:

iptables-restore < iptables.rules
ip6tables-restore < iptables.rules

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-persistentprzywrócić po ponownym uruchomieniu. Reguły nie są automatycznie zapisywane podczas zamykania, więc uruchom, netfilter-persistent saveaby zaktualizować trwałe reguły.

bhelm
źródło
1

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 statemoduł, 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 DROPaby zaoszczędzić ruch wychodzący (nie wyśle ​​sygnału nawigacyjnego odrzucenia)

Offenso
źródło