Mam bramę Linux wykonującą NAT dla mojej sieci domowej. Mam inną sieć, do której chciałbym transparentnie przekierowywać pakiety, ale tylko do / z określonych adresów IP / portów (tj. Nie VPN). Oto kilka przykładów adresów IP i portów do pracy:
Source Router Remote Gateway Remote Target
192.168.1.10 -> 192.168.1.1 -> 1.2.3.4 -> 192.168.50.50:5000
Chciałbym, aby maszyna źródłowa mogła komunikować się z określonymi portami w zdalnym celu, tak jakby była bezpośrednio routowalna z routera. Na routerze eth0 jest siecią prywatną, a eth1 jest połączony z Internetem. Remote Gateway to kolejna maszyna Linuksa, do której mogę ssh i może kierować bezpośrednio do Remote Target.
Moja próba prostego rozwiązania polega na skonfigurowaniu przekierowania portów ssh na routerze, takich jak:
ssh -L 5000:192.168.50.50:5000 1.2.3.4
Działa to dobrze dla routera, który może teraz łączyć się lokalnie z portem 5000. Tak więc „telnet localhost 5000” zostanie podłączony do 192.168.50.50:5000 zgodnie z oczekiwaniami.
Teraz chcę przekierować ruch ze źródła i ścieżkę przez ustanowiony tunel ssh. Próbowałem do tego reguły NAT:
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 127.0.0.1:5000
a ponieważ router jest już moją bramą NAT, ma już wymaganą regułę przekierowania:
-A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE
Większość pytań i odpowiedzi na tej stronie lub w innym miejscu wydaje się dotyczyć portów przesyłania dalej lub NAT-spinki do włosów, z których oba działają dobrze gdzie indziej, ale żadne z nich nie dotyczy tej sytuacji. Z pewnością mógłbym przesłać DMZ porty Remote Target przez Remote Gateway, ale nie chcę, aby porty były dostępne w Internecie, chcę, aby były dostępne tylko przez bezpieczny tunel SSH.
Najlepsza odpowiedź, jaką mogę znaleźć, dotyczy odrzucenia pakietu marsjańskiego w jądrze Linux:
iptables, jak przekierować port z pętli zwrotnej?
Włączyłem rejestrowanie Marsjan i potwierdziłem, że jądro odrzuca te pakiety jako Marsjanie. Tyle że nie są: wiem dokładnie, po co są te pakiety, skąd pochodzą i dokąd idą (mój tunel ssh).
Przedstawione tam rozwiązanie „ronda” dotyczy tego pierwotnego pytania, ale nie dotyczy mojej sprawy.
Jednak pisząc / badając to pytanie, obejrzałem swój problem, używając powiązania źródłowego adresu IP SSH w następujący sposób:
ssh -L 192.168.1.1:5000:192.168.50.50:5000 1.2.3.4
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 192.168.1.1:5000
Ponieważ nie używam sprzężenia zwrotnego, omija to odrzucenie Marsa.
Nadal zamieszczam pytanie tutaj z dwóch powodów:
- W nadziei, że ktoś, kto próbuje zrobić coś podobnego w przyszłości, znajdzie to w swoich wyszukiwaniach, a to obejście może im pomóc.
- Nadal wolę pomysł, aby mój port ssh przekazywał połączenie tylko do pętli zwrotnej i był w stanie kierować do nich przez iptables. Ponieważ wiem dokładnie, czym są te pakiety i dokąd zmierzają, czy nie powinno być sposobu, aby je oflagować jako takie, aby filtrowanie marsjańskie systemu Linux ich nie odrzucało? Całe moje wyszukiwanie na ten temat prowadzi do rp_filter, co wcale nie pomogło w moich testach. I nawet jeśli zadziałało, nie jest ono specyficzne dla pakietów, na które staram się zezwolić.
Jestem zainteresowany udziałem w moim pytaniu i obejściu dla ogólnego wyszukiwania, aby zaoszczędzić komuś godziny poszukiwań, które wymyśliłem tylko w celu znalezienia ślepych zaułków, a także mam nadzieję, że ktoś odpowie na część mojego pytania zwrotnego / marsjańskiego, która wciąż pozostaje otwarta Dla mnie.
źródło
Odpowiedzi:
Problem z zrobieniem DNAT do 127.0.0.1:5000 polega na tym, że gdy strona zdalna odpowiada, pakiety te wracają do silnika routingu, jakby były lokalnie (od 127.0.0.1), ale mają zewnętrzny adres docelowy. SNAT / MASQUERADE pasujące do zewnętrznego interfejsu złapałyby je i przepisały, ale decyzje o routingu, które muszą być podjęte, aby pakiety dotarły do tego interfejsu, były pierwsze i nie zezwalają na te pakiety, które są domyślnie fałszywe. Mechanizm routingu nie może zagwarantować, że pamiętasz, aby później to przepisać.
Zamiast tego należy odrzucić wszelkie połączenia zewnętrzne do 192.168.1.1:5000 w iptables INPUT inne niż te pochodzące z 192.168.1.10, używając
!
argumentu przed podaniem-s
adresu źródłowego. Jeśli użyjesz resetowania TCP jako mechanizmu odrzucania (-j REJECT --reject-with tcp-reset
zamiast domyślnego miejsca docelowego ICMP nieosiągalnego), będzie on w dużej mierze identyczny z sytuacją, w której nic nie nasłuchiwałoby pod tym adresem: kombinacją portów w odniesieniu do świata zewnętrznego.źródło
Użyłbym openVPN do stworzenia tunelu od routera do RemoteGateway.
Następnie na routerze dodałbym trasę:
route add -host RemoteTarget gw RemoteGateway-VPNaddress
używaj prostej reguły iptables, gdziekolwiek chcesz ograniczyć porty, do których zezwalasz Sourceowi się dostać.
źródło