Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

iptables - blokowanie dla wszystkich, a później otwarcie dla wybranego portu

205 views
Skip to first unread message

Mik

unread,
Sep 16, 2008, 3:01:21 PM9/16/08
to
Witam!

Mam pytanie mocno techniczne:) Uruchomiony na linuksie jest
aplikację do której będą łączyć się autoryzowane osoby. Aplikacja
nasłuchuje na porcie powiedzmy 20000.

Dając polecenie:

iptables -A INPUT -p tcp --dport 20000 -j DROP

blokuję dostęp do niej wszystkim, nawet tym, co aktualnie są podłączeni
- czy to jest prawda? Z moich doświadczeń wynika, że tak, lecz
chciałbym potwierdzenie, czy przerywa to także zawiązane połączenie
(teoretycznie skoro blokuje pakiety, to całe połączenie nie ma sensu
bytu, lecz chcę się upewnić...)

Drugą kwestią jest to, że później nie wiem, w jaki sposób udostępnić
ten port dla wybranego IP. Polecenie:

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

nie pomaga, w iptables -L mam:
root@mik:/home/d/camera/streamdata# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- anywhere anywhere tcp dpt:20000
ACCEPT tcp -- anywhere anywhere tcp dpt:20000

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Podejrzewam, że problem jest z kolejnością Drop nad Accept. Czy
jest jakaś możliwość aby otworzyć to połączenie bez resetowania całego
łańcucha? Bo wtedy muszę znowu zablokować wszystkim dostęp oprócz
wybranym...
Chociaż, jeśli dane ip będzie miało odblokowany dostęp do
portu... i zmieniając kolejność najpierw dam jej uprawnienia, a
następnie wszystkim odetnę, to one powinny mieć go... hmm.. działa :)
Ok.. jakieś rozwiązanie znalazłem.


To w takim razie, czy da się to zrobić bez iptables --flush i
załadowaniu od nowa blokad i uprawnień??

Mam nadzieję, że wiadomo o co chodzi.. od 8 siedzę i piszę skrypt w
bash obsługujący to wszystko... wiele wiele zależności...

pozdrawiam i dzięki za pomoc
Mik
ps. Czas do domku :D ostatni autobus zaraz odjeżdża :)


bo...@nano.pl

unread,
Sep 16, 2008, 3:10:07 PM9/16/08
to
Mik pisze:

> Witam!
>
> Mam pytanie mocno techniczne:) Uruchomiony na linuksie jest
> aplikację do której będą łączyć się autoryzowane osoby. Aplikacja
> nasłuchuje na porcie powiedzmy 20000.
>
> Dając polecenie:
>
> iptables -A INPUT -p tcp --dport 20000 -j DROP
>
> blokuję dostęp do niej wszystkim, nawet tym, co aktualnie są podłączeni
> - czy to jest prawda? Z moich doświadczeń wynika, że tak, lecz
> chciałbym potwierdzenie, czy przerywa to także zawiązane połączenie
> (teoretycznie skoro blokuje pakiety, to całe połączenie nie ma sensu
> bytu, lecz chcę się upewnić...)
>
> Drugą kwestią jest to, że później nie wiem, w jaki sposób udostępnić
> ten port dla wybranego IP. Polecenie:
>
> iptables -A INPUT -p tcp --dport 20000 -j ACCEPT

spróbuj iptables -I INPUT

-I wstawia na początek łańcucha, -A na koniec. Taki hint, iptables -L -n
--line-numbers listuje z numerami linii łańcuchy, jeśli dasz iptables -I
INPUT numer, to wstawisz w konkretne miejsce.

>
> nie pomaga, w iptables -L mam:
> root@mik:/home/d/camera/streamdata# iptables -L
> Chain INPUT (policy ACCEPT)
> target prot opt source destination
> DROP tcp -- anywhere anywhere tcp dpt:20000
> ACCEPT tcp -- anywhere anywhere tcp dpt:20000

wer

Lemat

unread,
Sep 16, 2008, 4:10:15 PM9/16/08
to
Mik wrote:

> Witam!
>
> Mam pytanie mocno techniczne:) Uruchomiony na linuksie jest
> aplikację do której będą łączyć się autoryzowane osoby. Aplikacja
> nasłuchuje na porcie powiedzmy 20000.
>
> Dając polecenie:
>
> iptables -A INPUT -p tcp --dport 20000 -j DROP
>
> blokuję dostęp do niej wszystkim, nawet tym, co aktualnie są podłączeni
> - czy to jest prawda?

niekoniecznie - -A wstawia regułę na koniec łańcucha więc wszystko zależy od
tego co masz wcześniej

> Z moich doświadczeń wynika, że tak, lecz
> chciałbym potwierdzenie, czy przerywa to także zawiązane połączenie
> (teoretycznie skoro blokuje pakiety, to całe połączenie nie ma sensu
> bytu, lecz chcę się upewnić...)

-I wstawia na początek - wtedy wcześniej nie będzie żadnej reguły
dopuszczającej i rzeczywiście pakiety zostaną zablokowane.



> Drugą kwestią jest to, że później nie wiem, w jaki sposób udostępnić
> ten port dla wybranego IP. Polecenie:
>
> iptables -A INPUT -p tcp --dport 20000 -j ACCEPT

to trzeba wstawić wcześniej niż -j DROP
czyli znowu -I



> nie pomaga, w iptables -L mam:
> root@mik:/home/d/camera/streamdata# iptables -L
> Chain INPUT (policy ACCEPT)
> target prot opt source destination
> DROP tcp -- anywhere anywhere tcp dpt:20000
> ACCEPT tcp -- anywhere anywhere tcp dpt:20000

idąc od góry napotykasz na -j DROP i na tym się kończy przetwarzanie
łańcucha.



> Podejrzewam, że problem jest z kolejnością Drop nad Accept. Czy
> jest jakaś możliwość aby otworzyć to połączenie bez resetowania całego
> łańcucha? Bo wtedy muszę znowu zablokować wszystkim dostęp oprócz
> wybranym...

> To w takim razie, czy da się to zrobić bez iptables --flush i


> załadowaniu od nowa blokad i uprawnień??

-D INPUT /numer/ kasuje regułę z /numer/ linii z łańcucha
-I INPUT /numer/ wstawia regułę w /numer/ linii od góry

--
Pozdrawiam
Lemat
The Internet does not need law enforcement, it only needs few good sysadmins
with cojones.

Mik

unread,
Sep 17, 2008, 3:07:36 AM9/17/08
to
Dnia Tue, 16 Sep 2008 22:10:15 +0200
Lemat <lemat_ha...@lemat.priv.pl> napisał(a):

> -I wstawia na początek - wtedy wcześniej nie będzie żadnej reguły
> dopuszczającej i rzeczywiście pakiety zostaną zablokowane.
>

I to zastosuję:)) Dzięki. Teraz takie pytanie techniczne... Pewnie nie
ma to znaczenia biorąc pod uwagę, jak wielkie sieci są tworzone, ale
wolę się upewnić, czy kombinacje takich komend jak:

iptables -s 200.200.200.1 -I INPUT -p tcp --dport 20000 -j DROP
iptables -s 200.200.200.1 -I INPUT -p tcp --dport 20000 -j ACCEPT
(ip wzięte przykładowe z internetu)

Nie przyblokuje serwera? Tak, żeby już po prostu nic nie działało?
Niestety, czyszczenie całej tablicy iptables nie wchodzi w grę, są tam
reguły które blokują, filtrują i oznaczają ruch, niezależnie od moich
działań. Restart maszyny mogę zrobić co jakiś czas - wiadoma sprawa. Ale
im rzadziej tym lepiej - mniej przerw w działaniu serwerów i aplikacji.

Minimalnie zakładam, że takich ACCEPT i DROP będzie przybywać
około 10/godzinę (może później być nawet więcej). Czyli po 7 dniach
będzie tego około 3360. Wrzucić do crona restart maszyny o tej 3 czy 4
rano, czy może spokojnie stać sobie powiedzmy przez ponad miesiąc?


pozdrawiam
Mik

Mik

unread,
Sep 17, 2008, 3:08:39 AM9/17/08
to
Dzięki wielkie. Jeszcze jedno mam pytanie, napisałem w odpowiedzi do
Lemata. Jeśli coś wiesz na ten temat, daj znać proszę:)

dzięki wielkie
pozdrawiam
Mik

Lemat

unread,
Sep 17, 2008, 3:17:07 AM9/17/08
to
Mik wrote:

zacznij goglować ze słowem kluczowym ipset

Mik

unread,
Sep 17, 2008, 4:28:58 AM9/17/08
to
Dnia Wed, 17 Sep 2008 09:17:07 +0200
Lemat <lemat_ha...@lemat.priv.pl> napisał(a):

> zacznij goglować ze słowem kluczowym ipset


Hmm googlam googlam i dotąd nie wiem do czego to służy, tylko jakieś
przykłady... nie ma co... se projekt wymyśliłem :) Przy oooolbrzymiej
ilości wyników w google przy ipset wydawało mi się, że literówka Ci się
zdarzyła i miało być ipsec:) Ale jednak chyba nie...


pozdr.
Mik

Igor Wawrzyniak

unread,
Sep 17, 2008, 4:38:51 AM9/17/08
to
Tako rzecze Mik:

>> zacznij goglować ze słowem kluczowym ipset
>
>
> Hmm googlam googlam i dotąd nie wiem do czego to służy, tylko jakieś
> przykłady...

Służy do tego, by mieć jedną regułkę dla wielu adresów. To bardzo
zmniejsza obciążenie routera. Co więcej, możesz w locie zmienić zestaw
regułek. Dokumentacji faktycznie nie ma zbyt wiele, ale te przykłady
wystarczą.

--
Igor Wawrzyniak

Mik

unread,
Sep 17, 2008, 5:42:04 AM9/17/08
to
Dnia Wed, 17 Sep 2008 10:38:51 +0200
Igor Wawrzyniak <ig...@sf-f.usun-to.pl> napisał(a):

Właśnie oglądam przykłady. Pochwalę się, jak mi coś wyjdzie.

W jakim pakiecie jest ipset? Mam iptables, ipsec i w żadnym z nich.
Szukam źródeł i skompiluję. Na debiana pakiety są, na archlinux nie
ma :(

pozdrawiam
Mik

Mik

unread,
Sep 17, 2008, 5:55:34 AM9/17/08
to
Dnia Wed, 17 Sep 2008 10:38:51 +0200
Igor Wawrzyniak <ig...@sf-f.usun-to.pl> napisał(a):

> Służy do tego, by mieć jedną regułkę dla wielu adresów. To bardzo


> zmniejsza obciążenie routera. Co więcej, możesz w locie zmienić zestaw
> regułek. Dokumentacji faktycznie nie ma zbyt wiele, ale te przykłady
> wystarczą.

I jeszcze pewnie bardzo głupie pytanie. Czy ipset ingeruje w już
zastosowane reguły? Ja tylko do jednego portu będę się odwoływać, ale
czy całość nie zmieni czegoś, co już istnieje?


dzięki wielkie za odpowiedź
pozdrawiam
Mik
ps. ipset już ślicznie skompilowane

Mik

unread,
Sep 17, 2008, 9:54:13 AM9/17/08
to
Witam!

Teraz mam taki problem.

Zacząłem się dopiero teraz tym bawić, miałem kilka innych zajęć i...

(Oczywiście póki co eksperymentuję)

Zrobiłem takie coś:
najpierw zamykam wszystkim dostęp do portu (bo przez ipset nie da się
tego zrobić chyba.. )
iptables -I INPUT -p tcp --dport 17000 -j DROP

Daję zakres portów:
./ipset -N otworzyc ipmap --from 192.168.1.201 --to 192.168.1.201

ustalam którego IP to dotyczy:
./ipset -A otworzyc 192.168.1.201


no i iptables:
iptables -I INPUT -i eth0 -m set --set otworzyc src -j ACCEPT
iptables v1.4.0: Couldn't load match `set':/usr/lib/iptables/libipt_set.so: cannot open shared object file: No such file or directory

Try `iptables -h' or 'iptables --help' for more information.

Czy ja coś źle robię, czy też mam błąd w systemie?

poza tym, w punkcie:
./ipset -N otworzyc ipmap --from 192.168.1.201 --to 192.168.1.201
trzeba podać zakres ip, klasę. Teraz jeśli będą to najróżniejsze IP z
całego świata, w jaki sposób ten zakres zdefiniować? Od 1.0.0.1 do
255.255.255.255

I co później mam zrobić z tym IP, aby zamknąć mu dostęp do portu?
Wiem, pewnie to są podstawowe rzeczy, lecz ja jestem qrcze programistą
i dopiero teraz przyglądam się tematowi...


dzięki i pozdrawiam
Mik

Igor Wawrzyniak

unread,
Sep 17, 2008, 12:17:28 PM9/17/08
to
Tako rzecze Mik:

> no i iptables:
> iptables -I INPUT -i eth0 -m set --set otworzyc src -j ACCEPT
> iptables v1.4.0: Couldn't load match
> `set':/usr/lib/iptables/libipt_set.so: cannot open shared object file:
> No such file or directory
>
> Try `iptables -h' or 'iptables --help' for more information.
>
> Czy ja coś źle robię, czy też mam błąd w systemie?

Potrzebujesz 3 rzeczy:
- program iptables - to już masz,
- moduł do kernela,
- rozszerzenie do iptables - tego najwyraźniej ci brakuje albo masz w
niewłaściwym miejscu.

Jeżeli samodzielnie kompilowałeś, to być może masz teraz dwie wersje
iptables - jedną w /sbin, to przyszło z systemem, a drugą
w /usr/local/sbin (albo w /usr/sbin albo jeszcze gdzie indziej). Ta
systemowa nie ma rozszerzenia ipset.

--
Igor Wawrzyniak

Mik

unread,
Sep 17, 2008, 2:46:02 PM9/17/08
to
> Potrzebujesz 3 rzeczy:
> - program iptables - to już masz,
mam
> - moduł do kernela,
mam - kompilowałem i zainstalowało się

> - rozszerzenie do iptables - tego najwyraźniej ci brakuje albo masz w
> niewłaściwym miejscu.
tu chyba masz rację - moduł się zainstalował, ale ipset uruchamiam
poprzez ./ipset w katalogu źródłowym, gdzie się kompilowało, ponieważ
instalacja nie skopiowała tego pliku i kilku bibliotek w odpowiednie
miejsca... a tam nie sprawdziłem, czy nie ma tej biblioteki.

dzięki wielkie, jutro sprawdzę :)
pozrdrawiam
Mik

Mik

unread,
Sep 18, 2008, 5:24:03 AM9/18/08
to
Troszkę to trwało, dzisiaj rano wpadłem na genialny pomysł, żeby
zaprzyjaźnić się jednak mocniej ze skryptami w bash (co tam, że cały
skrypt trzymający wszystko w kupie jest bashowy...) i jednak samym
iptables.

Zatem:
1. Blokuję dostęp wszystkim w całym internecie (bez portu UDP... nie
wiem jakie jest tego ryzyko... też zablokuję):
iptables -I INPUT -p tcp --dport 20000 -j DROP

2. Daję dostęp w dany sposób dla wybranych IP:
iptables -I INPUT -s 11.22.33.44 -p tcp --dport 20000 -j ACCEPT
[...]
tyle tego ile potrzeba w różnym czasie działania, także nie wszystko na
raz będzie

3. Komuś wygasł czas dostępu - kasuję wiersz iptables poprzez skrypt
bashowy...
Czyli - pobieram wiersz iptables:
root@mik:/home/d/camera/streamdata# iptables --line-numbers -L -n|grep
10.2.2.2|grep dpt:20000 1 ACCEPT tcp -- 10.2.2.2
0.0.0.0/0 tcp dpt:17000

wykonuję komendę:
iptables -D INPUT 1

cały wiersz wywalony z iptables, nie ma dodatkowych warunków dla pakietów przy transmisji, nie obciąża serwera.

Teraz pytanie dla znawców:
1. Jakie są słabe strony takiego rozwiązania zakładając, że port jest zawsze 20000 (odpada problem dla np. połączeń z portem 200 - taki grep wywaliłby wyniki wtedy z porte, 200, 2000, 20000 - wyższych nie ma)
2. Czy "dpt:20000" jest dobrze określone w grepie, aby uzyskać IP z iptables dające dostęp do tego portu?
3. Czy wynik wynik "iptables --line-numbers -L -n|grep 10.2.2.2|grep dpt:20000", zakładając różne ip, zawsze będzie taki sam, że spokojnie mogę grepować, czy jest spora szansa, że po którejś aktualizacji iptables wynik będzie inaczej prezentowany?
4. Używam nmap do skanowania mojego serwera w sieci. Poblokowałem wszystkie IP na firewallu oprócz tych na których pracuję, wszędzie
-j DROP
nie potrafię zmusić nmapa do przeskanowania tylko jednego określonego portu po tcp i udp - może pomoglibyście mi z poleceniem...

dzięki wielkie
pozdrawiam
Mik

Lemat

unread,
Sep 18, 2008, 5:52:09 AM9/18/08
to
Mik wrote:

grep -w "dpt:200"
grep -E "dpt:200\b"

> 2. Czy
> "dpt:20000" jest dobrze określone w grepie, aby uzyskać IP z iptables
> dające dostęp do tego portu? 3. Czy wynik wynik "iptables --line-numbers
> -L -n|grep 10.2.2.2|grep dpt:20000", zakładając różne ip, zawsze będzie
> taki sam, że spokojnie mogę grepować, czy jest spora szansa, że po którejś
> aktualizacji iptables wynik będzie inaczej prezentowany?

iptables -D INPUT -p tcp -s 10.2.2.2 --dport 20000 -j ACCEPT
będzie lepsze (to jest identyczna linia jak przy zakladaniu tylko
zamiast -A/-I jest -D. iptables sam sobie poszuka "numeru linii"

> 4. Używam nmap do
> skanowania mojego serwera w sieci. Poblokowałem wszystkie IP na firewallu
> oprócz tych na których pracuję, wszędzie -j DROP nie potrafię zmusić nmapa
> do przeskanowania tylko jednego określonego portu po tcp i udp - może
> pomoglibyście mi z poleceniem...

nmap -p

na twoim miejscu rozważyłbym utworzenie osobnego łańcucha

iptables -N PUB_IN20000 2> /dev/null
iptables -F PUB_IN20000
iptables -A INPUT -p tcp --dport 20000 -j PUB_IN20000

i manipulację regułami na tym łańcuchu

iptables -A/-I/-D PUB_IN20000 ...

mniejsza szansa, że się pomylisz i usuniesz sobie dostęp do serwera, albo na
przykład ruch na interfejsie lo.
ruch na innych portach nie będzie przechodził przez tysiąc reguł badających
dostęp do portu 20000

Mik

unread,
Sep 18, 2008, 6:13:47 AM9/18/08
to
Dnia Thu, 18 Sep 2008 11:52:09 +0200
Lemat <lemat_ha...@lemat.priv.pl> napisał(a):

> iptables -D INPUT -p tcp -s 10.2.2.2 --dport 20000 -j ACCEPT
> będzie lepsze (to jest identyczna linia jak przy zakladaniu tylko
> zamiast -A/-I jest -D. iptables sam sobie poszuka "numeru linii"

Wiem, ale w pewnym momencie, -D zaczęło mi zostawać w tablicy
iptables... tylko nie wiem jakim cudem :( I dlatego kombinowałem z
numerem. Ale oczywiście teraz jak sprawdzam, nie potrafię przywrócić
sytuacji... Ale ok... pewnie ja coś z jakąś flagą namieszałem/nie
zwróciłem może uwagi, że to było coś innego a ja pomyślałem, że to
wiersze się rozrastały o -D, jak tam były zwykłe dropy :)

dzięki
Mik

MrMark

unread,
Feb 6, 2009, 1:52:34 AM2/6/09
to
Mik pisze:

1. najpier zrob dla wybranego hosta accept a dopiero potem DROPuj caly
pozostaly chuch na ten port:

iptables -A INPUT -p tcp -s x.x.x.x --dport 20000 -j ACCPET
iptables -A INPUT -p tcp -s x.x.x.y --dport 20000 -j ACCPET
...


iptables -A INPUT -p tcp --dport 20000 -j DROP


2. Domyślen dropowanie wszystkich pakietow niepozadanych mozez zrobic
poprzez zmienę domyslnej polityki:
iptables -P INPUT DROP


Marek

MrMark

unread,
Feb 6, 2009, 2:34:00 AM2/6/09
to
1. najpierw zrob dla wybranego hosta accept a dopiero potem DROPuj caly
pozostaly ruch na ten port:

iptables -A INPUT -p tcp -s x.x.x.x --dport 20000 -j ACCPET
iptables -A INPUT -p tcp -s x.x.x.y --dport 20000 -j ACCPET
...

iptables -A INPUT -p tcp --dport 20000 -j DROP


2. Domyśne dropowanie wszystkich pakietow niepozadanych mozesz zrobic
poprzez zmienę domyslnej polityki łancucha na DROP:

iptables -P INPUT DROP

Caly nie zaakceptowany ruch wejściowy zostanie automatycznie zdropowany.

MrMark

MrMark

unread,
Feb 6, 2009, 2:35:13 AM2/6/09
to
Mik pisze:
ąśćź
0 new messages