Używać iptables, aby przesłać ipv6 na ipv4?

16

Obecnie mam konfigurację, w której ze względu na konfigurację, która musiałaby trwać wiecznie, mam serwer, do którego dostęp można uzyskać tylko przez ipv4. Mam też serwer, do którego można uzyskać dostęp za pomocą ipv6. Zastanawiałem się, czy mogę użyć iptables do przekazywania ruchu ipv6 na pewnym porcie z jednego serwera na inny serwer przy użyciu ruchu ipv4.

Eli
źródło
2
To, czego szukasz, nazywa się NAT64, ale nie sądzę, że iptables zrobi to (jeszcze).
Chris S
Chris ma rację - NATFC RFC właśnie zostały opublikowane, dałbym mu trochę czasu, aż cokolwiek naprawdę je popiera. To powiedziawszy, możesz osiągnąć swój cel w inny sposób, ale nie mamy wystarczającej ilości szczegółów, aby się upewnić. Na przykład, jeśli jest to serwer HTTP, możesz odwrócić proxy dla żądań między protokołami.
Shane Madden

Odpowiedzi:

16

Tabele IP nie mogą obecnie tego robić, więc potrzebujesz procesu przestrzeni użytkownika do proxy połączeń. socat jest odpowiednim narzędziem do tego:

socat TCP6-LISTEN:1234,fork TCP4:1.2.3.4:1234
mgorven
źródło
1
dzięki, to było pomocne! Na wypadek, gdyby ktoś szukał rozwiązania UDP: socat UDP6-RECVFROM: 64444, rozwidlenie UDP4-SENDTO: localhost: 64443 pracował dla mnie
Alexander
10

Jak zauważono w komentarzach do twojego pytania , NAT64 nie jest jeszcze gotowy, nawet 3 lata później.

Możesz jednak spróbować 6tunnel, jak sugeruje zdziwienie.

Na szczęście jest obecny w repozytoriach Debian i Ubuntu, więc możesz go bardzo łatwo zainstalować sudo apt-get install 6tunnel. Jeśli używasz innego systemu, musisz go zbudować ze źródła .

Budowanie ze źródła naprawdę nie jest trudne i polega jedynie na uruchomieniu niektórych poleceń (jako root):

git clone https://github.com/wojtekka/6tunnel && cd 6tunnel && ./autogen.sh && make && make install

Oto jego uproszczona składnia:

6tunnel [-4|-6] [-l local-host] original-port destination-host destination-port
  • [-4|-6]Jest opcjonalny i pozwala określić, czy będzie wiązać (słuchać) na IPv4 lub IPv6 (odpowiednio).
  • -ljest również opcjonalny. Pozwala wybrać adres (IPv4 lub IPv6), który chcesz powiązać.
  • Oryginalny portem jest port, w którym będziesz wiązać.
  • Host docelowy jest gdzie przekierować ruch do. Może znajdować się w dowolnym miejscu: localhost lub w innym miejscu w sieci lub w Internecie.
  • Portem docelowym jest port hosta docelowego, który otrzyma swoją przekazywane ruchu.

Na przykład, jeśli chcesz zezwolić na dostęp do serwera tylko IPv4, nasłuchującego na porcie 1337, za pośrednictwem IPv6, użyj:

6tunnel -6 1337 localhost 1337

Powyższe polecenie nasłuchuje na porcie 1337 na IPv6 i przekieruje ruch do portu 1337 na tym samym komputerze przez IPv4. Następnie będzie działał w tle, więc nie musisz się o to martwić.

Właściwie powinieneś skonfigurować zadanie crona, aby upewnić się, że nadal działa. 6tunnelstanowi przykład dla Twojej wygody! Uruchomienie go przy rozruchu również nie powinno być złym pomysłem.

Aby uzyskać więcej dokumentacji, uruchom 6tunnel -hlub man 6tunnel.

Léo Lam
źródło
Opublikowanie go jako nowej odpowiedzi, ponieważ edytowanie bieżącej odpowiedzi przez zdziwienie zmieniłoby się o wiele za bardzo i mogłoby zostać odrzucone jako sugerowana edycja!
Léo Lam
5

Najnowsze wersje xinetdmogą również nasłuchiwać na IPv6, a następnie przekazywać połączenie na adres IPv4.

Przykładowa konfiguracja, która nasłuchuje połączeń IPv6 na porcie 3389 i przekazuje je do portu 3389 wewnętrznego adresu IPv4:

service rdp_port_forward
{
    flags           = IPv6
    disable         = no
    type            = UNLISTED
    socket_type     = stream
    protocol        = tcp
    user            = nobody
    wait            = no
    redirect        = 10.187.20.42 3389
    port            = 3389
}

Może to być przydatne w bardziej ograniczonych środowiskach, ponieważ xinetdprawdopodobnie zostanie zainstalowany z systemem podstawowym lub dostępny w zatwierdzonych repozytoriach dostawców.

Michael Hampton
źródło
3

Chciałem skomentować odpowiedź Leo Lamsa i głosować, ale nie mam wystarczającej reputacji. Po pierwsze: bardzo dziękuję Leo Lam!

Dla każdego, kto podejdzie do tego wątku: Mój dostawca usług internetowych zmienił moje połączenie z IPv4 na IPv6 za pomocą Dual Stack Lite, co oznacza, że ​​nie mam już własnego adresu IPv4. To był problem, ponieważ chcę uzyskać dostęp do mojej kamery IP z dowolnego miejsca, które nie obsługuje IPv6. Aby rozwiązać ten problem, próbowałem:

  1. Włączanie przekazywania IPv6 dla portu 99 w moim routerze na moim komputerze Ubuntu.
  2. Maszyna Ubuntu (sieć domowa): sudo 6tunnel -6 99 192.168.178.35 80
  3. vServer Debian ze statycznym adresem IPv4 i IPv6: sudo 6tunnel -4 99 IPV6PREFIXROUTER:IPV6INTERFACEIDUUBUNTUMACHINE 99
  4. vServer Debian: Zezwól na przychodzące połączenia TCP na porcie 99 w iptables

Prefiks ipv6 został oznaczony w moim routerze, a identyfikator interfejsu został zmapowany w procesie przekazywania IPv6.

Teraz mogę uzyskać dostęp do kamery z dowolnego miejsca za pomocą domeny vServer example.com:99 .. Idealnie! Planuję albo kupić malinę, która spełni tę pracę, albo banana pi m3 do innych zadań.

Crumar
źródło
1
Teraz wiesz, co zrobić, gdy potrzebujesz innej kamery IP. Jest 2015; zakup takiego, który nie obsługuje IPv6, jest całkowitą stratą pieniędzy.
Michael Hampton
to nie jest tak, że aparat ma kilka lat: p
Crumar
2

Bardziej na korzyść osób, które znajdują tę stronę niż koniecznie OP (przybyłem tutaj, szukając rozwiązania łączności IPv6 dla aplikacji IPv4 (Twisted)), jedną z możliwości jest aplikacja 6tunnel, nasłuchuje na IPv6 i przesyła żądania do innego interfejsu i Port.

zakłopotanie
źródło