[+] iptables - pisanie regu

Masz problemy z siecią bądź internetem? Zapytaj tu
siwuch86
Beginner
Posty: 143
Rejestracja: 06 lutego 2008, 11:21
Lokalizacja: Kraków

[+] iptables - pisanie regułek dla zmiennego ip, jak?

Post autor: siwuch86 »

Witam serdecznie!

Mam taki oto problem. Potrzebuje napisac regułkę dla iptables która przekieruje zapytania na port UDP skierowane na adres zewnetrzny, ktory to jest zmienny z uwagi na neo.
Zalezy mi zeby dopasowac pakiety po adresie IP celu a nie interfejsu wchodzacego z tego wzgledu ze chcialbym aby ta regulka dzialala takze jesli pakiety beda przychodzic z sieci lokalnej.
Tak wiec takie opcje odpadaja:

Kod: Zaznacz cały

iptables -t nat -A PREROUTING -i ppp0 -p udp --dport 12345 -j DNAT ....
iptables -t nat -A PREROUTING -p udp --dport 12345 -j DNAT ....
gdyz pierwsza zadziala tylko jesli odwolywac sie bede z zewnatrz a druga wszystko co tylko trafi na serwer zostanie przekierowana - nawet to co dla serwera nie jest przeznaczone.

Uzywam klienta DynDNS ale po wpisaniu -d domena.dyndns.org nie dziala to jak powinno poniewaz po podniesieniu interfejsu klient dyndns nie zdazy zaraportowac nowego adresu i iptables wkleja stary adres kory byl przed padem linka.

Dlatego prosze o pomoc - jak to zrobic abym mogl napisac regulke, ktora bedzie porywnawac adres ip celu i dopasuje tam aktualny adres interfejsu ppp0? Jest cos w iptables czym mozna to zrobic o czym nie wiem czy trzeba kombinowac i pisac skrypt?
Awatar użytkownika
markossx
Beginner
Posty: 489
Rejestracja: 26 maja 2007, 16:01
Lokalizacja: Polska

Post autor: markossx »

Wyciągnij z ifconfig adres ppp0, zapisz go do zmiennej i w regułkach używaj tej zmiennej.
Przykład poniżej zadziała dla eth0:

Kod: Zaznacz cały

#!/bin/bash

 addr=$(ifconfig | grep 'addr:[1-9].[1-9].[1-9].[1-9]' | awk '{ print $2 }' | cut -b 6-20)
 ipt="/sbin/iptables"
 $ipt -A INPUT -d $addr -p tcp --dport 1000 -j ACCEPT
Pokombinuj trochę a osiągniesz to co założyłeś.
siwuch86
Beginner
Posty: 143
Rejestracja: 06 lutego 2008, 11:21
Lokalizacja: Kraków

Post autor: siwuch86 »

Dziękuję.
Przerobiłem to trochę i działa ale nie rozumiem tu wszystkiego?

Możesz mi powiedzieć, dlaczego takie coś działa:

Kod: Zaznacz cały

ifconfig eth0 | grep 'addr:[1-9].[1-9].[1-9].[1-9]'
a takie nie:

Kod: Zaznacz cały

ifconfig ppp0 | grep 'addr:[1-9].[1-9].[1-9].[1-9]'
I czy nie powinno być przypadkiem tak:

Kod: Zaznacz cały

ifconfig | grep 'addr:[1-9].[0-9].[0-9].[0-9]'
I jak to zrobić, żeby reguły firewalla były usuwane i dodawane, od nowa, po każdym restarcie połączenia? Dodałem do /etc/network/interfaces odpowiedni wpis ale działa tylko kiedy ręcznie podniosę/wyłączę interfejs.

I tak przy okazji, może ktoś polecić jakąś fajną książkę do nauki basha? Wiem, że w internecie jest pełno materiałów ale wolę czytać normalne książki.
Awatar użytkownika
markossx
Beginner
Posty: 489
Rejestracja: 26 maja 2007, 16:01
Lokalizacja: Polska

Post autor: markossx »

Proszę bardzo.
Może jest w ppp0, występuje 0 (zero) i dlatego regex tego nie łapie, trudno mi powiedzieć.

Kod: Zaznacz cały

ifconfig ppp0 | grep 'addr:[0-9].[0-9].[0-9].[0-9]' 
Tu mam takie oto wyrażenie:

Kod: Zaznacz cały

\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b
które ładnie wyciąga IP.
&quot pisze: I jak to zrobić, żeby reguły firewalla były usuwane i dodawane, od nowa, po każdym restarcie połączenia? Dodałem do /etc/network/interfaces odpowiedni wpis ale działa tylko kiedy ręcznie podniosę/wyłączę interfejs.
Może taki skrypt: sprawdza początkowe IP, zapisuje do zmiennej lub pliku, co kilka minut porównuje z tym co jest na ppp0 i z tym co ma w pliku.
Jeśli są różne, to restart interfejsu i zapis nowego IP.
Może nie zbyt optymalne ale nie mam innego pomysłu póki co.

Książki do basha nie znam, ale myślę, że lepiej uczyć się Perla, bash jest na tyle nieskomplikowany, że sam jakoś wchodzi.
siwuch86
Beginner
Posty: 143
Rejestracja: 06 lutego 2008, 11:21
Lokalizacja: Kraków

Post autor: siwuch86 »

Cały problem w tym, że 0 nie występuje właśnie? Poza tym dziwi mnie, że łapie tą linijkę dla eth0 gdzie właśnie 0 występuje.

Tak to wyglada:

Kod: Zaznacz cały

ifconfig eth0 | grep 'addr:[1-9].[1-9].[1-9].[1-9]'
          inet addr:192.168.0.1  Bcast:192.168.0.15  Mask:255.255.255.240
ifconfig eth0 | grep 'addr:[0-9].[0-9].[0-9].[0-9]'
          inet addr:192.168.0.1  Bcast:192.168.0.15  Mask:255.255.255.240
natomiast dla ppp0:

Kod: Zaznacz cały

ifconfig ppp0 | grep 'addr:[0-9].[0-9].[0-9].[0-9]'
ifconfig ppp0 | grep 'addr:[0-9].[0-9].'
ifconfig ppp0 | grep 'addr:[0-9].[0-9]'
ifconfig ppp0 | grep 'addr:[0-9].'
          inet addr:83.27.198.106  P-t-P:213.25.2.xx  Mask:255.255.255.255
Jak widać grep zagarnął tą linijkę z adresem ip dopiero po usunięciu odpowiedniej ilości członów z tego wyrażenia.
Niezależnie od tego, czy jest napisane [1-9] czy [0-9] efekt jest taki sam.

Nie rozumiem czemu tak się dzieje, dlatego chciałbym jakąś książkę przejrzeć. Nie, żebym zamierzał się jakoś bardzo uczyć basha ale podstawy by wypadało mieć.
&quot pisze:sprawdza początkowe IP, zapisuje do zmiennej lub pliku, co kilka minut porównuje z tym co jest na ppp0 i z tym co ma w pliku.
Jeśli są różne, to restart interfejsu i zapis nowego IP.
Może nie zbyt optymalne ale nie mam innego pomysłu póki co.
Też o tym pomyślałem ale tak mi się coś wydaje, że jest do tego jakieś narzędzie więc takie kombinowanie to jakby pod górkę. Oczywiście w ostateczności tak właśnie zrobię.

PS. Nie umiem użyć tego "wyrażenia".
Awatar użytkownika
markossx
Beginner
Posty: 489
Rejestracja: 26 maja 2007, 16:01
Lokalizacja: Polska

Post autor: markossx »

Wyrażonko użyjesz tak:

Kod: Zaznacz cały

grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b'
-E mówi, że będziemy używać Extended RegExp
Faktycznie z tym grepem zastanawiające, nie mam ppp0 ale mam tun0 i poćwiczyłem trochę
i miałem ten sam efekt co u Ciebie, wyszło, że tak zadziała:

Kod: Zaznacz cały

ifconfig tun0 | grep -E 'addr:[0-9].[0-9].[0-9].[0-9]*'
jednak nadal nie wiem do końca dlaczego, może znajdzie się ktoś, kto nam to przybliży :?:
Tu raczej książka do wyrażeń regularnych by się przydała...
... mi sie cos wydaje ze jest do tego jakies narzedzie ...
Jak znajdziesz takowe to zarzuć nazwę.
Awatar użytkownika
lis6502
Member
Posty: 1798
Rejestracja: 05 listopada 2008, 20:14
Lokalizacja: Miasto Szybowców

Post autor: lis6502 »

¦wietny dokument opisujący od podstaw po bardziej skomplikowane przykłady.
W KDE jest graficzny edytor regexa, kregexepditor jak ktoś lubi.
RaV.
Posty: 87
Rejestracja: 28 czerwca 2006, 15:30
Lokalizacja: 127.0.0.1

Post autor: RaV. »

markossx pisze:Faktycznie z tym grepem zastanawiające, nie mam ppp0 ale mam tun0 i poćwiczyłem trochę
i miałem ten sam efekt co u Ciebie, wyszło, że tak zadziała:
Kod:
ifconfig tun0 | grep -E 'addr:[0-9].[0-9].[0-9].[0-9]*'

jednak nadal nie wiem do końca dlaczego, może znajdzie się ktoś, kto nam to przybliży :?:
Tu raczej książka do wyrażeń regularnych by się przydała...
[1-9] - zakres od 1 do 9
. - dowolny znak
\. - kropka

W przypadku
siwuch86 pisze:ifconfig eth0 | grep 'addr:[0-9].[0-9].[0-9].[0-9]'
inet addr:192.168.0.1 Bcast:192.168.0.15 Mask:255.255.255.240
dopasowanie wygląda następująco:
[0-9] - 1
. - 9
[0-9] - 2
. - .
[0-9] - 1
. - 6
[0-9] - 8

dopasował. Teraz zobaczmy co z tym drugim interfejsem:
siwuch86 pisze:natomiast dla ppp0:
Kod:
ifconfig ppp0 | grep 'addr:[0-9].[0-9].[0-9].[0-9]'
ifconfig ppp0 | grep 'addr:[0-9].[0-9].'
ifconfig ppp0 | grep 'addr:[0-9].[0-9]'
ifconfig ppp0 | grep 'addr:[0-9].'
inet addr:83.27.198.106 P-t-P:213.25.2.xx Mask:255.255.255.255
No to lecim:
[0-9] - 8
. - 3
[0-9] - . &#8592]'[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'[/code]
W przetłumaczeniu na nasze:
Ma się pojawić co najmniej jedna cyfra (mówi o tym znak "+" [plus]), następnie "." (kropka - nie dowolny znak, bo poprzedzone "beksleszem"), co najmniej jedna cyfra, kropa, co najmniej jedna cyfra, kropka i co najmniej jedna cyfra.
siwuch86
Beginner
Posty: 143
Rejestracja: 06 lutego 2008, 11:21
Lokalizacja: Kraków

Post autor: siwuch86 »

dzieki wielkie :-)
Pozostal tylko jeden problem - zautomatyzowane odswirzanie firewalla po "restarcie neostrady".
Ktos pomoże :?:
RaV.
Posty: 87
Rejestracja: 28 czerwca 2006, 15:30
Lokalizacja: 127.0.0.1

Post autor: RaV. »

siwuch86 pisze:Pozostal tylko jeden problem - zautomatyzowane odswirzanie firewalla po "restarcie neostrady".
Ktos pomoże
Dostaniesz wędkę, ale rybę złów sobie sam:
1. czasem Neostrada się restartuje.
2. otrzymuje wtedy inny adres IP
3. Jeden ze sposobów to może być sprawdzenie, czy zmienił się adres IP. Jak to zrobić?
3.1. Może z crona co minutę.
3.2. Zapisać gdzieś adres (a może jego skrót...).
3.3. Sprawdzić, czy obecnie posiadany różni się od zapisanego. Jak tak, zaczytaj nowy ogniomurek, zapisz nowy adres, za minutę powtórzyć krok 3.3.

Tak naprawdę to pomysłów może być więcej. Można podpiąć skrypt restartujący firewalla pod dyndnsa lub na chama co minutę zaczytywać reguły. Ta ostatnia to cokolwiek głupia metoda, ale jednak jakaś jest ;)
Powodzenia.
ODPOWIEDZ