Muszę dodać regułę do iptables, aby blokować połączenia z portem TCP z Internetu.
Ponieważ mój skrypt może być wywoływany wiele razy i nie ma skryptu, który mógłby usunąć regułę, chcę sprawdzić, czy reguła iptables już istnieje przed wstawieniem - w przeciwnym razie w łańcuchu INPUT będzie wiele reguł dup.
Jak mogę sprawdzić, czy reguła iptables już istnieje?
Odpowiedzi:
W
-C --check
najnowszych wersjach iptables pojawiła się nowa opcja.W przypadku starszych wersji iptables skorzystałbym z sugestii Garretta:
źródło
Nowa
-C
opcja nie jest satysfakcjonująca, ponieważ jest otwarta na warunki wyścigu od momentu sprawdzenia do czasu użycia (TOCTTOU). Jeśli dwa procesy spróbują dodać tę samą regułę mniej więcej w tym samym czasie,-C
nie ochronią ich przed dwukrotnym dodaniem.Tak więc to naprawdę nie jest lepsze niż
grep
rozwiązanie. Dokładne zadanie przetwarzania tekstu na wyjściuiptables-save
może działać równie niezawodnie-C
, ponieważ dane wyjściowe są wiarygodną migawką stanu tabel.Potrzebna jest
--ensure
opcja, która atomowo sprawdza i dodaje regułę tylko wtedy, gdy jeszcze nie istnieje. Ponadto byłoby miło, gdyby reguła została przeniesiona do prawidłowej pozycji, do której wstawiono by nową regułę, gdyby jeszcze nie istniała (--ensure-move
). Na przykład, jeśliiptables -I 1
zostanie użyty do stworzenia reguły na szczycie łańcucha, ale reguła ta istnieje już na siódmej pozycji, wówczas istniejąca reguła powinna przejść na pierwszą pozycję.Myślę, że bez tych funkcji możliwe jest obejście pętli skryptu powłoki w oparciu o ten pseudo kod:
Ten kod może się kręcić; nie gwarantuje to, że dwóch lub więcej zawodników wyląduje w określonej liczbie iteracji. Aby to zrobić, można dodać kilka losowych snów wykładniczych.
źródło
Może się to wydawać nieco wstecz, ale działa dla mnie - najpierw spróbuj usunąć regułę.
iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP;
Powinieneś otrzymać wiadomość podobną do:
iptables: Zła reguła (czy istnieje pasująca reguła w tym łańcuchu?)
Następnie po prostu dodaj swoją regułę jak zwykle:
iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP;
źródło
Po prostu wymień i wyszukaj?
... lub jednak masz określoną regułę. Jeśli
grep -q
go użyjesz, nic nie wyświetli i możesz po prostu sprawdzić wartość zwracaną za pomocą$?
źródło
iptables-save|grep $ip
zamiast tego, ponieważ jest to łatwiejszy do przeanalizowania format, szczególnie w skrypcie. Jeśli chcesz, możesz również sprawdzić dokładną składnię polecenia.iptables-save|grep $ip
może bardzo dobrze pasować do wielu reguł. Możliwe, żeiptables-save
można go użyć do sprawdzenia pełnej specyfikacji reguły, ale wciąż jest to trochę kłopot: zwrócony formatiptables-save
może nie pasować dokładnie do reguły w skrypcie.iptables-save
może generować opcje w innej kolejności, dodawać rzeczy (jak-m tcp
) i tak dalej.iptables --list
spróbujesz rozwiązać znane porty. Upewnij się więc o tym, zanim zaczniesz szukać portu.Co powiesz na pierwsze dodanie, a następnie usunięcie duplikatów, jak opisano w https://serverfault.com/questions/628590/duplicate-iptable-rules . Wydaje się, że najłatwiejsze (dla linii sąsiednich)
źródło
Aby uniknąć powielania reguł ze skryptu, dodaj poniższy wiersz.
Pierwszy raz, gdy uruchomione zostanie powyższe polecenie, obserwujemy poniższy komunikat
To jest tylko informacja. Ale druga połowa polecenia zapewni dodanie reguły.
źródło