Sprawdzenie skryptu iptables

Witam

Proszę o sprawdzenie napisanego przeze mnie skryptu pod iptables, Reguły są napisane pod komputer stacjonarny. Ewentualnie proszę o rady co poprawić. Dziękuje.

#!/bin/sh


# CZYSZCZENIE STARYCH REGUŁ

iptables -F

iptables -X

iptables -F -t nat

iptables -X -t nat

iptables -F -t filter

iptables -X -t filter


# USTAWIENIE POLITYKI DZIAŁANIA

iptables -P INPUT DROP

iptables -P FORWARD DROP

iptables -P OUTPUT ACCEPT

iptables -A OUTPUT -m state -p icmp --state INVALID -j DROP


# Dopuszczenie localhostu

iptables -A INPUT -i lo -j ACCEPT

iptables -A FORWARD -o lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT


# NAWIĄZANIE POŁĄCZENIA

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

iptables -A FORWARD -j ACCEPT -m state --state ESTABLISHED,RELATED


#PING

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT


# nmap -sS /skanowanie portów

iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH SYN -j LOG --log-prefix "SKANOWANIE SYN_"

iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH SYN -j DROP


# nmap -sA /filtr pakietów (ACK)

iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH ACK -j LOG --log-prefix "SKANOWANIE FILTR_"

iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH ACK -j DROP


# nmap -sF (Fin)

iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN -j LOG --log-prefix "SKANOWANIE Fin_"

iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN -j DROP


# nmap -sX / Xmas Tree

iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN,URG,PSH -j LOG --log-prefix "SKANOWANIE Xmas_"

iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN,URG,PSH -j DROP


# nmap -sN / Null scan

iptables -A INPUT -m conntrack --ctstate INVALID -p tcp ! --tcp-flags SYN,RST,ACK,FIN,PSH,URG SYN,RST,ACK,FIN,PSH,URG -j LOG --log-prefix "Null scan: "

iptables -A INPUT -m conntrack --ctstate INVALID -p tcp ! --tcp-flags SYN,RST,ACK,FIN,PSH,URG SYN,RST,ACK,FIN,PSH,URG -j DROP # Skanowanie Null (nmap -sN)


# ochrona przed atakami

# Ping of death

iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j LOG --log-prefix "Ping: "

iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT # Ping of death

# iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT --reject-with icmp-host-unreachable


# Łańcuch syn-flood (obrona przed DoS)

iptables -N syn-flood

iptables -A INPUT -p tcp --syn -j syn-flood

iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN

iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j LOG --log-prefix "SYN-flood: "

iptables -A syn-flood -j DROP


# Syn-flood protection

iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT


# Furtive port scanner

iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT


# SYN flood protection

echo "1" > /proc/sys/net/ipv4/tcp_syncookies


# Wyłączamy odpowiedzi na pingi

echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all


# Ochrona przed atakami typu Smurf

echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts:


# Włączamy ochronę przed komunikacją ICMP error

echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses


# Włącza logowanie dźiwnych pakietów (spoofed. source routed. redirects):

echo "0" > /proc/sys/net/ipv4/conf/all/log_martians


# Nie akceptujemy datagramu IP z opcją “source route”

echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route


# Nie przyjmujemy pakietów ICMP redict, które mogą zmienić naszą tablicę routingu:

echo "0" /proc/sys/net/ipv4/conf/all/accept_redirects


# Wszystkie karty nie bedą przyjmowały pakietów z sieci innych niż te z tablicy routingu

echo "0" /proc/sys/net/ipv4/conf/all/rp_filter


echo "Reguły dla IPtables zostały załadowane"

Możesz zmienić politykę bezpieczeństwa dla ruchu wychodzącego na DROP i zezwolić tylko na inicjowanie połączeń. Jeśli pakiet nie pasuje do żadnej reguły, na samym końcu porównywany jest z polityką bezpieczeństwa, wówczas zostanie odrzucony.

Nie musisz “zaśmiecać” skryptu takimi poleceniami

# SYN flood protection

echo "1" > /proc/sys/net/ipv4/tcp_syncookies


# Wyłączamy odpowiedzi na pingi

echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all


# Ochrona przed atakami typu Smurf

echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts:


# Włączamy ochronę przed komunikacją ICMP error

echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses


# Włącza logowanie dźiwnych pakietów (spoofed. source routed. redirects):

echo "0" > /proc/sys/net/ipv4/conf/all/log_martians


# Nie akceptujemy datagramu IP z opcją “source route”

echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route


# Nie przyjmujemy pakietów ICMP redict, które mogą zmienić naszą tablicę routingu:

echo "0" /proc/sys/net/ipv4/conf/all/accept_redirects


# Wszystkie karty nie bedą przyjmowały pakietów z sieci innych niż te z tablicy routingu

echo "0" /proc/sys/net/ipv4/conf/all/rp_filter

to samo możesz skonfigurować w pliku /etc/syctl.conf, w którym masz gotowe regułki :wink:

czyli podsumowując powinienem wprowadzić takie zmiany do skryptu

# USTAWIENIE POLITYKI DZIAŁANIA

iptables -P OUTPUT DROP


# Przykładowa regułka

# SSH

iptables -A INPUT -s 0/0 -p tcp --dport 10025 -j ACCEPT

iptables -A INPUT -s 0/0 -p udp --dport 10025 -j ACCEPT

iptables -A OUTPUT -s 0/0 -p tcp --dport 10025 -j ACCEPT

iptables -A OUTPUT -s 0/0 -p udp --dport 10025 -j ACCEPT

wprowadziłem zmiany i przetestowałem, ruch wychodzący został zablokowany ale podana przeze mnie regułka nie działa :frowning: Edit: poprawiłem co nie co :razz:

#!/bin/sh


# CZYSZCZENIE STARYCH REGUŁ

iptables -F

iptables -X

iptables -F -t nat

iptables -X -t nat

iptables -F -t filter

iptables -X -t filter


# USTAWIENIE POLITYKI DZIAŁANIA

iptables -P INPUT DROP

iptables -P FORWARD DROP

iptables -P OUTPUT DROP

#iptables -P OUTPUT ACCEPT

#iptables -A OUTPUT -m state -p icmp --state INVALID -j DROP


# Odblokowanie / Dopuszczenie localhostu

iptables -A INPUT -i lo -j ACCEPT

iptables -A FORWARD -o lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT


# NAWIĄZANIE POŁĄCZENIA

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

iptables -A FORWARD -j ACCEPT -m state --state ESTABLISHED,RELATED


## Regułki

# FTP

# FTP tryb aktywny

iptables -A OUTPUT -p tcp --dport 20 -j ACCEPT

iptables -A OUTPUT -p tcp --dport 21 -j ACCEPT


# FTP tryb pasywny

iptables -A OUTPUT -p tcp --dport 1024 -j ACCEPT

iptables -A OUTPUT -p tcp --dport 1025 -j ACCEPT


# SSH

iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT

iptables -A OUTPUT -p tcp --dport 10025 -j ACCEPT


# DNS

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


# WWW

iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT

iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT


# Poczta

iptables -A OUTPUT -p tcp --dport 143 -j ACCEPT

iptables -A OUTPUT -p tcp --dport 993 -j ACCEPT


# Samba

iptables -A OUTPUT -p tcp --dport 137 -j ACCEPT

iptables -A OUTPUT -p tcp --dport 138 -j ACCEPT

iptables -A OUTPUT -p tcp --dport 139 -j ACCEPT

iptables -A OUTPUT -p tcp --dport 445 -j ACCEPT


# PING (dopuszczenie)

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT


# PING (zablokowanie)

# iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT --reject-with icmp-host-unreachable


# Blokowanie Telnetu

iptables -A OUTPUT -p tcp --dport telnet -j REJECT

iptables -A INPUT -p tcp --dport telnet -j REJECT


# Ochrona przed skanowaniem

# nmap -sS /skanowanie portów

iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH SYN -j LOG --log-prefix "SKANOWANIE SYN_"

iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH SYN -j DROP


# nmap -sA /filtr pakietów (ACK)

iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH ACK -j LOG --log-prefix "SKANOWANIE FILTR_"

iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH ACK -j DROP


# nmap -sF (Fin)

iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN -j LOG --log-prefix "SKANOWANIE FIN_"

iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN -j DROP


# nmap -sX / Xmas Tree

iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN,URG,PSH -j LOG --log-prefix "SKANOWANIE XMAS_"

iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN,URG,PSH -j DROP


# nmap -sN / Null scan

iptables -A INPUT -m conntrack --ctstate INVALID -p tcp ! --tcp-flags SYN,RST,ACK,FIN,PSH,URG SYN,RST,ACK,FIN,PSH,URG -j LOG --log-prefix "Null scan: "

iptables -A INPUT -m conntrack --ctstate INVALID -p tcp ! --tcp-flags SYN,RST,ACK,FIN,PSH,URG SYN,RST,ACK,FIN,PSH,URG -j DROP # Skanowanie Null (nmap -sN)


# Ochrona przed atakami

# Ping of death

iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j LOG --log-prefix "Ping: "

iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT # Ping of death

# Zablokowanie Pingowania

# iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT --reject-with icmp-host-unreachable


# Łańcuch syn-flood (obrona przed DoS)

iptables -N syn-flood

iptables -A INPUT -p tcp --syn -j syn-flood

iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN

iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j LOG --log-prefix "SYN-flood: "

iptables -A syn-flood -j DROP


# Syn-flood protection

iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT


# Furtive port scanner

iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT


# Blokowanie www

# iptables -A OUTPUT -p tcp -m string --string "costam.pl" --algo kmp -j DROP


echo "Reguły dla IPtables zostały załadowane"

Jeśli potrzebujesz zezwolić na ruch tylko na wybranych portach, to tak jest dobrze. Jeśli chciałbyś zezwolić na inicjowanie połączeń przy polityce DROP dla łańcucha OUTPUT bez wyszczególniania reguł, potrzebna Ci będzie taka regułka (gdybyś w przyszłości potrzebował).

iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Jeśli w przyszłości stawiałbyś serwer FTP na tym komputerze, przyda Ci się ip_conntrack_ftp do śledzenia portów i dynamicznego ich otwierania i zamykania przez filtr pakietów.

dzięki wielkie roobal za pomoc

mam jeszcze jeden mały problemik a więc postawiłem sobie serwer ftp, samby itp i chciałem wykorzystać ten skrypt który już mam. Dopisałem sobie do regułki na połączenia przychodzące np dla samby:

iptables -A INPUT -p tcp --dport 137 -j ACCEPT

iptables -A INPUT -p tcp --dport 138 -j ACCEPT

iptables -A INPUT -p tcp --dport 139 -j ACCEPT

iptables -A INPUT -p tcp --dport 445 -j ACCEPT

ale coś mi to nie działa, co zrobiłem źle ?

Do FTP jak pisałem, przyda Ci się ip_conntrack_ftp do śledzenia portów, z których korzysta serwer FTP w czasie sesji. Co do Samby, brakuje Ci reguł dla protokołu UDP.

iptables -A INPUT -p tcp --dport 137:139 -j ACCEPT

iptables -A INPUT -p tcp --dport 445 -j ACCEPT

iptables -A INPUT -p udp --dport 137:139 -j ACCEPT

iptables -A INPUT -p udp --dport 445 -j ACCEPT

hmm dodałem regułki wg twoich uwag i jest dalej to samo, nie mogę się połączyć ani z sambą ani ssh

#!/bin/sh

#stała ścieżka iptables

#f="/usr/sbin/iptables"

f="iptables"

echo "Dodaje Reguły dla IPtables"


echo "Czyszczenie starych reguł"

# CZYSZCZENIE STARYCH REGUŁ

$f -F

$f -X

$f -F -t nat

$f -X -t nat

$f -F -t filter

$f -X -t filter


echo "Ustawienie polityki działania" 

# USTAWIENIE POLITYKI DZIAŁANIA

$f -P INPUT DROP

$f -P FORWARD DROP

$f -P OUTPUT DROP


echo "Dopuszczenie localhostu"

# Odblokowanie / Dopuszczenie localhostu

$f -A INPUT -i lo -j ACCEPT

$f -A FORWARD -o lo -j ACCEPT

$f -A OUTPUT -o lo -j ACCEPT


echo "Nawiązanie połączenia"

# NAWIĄZANIE POŁĄCZENIA

$f -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED

$f -A FORWARD -j ACCEPT -m state --state ESTABLISHED,RELATED


echo "Dodanie regułek"

## Regułki


echo "Reguła SSH"

# SSH

$f -A OUTPUT -p tcp --dport 22 -j ACCEPT

$f -A OUTPUT -p tcp --dport 10025 -j ACCEPT

$f -A INPUT -p tcp --dport 22 -j ACCEPT

$f -A INPUT -p tcp --dport 10025 -j ACCEPT


$f -A INPUT -p tcp --dport 137:139 -j ACCEPT

$f -A INPUT -p tcp --dport 445 -j ACCEPT

$f -A INPUT -p udp --dport 137:139 -j ACCEPT

$f -A INPUT -p udp --dport 445 -j ACCEPT

Bo robisz podstawowy błąd, tzn. nie utrzymujesz kolejności reguł wg zasady od najbardziej szczegółowej do najbardziej ogólnej, czyli reguły powinny być w takiej kolejności.

#!/bin/sh

#stała ścieżka iptables

#f="/usr/sbin/iptables"

f="iptables"

echo "Dodaje Reguły dla IPtables"


echo "Czyszczenie starych reguł"

# CZYSZCZENIE STARYCH REGUŁ

$f -F

$f -X

$f -F -t nat

$f -X -t nat

$f -F -t filter

$f -X -t filter


echo "Ustawienie polityki działania"

# USTAWIENIE POLITYKI DZIAŁANIA

$f -P INPUT DROP

$f -P FORWARD DROP

$f -P OUTPUT DROP


echo "Dopuszczenie localhostu"

# Odblokowanie / Dopuszczenie localhostu

$f -A INPUT -i lo -j ACCEPT

$f -A FORWARD -o lo -j ACCEPT

$f -A OUTPUT -o lo -j ACCEPT


# Protokół SMB


$f -A INPUT -p tcp --dport 137:139 -j ACCEPT

$f -A INPUT -p tcp --dport 445 -j ACCEPT

$f -A INPUT -p udp --dport 137:139 -j ACCEPT

$f -A INPUT -p udp --dport 445 -j ACCEPT


# SSH


$f -A INPUT -p tcp --dport 22 -j ACCEPT

$f -A INPUT -p tcp --dport 10025 -j ACCEPT


echo "Nawiązanie połączenia"

# NAWIĄZANIE POŁĄCZENIA

$f -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED

$f -A FORWARD -j ACCEPT -m state --state ESTABLISHED,RELATED


echo "Dodanie regułek"

## Regułki


echo "Reguła SSH"

# SSH

$f -A OUTPUT -p tcp --dport 22 -j ACCEPT

$f -A OUTPUT -p tcp --dport 10025 -j ACCEPT

Filtr pakietów sprawdza reguły każdą po kolei, jeśli brakuje dopasowania, przechodzi do kolejnej aż znajdzie dopasowanie, a jeśli nie, postępuje z pakietem według ustawionej polityki bezpieczeństwa. Tak więc, jeśli przychodzi pakiet na port 137 jest on sprawdzany w pierwszej kolejności z regułą

$f -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED

pakiet nie pasuje do reguły, bo jest to pakiet przychodzący, próbujący nawiązać połączenie z hostem, pakiet jest odrzucany, bo nie pasuje do reguły i dalsze reguły nie są sprawdzane. W sytuacji odwrotnej pakiet przychodzi na port 137 i masz kilka szczegółowych dopasowań, pasuje protokół TCP, nie pasuje port, pakiet jest porównywany z inną regułą, pasuje port, nie pasuje protokół, kolejne porównanie, pasuje port, pasuje protokół pakiet jest akceptowany, koniec sprawdzania.