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 :)
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
> 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.
> -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
dzięki wielkie
pozdrawiam
Mik
zacznij goglować ze słowem kluczowym ipset
> 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
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
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
> 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
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
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
dzięki wielkie, jutro sprawdzę :)
pozrdrawiam
Mik
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
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
> 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
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
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