Jak wygasnąć reguły iptables?

18

Ktoś powiedział mi, że jest to możliwe, ale nie mogę znaleźć niczego na stronach google lub man.

Muszę zablokować adresy IP przez określony czas, a następnie automatycznie odblokować.

HappyDeveloper
źródło

Odpowiedzi:

18

Jeśli masz na myśli to, że iptables całkowicie usunie regułę, o ile wiem, nie będziesz w stanie tego zrobić. Jaki jest tego cel? Jeśli potrzebujesz jakiegoś rodzaju automatycznego tymczasowego banowania, standardowym rozwiązaniem jest fail2ban .

Alternatywnie możesz użyć zadania cron, aby usunąć dodawaną regułę lub, lepiej, jeśli chcesz to zrobić interaktywnie, atzadanie:

iptables -I INPUT -s 192.168.1.100 -j DROP
echo "iptables -D INPUT -s 192.168.1.100 -j DROP" | at @10pm 

Zobacz także recentmoduł iptables. Może --secondsto być pomocne w zależności od rzeczywistych potrzeb. man iptablespo więcej informacji.

Eduardo Ivanec
źródło
och wow, praca w „at” wygląda świetnie. Czy mogę połączyć to z nohup i &? W jaki sposób?
HappyDeveloper
Nie trzeba używać nohup - zadanie at jest wykonywane niezależnie od terminala, którego użyto do jego utworzenia. Oznacza to, że jest on uruchamiany w powłoce, która nie dziedziczy zmiennych środowiskowych, nawiasem mówiąc, i jest /bin/shdomyślnie. Ale prawdopodobnie nie będzie to problemem w tym przypadku.
Eduardo Ivanec
9

Umieść w regułach komentarz ze znacznikiem czasu (prawdopodobnie kilka sekund od epoki). Okresowo przeciągnij po wygasłe reguły.

Zauważ, że najnowsze jądro Linuksa obsługuje dynamiczne ładowanie adresów IP do pamięci podręcznej sprawdzanej przez reguły iptable zamiast jako bezpośrednie reguły iptables.

Przykład:

iptables  -A INPUT -s 192.168.200.100/32 -m comment --comment "expire=`date -d '+ 5 min' +%s`" -j DROP 
iptables -L INPUT -n --line-numbers | tac | perl -ne 'next unless /(^\d+).*expire=(\d+)/; if ($2 < time) { print "iptables -D INPUT $1\n"; }'

Możesz oczywiście iptables -D INPUT $1zamiast wypisać polecenie.

Seth Robertson
źródło
świetny pomysł. Nie jestem pewien, jak wykonać część zamiatania,
pomyślę
+1 Bardzo dobry pomysł, może nie najprostszy, ale zdecydowanie schludny.
Kyle Smith
1
@HappyDeveloper: Podano przykład dodawania / zamiatania
Seth Robertson
1
Haha, po prostu musiałem to zrobić, użyłem awk do mojego sprzątania: iptables -L FORWARD --line-numbers | sort -r | awk 'substr($8,1,4) == "exp@" && substr($8,5) < systime() { systems("iptables -D FORWARD " $1) }'tam tworzone są zasady, takie jak:iptables -A FORWARD -j DROP -m comment --comment "exp@EPOCH"
Kyle Smith
Moje 2 centy w perlu:iptables -L FORWARD --line-numbers | tac | perl -walne 'system "iptables -D FORWARD $F[0]" if $F[-2] =~ /^expire=(\d+)$/ and $1<time()'
tuomassalo
5

iptables ma metodę automatycznego dodawania adresów IP do listy, jeśli spełnione są warunki zdefiniowane przez użytkownika. Używam następujących, aby uniknąć automatycznych prób włamań do mojego portu ssh:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name ssh --seconds 60 --reap -j DROP

Pomaga to ograniczyć zautomatyzowane próby uzyskania dostępu do serwera, ograniczając próby połączenia z tego samego adresu IP do jednego co 60 sekund.

Jeśli chcesz zezwolić na określoną liczbę prób w określonym przedziale czasowym, na przykład 4 w ciągu 5 minut, a w przypadku niepowodzenia, umieść je na czarnej liście przez dłuższy czas, na przykład 24 godziny, możesz zrobić coś takiego:

iptables -X black
iptables -N black
iptables -A black   -m recent --set   --name blacklist   -j DROP

iptables -X ssh
iptables -N ssh
iptables -I ssh 1   -m recent --update    --name blacklist   --reap   --seconds 86400     -j DROP
iptables -I ssh 2   -m recent --update    --name timer       --reap   --seconds   600     --hitcount 4   -j black
iptables -I ssh 3   -m recent --set       --name timer   -j ACCEPT

iptables -A INPUT   -p TCP --dport ssh   -m state --state NEW -j ssh

Powyżej tworzymy 2 łańcuchy; „ssh” i „black” oraz 2 listy; „timer” i „czarna lista”.

Krótko; ostatni pokazany powyżej łańcuch to „wejście” do łańcucha ssh.

  • Zasada 1 w łańcuchu ssh sprawdza, czy źródłowy adres IP znajduje się na liście „czarnej listy”. Jeśli tak, połączenie zostanie przerwane, a zegar 24-godzinny na czarnej liście zostanie ponownie uruchomiony. Jeśli reguła 1 jest fałszywa, przechodzimy do reguły 2.
  • Zasada 2 w łańcuchu ssh sprawdza, czy źródłowy adres IP wykonał więcej niż 4 próby połączenia w ciągu 5 minut. Jeśli tak, wysyła pakiet do łańcucha „czarnego”, gdzie jest dodawany do listy „czarnej listy”. Łańcuch „czarny”, a następnie DROP nawiązuje połączenie i gotowe.
  • Zasada 3 w łańcuchu „ssh” zostaje osiągnięta tylko wtedy, gdy reguły 1 i 2 są fałszywe. Jeśli tak, pakiet jest AKCEPTOWANY, a źródłowy adres IP jest dodawany do listy „timer”, abyśmy mogli monitorować częstotliwość prób połączenia.

Opcja „--reap” informuje jądro, aby przeszukiwało listę i usuwało wszystkie elementy, które są starsze niż ustawiony limit czasu; 5 minut dla listy „timer” i 24 godziny dla listy „czarnej listy”.

Uwaga: dodatkowe spacje są czytelne i są opcjonalne w skrypcie powłoki.

Dolina górska
źródło
3

IPTables ma specjalnie do tego stworzoną funkcję: Zestaw IP. Regułę tworzy się raz, a ona będzie się powtarzać jak zwykle, ale sprawdza, czy w zestawie IPS (lub portach) nie ma zgodności. Fajne jest to, że ten zestaw można dynamicznie i skutecznie aktualizować bez zakłócania reszty zapory.

Głównym www , przykłady .

Tak więc, aby go użyć, nadal będziesz musiał użyć atlub cronzaplanować usunięcie.

Allen
źródło
2

Możesz użyć fail2ban, aby zablokować adresy IP i skonfigurować czas, przez który adres zostanie zablokowany.

user9517 obsługiwaneGoFundMonica
źródło
2

Jak ktoś już powiedział: do tej funkcji należy użyć ipset.

ipset może dodać adres IP z wartością limitu czasu. Po upływie limitu czasu rekord zostanie automatycznie usunięty z ipset.

timeout All set types supports the optional timeout parameter when creating a set and adding entries. The value of the timeout parameter for the create command means the default timeout value (in seconds) for new entries. If a set is created with timeout support, then the same timeout option can be used to specify non-default timeout values when adding entries. Zero timeout value means the entry is added permanent to the set. The timeout value of already added elements can be changed by readding the element using the -exist option. Example: ipset create test hash:ip timeout 300 ipset add test 192.168.0.1 timeout 60 ipset -exist add test 192.168.0.1 timeout 600

http://ipset.netfilter.org/ipset.man.html

Jest to preferowany sposób kontrolowania tego zachowania.

Navern
źródło
0

Muszę zablokować adresy IP przez określony czas, a następnie automatycznie odblokować.

Możesz wypróbować następującą

# iptables -I INTPUT -s xxx.xxx.xxx.xxx -m time --utc --datestart 2013-09-09T15:00 --datestop 2013-09-09T15:30 -j DROP
ALex_hha
źródło
0

W zależności od tego, co dokładnie chcesz osiągnąć, w tym celu można użyć modułów najnowszych lub czasowych.

Oba są udokumentowane na stronie podręcznika iptables .

TimS
źródło