Nowe posty

xx Dystrybucja pod HP Omen (6)
Wczoraj o 23:30:08
xx [Poradnik] Wyszukiwanie Sterowników (2)
Wczoraj o 21:08:23
lamp Problem z Linux Lite po instalacji (0)
Wczoraj o 19:50:30
xx Ile pingwinów? (1)
Wczoraj o 08:59:24
xx konfiguracja pale moon (0)
2024-03-24, 21:53:42
xx Plasma 6 w Neonie ssie trochę mniej ... (10)
2024-03-23, 02:38:11
xx problem z instalacja sterowników do karty sieciowej (3)
2024-03-18, 18:10:16
xx Plik abc.001 (1)
2024-03-17, 17:48:27
xx Zlecę dopracowanie programu w MatLab (0)
2024-03-13, 15:28:40
xx Linux Mint 21.3 XFCE brak dźwieku po paru minutach (karta muzyczna zintegrowana) (5)
2024-03-12, 23:07:01

Autor Wątek: PREROUTING / FORWARDING w iptables - nie działa?  (Przeczytany 10655 razy)

sobieski

  • Gość
PREROUTING / FORWARDING w iptables - nie działa?
« dnia: 2008-10-19, 10:15:31 »
Witam serdecznie, mam problem z konfiguracją iptables. Moje regułki wyglądają następująco:

iptables -I FORWARD -p tcp -d 84.38.95.195 --dport 27015 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 27015 -j DNAT --to 84.38.95.195:27015
iptables -I FORWARD -p udp -d 84.38.95.195 --dport 27015 -j ACCEPT
iptables -t nat -A PREROUTING -p udp -i eth0 --dport 27015 -j DNAT --to 84.38.95.195:27015
lecz przekierowanie nadal nie działa (tzn działało przez jakiś czas, później nagle przestało i już nie chce), dlaczego? Dodam, iż wykonałem
echo 1 > /proc/sys/net/ipv4/ip_forward 
echo 1 > /proc/sys/net/ipv4/conf/all/accept_redirects
Zna ktoś przyczynę? Z góry dziękuję.

micu

  • Gość
PREROUTING / FORWARDING w iptables - nie działa?
« Odpowiedź #1 dnia: 2008-10-20, 15:22:51 »
Cześć,

Reguły NAT wyglądają OK. Natomiast filtrowanie w łańcuchu FORWARD (zakładam że domyślne zachowanie to DROP) nie dopuszcza pakietów "wracających".  Jest reguła przesyłająca ruch TCP/UDP  0.0.0.0:0 -> 84.38.95.195:27015 ale brak reguły umożliwającej przesyłanie pakietów (odpowiedzi) w drugą stronę. Z UDP to jeszcze mała bieda, bo można sobie teoretycznie wyobrazić że pakiety wędrują w jedną stronę i nie obchodzi nas co aplikacja z tym robi :-) ale TCP potrzebuje połączenia dwukierunkowego aby działać. Dopisz więc coś takiego dla łańcucha FORWARD:
iptables -A FORWARD -p tcp -s 84.38.95.195 --sport 27015 -j ACCEPT 
iptables -A FORWARD -p udp -s 84.38.95.195 --sport 27015 -j ACCEPT
Jeśli dobrze rozumiem, to 84.38.95.195:27015 to namiary własnego serwera jednej z popularnych gier sieciowych :-) więc regułki FORWARD można zapisać z wykorzystaniem modułu 'conntrack' (-m state) który pozwoli na elegancką obsługę połączeń typu klient-serwer.

Pozdrawiam
Micu

PS0. Zalecam także podawanie w FORWARD interfejsów wejściowych i wyjściowych (-i ,-o) dla własnego bezpieczeństwa.
PS1. Jeśli chodzi o accept_redirects to nie ma ono tutaj wpływu, jeśli chcesz aby było bezpieczniej to możesz to wyłączyć (szczególnie na firewallu).

sobieski

  • Gość
PREROUTING / FORWARDING w iptables - nie działa?
« Odpowiedź #2 dnia: 2008-10-20, 17:21:30 »
Hej,

dziękuję serdecznie za odpowiedź. Posłuchałem Twoich rad, do regułek FORWARD dodałem wejściowy/wyjściowy interfejs jak i adres źródłowy, lecz niestety nadal nie działa. Słusznie zauważyłeś - próbuję zmienić lokalizację fizyczną serwera gry bez zmiany IP.

Cały mój prosty "skrypt" na wprowadzenie reguł iptables wygląda teraz następująco
# clear rules
iptables -F
iptables -P FORWARD ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT

# PREROUTING / FORWARD
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 27015 -j DNAT --to 84.38.95.195:27015
iptables -t nat -A PREROUTING -p udp -i eth0 --dport 27015 -j DNAT --to 84.38.95.195:27015
iptables -A FORWARD -p tcp -i eth0 -o eth0 -s 84.38.95.195 --sport 27015 -d 84.38.95.195 --dport 27015 -j ACCEPT
iptables -A FORWARD -p udp -i eth0 -o eth0 -s 84.38.95.195 --sport 27015 -d 84.38.95.195 --dport 27015 -j ACCEPT

# misc
echo 1 > /proc/sys/net/ipv4/ip_forward
Może nadal w nim coś jest nie tak?

Ponadto, byłbym wdzięczny gdybyś mógł opisać więcej tym module? Wbrew pozorom, umiem korzystać z wyszukiwarek (Google w szczególności), lecz tam są same "suche" informacje, które mi, jako początkującemu w Unixowych systemach jest ciężko zrozumieć.

Pozdrawiam.

micu

  • Gość
PREROUTING / FORWARDING w iptables - nie działa?
« Odpowiedź #3 dnia: 2008-10-21, 09:55:48 »
Hej,

Jeśli masz domyślną "policy" w łańcuchu FORWARD ustawioną na ACCEPT, to tak naprawdę nie musisz tworzyć żadnych reguł dla FORWARD bo dozwalasz na pełny ruch. Oczywiście warto ustawić na DROP i wybijać w firewallu tylko te potrzebne dziury... ale to może później :-)

Jedna sprawa jest dla mnie niejasna. Czyżbyś miał tylko jeden interfejs sieciowy ? Jaką funkcję pełni komputer na którym masz te reguły ? Mógłbyś nieco przybliżyć temat - wtedy będzie łatwiej nam Ci pomóc. Chodzi o to co gdzie jest podłączone (np. eth0 do LANu, eth1 do Internetu itp).

Pozdrawiam
Micu

PS. Nie wiem dokładnie jak dobrze czujesz się w zasadach działania TCP/IP (różnice między TCP a UDP, "cykl życiowy" sesji TCP, co w tym wszystkim robi ICMP). Do używania modułu conntrack oczywiście taka znajomość tematu nie jest potrzebna, są gotowe regułki, ale aby zrozumieć idee jego działania przydaje się podstawowa wiedza.

sobieski

  • Gość
PREROUTING / FORWARDING w iptables - nie działa?
« Odpowiedź #4 dnia: 2008-10-21, 15:06:12 »
Cytuj
Jedna sprawa jest dla mnie niejasna. Czyżbyś miał tylko jeden interfejs sieciowy ? Jaką funkcję pełni komputer na którym masz te reguły ? Mógłbyś nieco przybliżyć temat - wtedy będzie łatwiej nam Ci pomóc. Chodzi o to co gdzie jest podłączone (np. eth0 do LANu, eth1 do Internetu itp).
Dokładnie. Tylko eth0. Sprawa jest następująca: mam dwie maszyny, jedna pod 84.38.95.195 oraz druga pod 84.38.95.197, każda ma tylko jedną sieciówkę. Powiedzmy (bo jest uruchomiony na innym porcie, ale to teraz nie ważne) że mam serwer uruchomiony pod adresem 84.38.95.197:27015 i chcę go przenieść na drugą maszynę, czyli nowe IP serwera będzie 84.38.95.195:27015. Dążę do tego, aby adres 84.38.95.197:27015 działał nadal, mianowicie aby gracze nie odczuli zmian.

W skrócie, łącząc się pod 84.38.95.197:27015 ma nas łączyć pod 84.38.95.195:27015, tylko tak, aby można było pobrać bez problemu status serwera itd.

Cytuj
PS. Nie wiem dokładnie jak dobrze czujesz się w zasadach działania TCP/IP (różnice między TCP a UDP, "cykl życiowy" sesji TCP, co w tym wszystkim robi ICMP). Do używania modułu conntrack oczywiście taka znajomość tematu nie jest potrzebna, są gotowe regułki, ale aby zrozumieć idee jego działania przydaje się podstawowa wiedza.
Prawdę mówiąc nigdy nie zagłębiałem się w "te sprawy" - czytać, oczywiście czytałem kilka razy, lecz było to typowo z ciekawości, nie aby coś zapamiętać.

micu

  • Gość
PREROUTING / FORWARDING w iptables - nie działa?
« Odpowiedź #5 dnia: 2008-10-21, 15:49:01 »
Ok, teraz rozumiem i coś mi już świta...
Mógłbyś podać maskę podsieci i domyślną bramę dla każdego z tych serwerów ? Nie są one przypadkiem w tej samej podsieci ?

Pozdrawiam
Micu

sobieski

  • Gość
PREROUTING / FORWARDING w iptables - nie działa?
« Odpowiedź #6 dnia: 2008-10-21, 17:32:42 »
inet addr:84.38.95.195  Bcast:84.38.95.255  Mask:255.255.255.192
inet addr:84.38.95.197  Bcast:84.38.95.255  Mask:255.255.255.192

micu

  • Gość
PREROUTING / FORWARDING w iptables - nie działa?
« Odpowiedź #7 dnia: 2008-10-22, 09:14:29 »
Dzięki.
Oba serwery są zatem w tej samej podsieci.
Zakładam, że rozwiązanie typu alias IP "starego" na "nowym" odrzuciłeś ze względu na konieczność działania OBU serwerów (przenosisz tylko aplikację z portu 27015). Jeśli miałbyś dostęp do routera to mógłbyś tam zmieniać pakiety, ale wtedy zapewne nie potrzebowałbyś naszej pomocy :-)

Rzuć okiem na ten wątek:
http://forum.linux.pl/viewtopic.php?id=12728
Tam był podobny (nie taki sam!) problem wynikający z tego jak zachowuje się DNAT i routing. Rozwiązanie Twojego problemu też będzie podobne.
Przykład:
Klient 1.2.3.4 z portu np. 55555 wysyła pakiet TCP (dla UDP będzie podobnie z tym że nie jest to protokół połączeniowy) na adres starego serwera 84.38.95.197:27015 . Stary serwer zamienia adres docelowy (DNAT) na 84.38.95.195:27015 i odsyła pakiet do sieci lokalnej do nowego hosta. Nowy host otrzymuje pakiet od 1.2.3.4:55555 więc na taki adres odsyła swoje odpowiedzi. Odpowiedzi wędrują oczywiście przez router (nie przez starego hosta bo niby czemu), klient 1.2.3.4 odrzuca pakiet bo wysyłał do 84.38.95.197 a dostał z 84.38.95.195. Po upływie chwili, z powodu braku odpowiedzi z poprawnego adresu 84.38.95.197:27015 zamyka połączenie. The end :-)
Pomoże tu podparcie się SNATem, więc do regułek na starym serwerze spróbuj dopisać:
iptables -t nat -A POSTROUTING -p tcp --dport 27015 -o eth0 -j SNAT --to-source 84.38.95.197
iptables -t nat -A POSTROUTING -p udp --dport 27015 -o eth0 -j SNAT --to-source 84.38.95.197
Spowoduje to, że pakiety będą wracać przez stary serwer bo adres źródłowy będzie w nich podmieniony.
Wiąże się z tym jednak pewna niedogodność - wszystkie połączenia klientów do nowego serwera będą wyglądały jak połączenia z jednego adresu - IP starego serwera - więc nie będziesz mógł "banować" użytkowników po IP.

Szczerze mówiąc sam jestem ciekaw jak to zadziała na jednym interfejsie, ale powinno być OK. Jeśli będzie działało i będziesz chciał, to podeślę Ci info jak przerobić regułki z wykorzystaniem conntrack. Co prawda nie ma takiej potrzeby dopóki łańcuch FORWARD ma policy ACCEPT - i przy jednym interfejsie faktycznie najlepiej tak zostawić.

Pozdrawiam
Micu

sobieski

  • Gość
PREROUTING / FORWARDING w iptables - nie działa?
« Odpowiedź #8 dnia: 2008-10-22, 16:23:42 »
Po dodaniu tych regułek działa, lecz :/

Cytuj
Wiąże się z tym jednak pewna niedogodność - wszystkie połączenia klientów do nowego serwera będą wyglądały jak połączenia z jednego adresu - IP starego serwera - więc nie będziesz mógł "banować" użytkowników po IP.
Jakiś sposób na obejście tego? Bez tego niestety ani rusz...

micu

  • Gość
PREROUTING / FORWARDING w iptables - nie działa?
« Odpowiedź #9 dnia: 2008-10-22, 20:51:05 »
Obejść to można ale niestety już nie z poziomu aplikacji działającej na nowym kompie.
Po prostu na starym serwerze (84.38.95.197) musisz dodawać regułki iptables w łańcuchu FORWARD na blokowanie pakietów (DROP) z określonych IP. Mało ma to wspólnego z "kick/ban" ale efekt końcowy jest bardzo podobny :-)  

Pozdrawiam
Micu

sobieski

  • Gość
PREROUTING / FORWARDING w iptables - nie działa?
« Odpowiedź #10 dnia: 2008-10-23, 16:22:42 »
Cytuj
Obejść to można ale niestety już nie z poziomu aplikacji działającej na nowym kompie.
To nie problem, tylko napisz jak :)

micu

  • Gość
PREROUTING / FORWARDING w iptables - nie działa?
« Odpowiedź #11 dnia: 2008-10-23, 16:50:31 »
Cytat: sobieski
Cytuj
Obejść to można ale niestety już nie z poziomu aplikacji działającej na nowym kompie.
To nie problem, tylko napisz jak :)
Ależ napisałem! :-)
Cytat: micu
Po prostu na starym serwerze (84.38.95.197) musisz dodawać regułki iptables w łańcuchu FORWARD na blokowanie pakietów (DROP) z określonych IP. Mało ma to wspólnego z "kick/ban" ale efekt końcowy jest bardzo podobny :-)
czyli przekładając na język iptables (przy założeniu policy ACCEPT na łańcuchu FORWARD):
iptables -A FORWARD -p tcp -s A.B.C.D -d 84.38.95.195 --dport 27015 -j DROP
iptables -A FORWARD -p udp -s A.B.C.D -d 84.38.95.195 --dport 27015 -j DROP
gdzie A.B.C.D to adres IP "psotnika".
A tu mała pomoc naukowa (dlaczego blokujemy adres docelowy nowy a nie stary) :
http://xkr47.outerspace.dyndns.org/netfilter/packet_flow/packet_flow9.png
http://jengelh.medozas.de/images/nf-packet-flow.png

Pozdrawiam
Micu

sobieski

  • Gość
PREROUTING / FORWARDING w iptables - nie działa?
« Odpowiedź #12 dnia: 2008-10-31, 23:37:15 »
Heeeeeeeeeeelp me micu :>

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 27015 -j DNAT --to 84.38.95.195:27015
iptables -t nat -A PREROUTING -p udp -i eth0 --dport 27015 -j DNAT --to 84.38.95.195:27015
iptables -A FORWARD -p tcp -i eth0 -o eth0 -s 84.38.95.195 --sport 27015 -d 84.38.95.195 --dport 27015 -j ACCEPT
iptables -A FORWARD -p udp -i eth0 -o eth0 -s 84.38.95.195 --sport 27015 -d 84.38.95.195 --dport 27015 -j ACCEPT
iptables -t nat -A POSTROUTING -p tcp --dport 27015 -o eth0 -j SNAT --to-source 84.38.95.197
iptables -t nat -A POSTROUTING -p udp --dport 27015 -o eth0 -j SNAT --to-source 84.38.95.197
Działa a
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 27016 -j DNAT --to 84.38.95.195:27016
iptables -t nat -A PREROUTING -p udp -i eth0 --dport 27016 -j DNAT --to 84.38.95.195:27016
iptables -A FORWARD -p tcp -i eth0 -o eth0 -s 84.38.95.195 --sport 27016 -d 84.38.95.195 --dport 27016 -j ACCEPT
iptables -A FORWARD -p udp -i eth0 -o eth0 -s 84.38.95.195 --sport 27016 -d 84.38.95.195 --dport 27016 -j ACCEPT
iptables -t nat -A POSTROUTING -p tcp --dport 27016 -o eth0 -j SNAT --to-source 84.38.95.197
iptables -t nat -A POSTROUTING -p udp --dport 27016 -o eth0 -j SNAT --to-source 84.38.95.197
już nie :x

OCB ? Ponadto iptables -F nie chce mi czyścić reguł (wydaje tą komendę i nic, wszystko jak było - to co ustaliłem działa nadal), wiesz może coś na ten temat :)?

PS. Co do tego "banowania" to przepraszam - nie przeczytałem ze zrozumieniem, myślałem że jest jakaś inna droga na ten routing aby poprawnie adresy IP były rozpoznawane, lecz to nie problem już teraz, to rozwiązałem.

sobieski

  • Gość
PREROUTING / FORWARDING w iptables - nie działa?
« Odpowiedź #13 dnia: 2008-11-01, 11:58:03 »
Dałem reboota aby wyczyścić te reguły iptables, po którym maszyna już nie wstała - nie wiem co było powodem, po prostu zgłosiłem do admina... Teraz już ten pierwszy kod działa, więc powinno być ok.

Tak więc ostatnie moje pytanie: jak skutecznie czyścić reguły iptables :) ?

micu

  • Gość
PREROUTING / FORWARDING w iptables - nie działa?
« Odpowiedź #14 dnia: 2008-11-01, 19:57:47 »
Hej,

'iptables -F' czyści reguły tylko dla danej "tabeli" (obecnie mamy nat, mangle, filter i raw). Tabela 'filter' jest domyślna. Wyczyszczenie Twoich reguł powinno więc wyglądać tak:
iptables -t nat -F
iptables -F
Pozdrawiam
Micu