Przesłać dalej do klienta VPN?

21

Natrafiłem na trochę układanki i nie miałem szczęścia znaleźć rozwiązania. Obecnie jestem (niestety) połączony z siecią przez Verizon 3G. Filtrują cały ruch przychodzący, więc nie mogę otworzyć portów, aby zaakceptować połączenia.

Obecnie mam maszynę wirtualną z linuksem na linode.com i przyszła mi do głowy myśl, aby zainstalować pptpdi spróbować iptablesprzekierować porty. Mam pptpdzainstalowany i moja maszyna do domu łączy się szczęśliwie. To powiedziawszy, oto kilka ogólnych informacji:

Serwer (Debian) WAN IP: xxxx na eth0 - pptpd IP: rrr1 na ppp0 - IP klienta VPN: rrr100

Aby sprawdzić, czy nie oszaleję, próbowałem nawiązać pewne połączenia z serwera do otwartych portów na kliencie, a klient akceptuje połączenia za pośrednictwem adresu IP VPN.

To, co chcę osiągnąć, to:

Internet -> WAN IP: Port -> Przekaż do klienta VPN IP: Port

Na przykład, jeśli miałbym otwarty port 6000 na moim kliencie, osoba mogłaby telnetować do xxxx: 6000, a serwer przechwyciłby to i przesłał go do 192.168.3.100:6000.

Próbowałem co najmniej 20 różnych konfiguracji Googled up iptablesi żadna jeszcze nie działała. Czy ktoś ma jakieś pomysły, a może zupełnie inne podejście, o którym być może nie wiem? Celem jest słuchanie przez strasznie zaporowe połączenie, najlepiej zarówno TCP, jak i UDP.

Podły Brigandier
źródło

Odpowiedzi:

25

Aby to działało, musisz wykonać trzy czynności na serwerze VPN (Linode):

  1. Musisz włączyć przekazywanie adresów IP:

    sysctl -w net.ipv4.ip_forward=1
    
  2. Ustaw docelowy NAT (DNAT), aby przekierować port. Prawdopodobnie już to wymyśliłeś, ponieważ jest to standardowa funkcja przekierowywania portów, ale dla kompletności:

    iptables -t nat -A PREROUTING -d x.x.x.x -p tcp --dport 6000 -j DNAT --to-dest y.y.y.100:6000
    
  3. Skonfiguruj źródłowy NAT (SNAT), aby z perspektywy klienta VPN połączenie pochodziło z serwera VPN:

    iptables -t nat -A POSTROUTING -d y.y.y.100 -p tcp --dport 6000 -j SNAT --to-source y.y.y.1
    

Powodem, dla którego potrzebujesz SNAT, jest to, że w przeciwnym razie klient VPN wyśle ​​swoje pakiety zwrotne bezpośrednio do hosta, który zainicjował połączenie (zzzz) za pośrednictwem domyślnej bramy (tj. Verizon 3G), a nie przez VPN. Zatem źródłowy adres IP na pakietach zwrotnych będzie Twoim adresem Verizon 3G, a nie xxxx Powoduje to różnego rodzaju problemy, ponieważ zzzz naprawdę zainicjował połączenie z xxxx

W większości konfiguracji przekierowania portów SNAT nie jest potrzebny, ponieważ host wykonujący przekierowanie portów jest również domyślną bramą dla hosta docelowego (np. Routera domowego).

Pamiętaj również, że jeśli chcesz przekierować port 6000 na inny port (powiedzmy 7000), to reguła SNAT powinna pasować do 7000, a nie 6000.

AGWA
źródło
Cześć AGWA, dziękuję za odpowiedź. Miałem już ip_forwarding, a twoje reguły działały idealnie, choć początkowo nie. Problem polegał na tym (w mojej noobness iptables), że nie zdawałem sobie sprawy, że iptables -F nie opróżniał wpisów nat, a iptables -L ich nie wyświetlał. Po zastanowieniu się, jak poprawnie je wyświetlić, zauważyłem kilka sprzecznych wpisów z prób wcześniej. Po wypłukaniu i wypróbowaniu reguł działa idealnie. Jedno szybkie pytanie, w swoich regułach określasz tcp. Czy zmiana tego ustawienia na „wszystkie” działałaby zarówno dla ruchu TCP / UDP?
Vile Brigandier
Nie ma za co! (Nawiasem mówiąc, lubię używać iptables-savedo wyświetlania moich reguł iptables - podczas gdy dane wyjściowe nie są przeznaczone do spożycia przez ludzi, nadal są czytelne i pokazują wszystkie twoje reguły iptables.) Nie, niestety nie możesz tam użyć „wszystkich”, ponieważ --dporttylko współpracuje z protokołami, które faktycznie mają porty („wszystkie” obejmują np. ICMP, który nie ma pojęcia portów). Będziesz potrzebował osobnych reguł dla TCP i UDP.
AGWA
Dzięki za wskazówkę dotyczącą oszczędzania iptables. Wszystko działa zgodnie z oczekiwaniami zarówno dla protokołu TCP, jak i UDP. Twoje zdrowie.
Vile Brigandier,
2
Jedyną aktualizacją tej odpowiedzi jest to, że dzięki iproute2 możesz faktycznie skonfigurować klienta VPN, aby miał 2 bramy i kierował ruch DNAT z powrotem przez VPN. Jest to korzystne, jeśli nie chcesz używać SNAT, a cały ruch wydaje się pochodzić z serwera VPN. thomas-krenn.com/en/wiki/Two_Default_Gateways_on_One_System zawiera informacje na temat konfiguracji.
PressingOnAlways
Działa dla mnie tak długo, jak ufw jest wyłączony, mimo że zezwoliłem na 8080 w ufw, ale jak tylko włączę ufw, to przekazywanie rzeczy nie działa ... jakiś pomysł?
Sudhir N
3

Miałem również ten problem i próbowałem go rozwiązać godzinami. Oto moje rozwiązanie:

  • Miałem więcej niż jeden VPNClientz tym samym IPAddress. Dałem więc każdemu z nich szumIPAddress

Zdefiniuj katalog, w którym powinny być przechowywane skrypty klienta, np. / Etc / openvpn / staticclients i utwórz katalog

mkdir /etc/openvpn/staticclients

Dodaj ten katalog jako opcję do pliku konfiguracyjnego openvpn na serwerze:

client-config-dir /etc/openvpn/staticclients

Dla każdego klienta musisz utworzyć plik. Nazwa pliku musi być zgodna z common nameatrybutem określonym w certyfikacie klienta. To polecenie pobiera CN z certyfikatu komputera:

Ten przykład wypycha IPAddress10.1.134.110/10.1.134.109 do klienta z common name TESTCLIENT, a także wypycha dodatkową trasę dla podsieci 10.1.135.0.

cat /etc/openvpn/staticclients/TESTCLIENT

ifconfig-push 10.1.134.110 10.1.134.109
push "route 10.1.135.0 255.255.255.0 10.1.134.62"
sysctl -w net.ipv4.ip_forward=1

iptables -t nat -A PREROUTING -p tcp --dport 28006 -j DNAT --to 10.1.134.110
Dominic Jonas
źródło
2

Większość serwerów ma wyłączone przekazywanie adresów IP w domyślnej konfiguracji. Musisz włączyć tę opcję, jeśli chcesz przekierowywać połączenia przychodzące przez VPN.

Spróbuj tego:

sysctl -w net.ipv4.ip_forward = 1

Mam na myśli oprócz konfiguracji iptables.

Andrey Voitenkov
źródło
0

To, co chcesz osiągnąć, jest (prawdopodobnie) bardzo możliwe w przypadku pptpdOpenVPN i iptables, jednak może okazać się lepszym kandydatem do tego przypadku użycia. Właśnie przeczytałem ten, który opisuje, jak skonfigurować tinc dla dokładnie tego przypadku użycia. Jest to (potencjalnie prostsza) alternatywa dla części pptdplub OpenVPN. Wtedy potrzebujesz dokładnie tych samych reguł dla iptables.

chmac
źródło