Используйте iptables для пересылки ipv6 в ipv4?

15

В настоящее время у меня есть настройка, при которой из-за конфигурации, которая может потребоваться навсегда, у меня есть сервер, доступ к которому возможен только по ipv4. У меня также, однако, есть сервер, к которому может получить доступ ipv6. Мне было интересно, смогу ли я использовать iptables для пересылки трафика ipv6 через определенный порт с одного из серверов на другой, используя трафик ipv4.

Eli
источник
2
То, что вы ищете, называется NAT64, но я не думаю, что iptables подойдет (пока).
Крис С
Крис прав - только что были опубликованы RFC NAT64, я бы подождал, пока что-нибудь действительно поддержит. Тем не менее, вы можете достичь своей цели другим способом, но у нас нет достаточно деталей, чтобы знать наверняка. Например, если это HTTP-сервер, вы можете осуществлять обратный прокси-запрос между протоколами.
Шейн Мэдден

Ответы:

16

В настоящее время IPtables не может этого сделать, поэтому вам необходим процесс пространства пользователя для прокси-соединений. Socat - подходящий инструмент для этого:

socat TCP6-LISTEN:1234,fork TCP4:1.2.3.4:1234
mgorven
источник
1
спасибо, это было полезно! Если кто-то ищет решение UDP: socat UDP6-RECVFROM: 64444, форк UDP4-SENDTO: localhost: 64443 работал для меня
Александр,
10

Как отмечается в комментариях к вашему вопросу , NAT64 еще далеко не готов, даже спустя 3 года.

Вы можете, однако, попробовать 6tunnel, как подсказывает недоумение.

К счастью, он присутствует в репозиториях Debian и Ubuntu, поэтому вы можете установить его очень легко, используя sudo apt-get install 6tunnel. Если вы используете другую систему, вам придется собрать ее из исходного кода .

Сборка из исходного кода на самом деле не сложна, и это всего лишь вопрос запуска некоторых команд (с правами root):

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

Вот его синтаксис, упрощенный:

6tunnel [-4|-6] [-l local-host] original-port destination-host destination-port
  • Опция [-4|-6]необязательна и позволяет указать, будете ли вы связывать (слушать) IPv4 или IPv6 (соответственно).
  • -lтакже необязательно. Это позволяет вам выбрать, какой адрес (IPv4 или IPv6) вы хотите связать.
  • Оригинальный порт это порт , на котором вы будете связываться.
  • Хост назначения , где вы будете направлять трафик на. Это может быть где угодно: localhost, или где-то еще в вашей сети или в Интернете.
  • Порт назначения является порт назначения хоста , который будет получать ваш пересылается трафик.

Например, если вы хотите разрешить доступ к серверу только для IPv4, прослушивающему порт 1337, через IPv6, используйте:

6tunnel -6 1337 localhost 1337

Приведенная выше команда прослушивает порт 1337 на IPv6 и перенаправляет трафик на порт 1337 на той же машине через IPv4. Затем он будет работать в фоновом режиме, так что вам не нужно об этом беспокоиться.

На самом деле, вы должны настроить работу cron, чтобы убедиться, что она все еще работает. 6tunnelпредоставляет пример для вашего удобства! Запускать его при загрузке тоже не должно быть плохой идеей.

Для получения дополнительной документации, запустите 6tunnel -hили man 6tunnel.

Лео Лам
источник
Публикация его как нового ответа, потому что редактирование текущего ответа путаницей слишком сильно изменится и может быть отклонено в качестве предлагаемого редактирования!
Лео Лам
5

Последние версии xinetdтакже могут прослушивать IPv6, а затем переадресовывать соединение на адрес IPv4.

Пример конфигурации, которая прослушивает соединения IPv6 через порт 3389 и перенаправляет их на порт 3389 внутреннего адреса 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
}

Это может быть полезно в более ограниченных средах, поскольку xinetdможет быть установлено с вашей базовой системой или доступно в репозиториях утвержденных поставщиков.

Майкл Хэмптон
источник
3

Я хотел прокомментировать ответ Лео Лэмса и его голос, но мне не хватает репутации. Прежде всего: Большое спасибо, Лео Лам!

Для всех, кто интересуется этой темой: мой интернет-провайдер изменил свое подключение с IPv4 на IPv6 с Dual Stack Lite, что означает, что у меня больше нет собственного IPv4-адреса. Это было проблемой, так как я хочу получить доступ к своей IP-камере с любого компьютера, который не поддерживает IPv6. Чтобы решить эту проблему, я попробовал следующее:

  1. Включение перенаправления IPv6 для порта 99 моего маршрутизатора на мою машину с Ubuntu.
  2. Ubuntu machine (домашняя сеть): sudo 6tunnel -6 99 192.168.178.35 80
  3. vServer Debian со статическим адресом IPv4 и IPv6: sudo 6tunnel -4 99 IPV6PREFIXROUTER:IPV6INTERFACEIDUUBUNTUMACHINE 99
  4. vServer Debian: разрешить входящие tcp-соединения через порт 99 в iptables

Префикс ipv6 был обозначен в моем маршрутизаторе, а идентификатор интерфейса был сопоставлен в процессе пересылки IPv6.

Теперь я могу получить доступ к камере из любого места, используя домен vServer example.com:99. Отлично! Я планирую либо получить малину, которая будет выполнять эту работу, либо банановый м3 для других задач.

Crumar
источник
1
Теперь вы знаете, что делать, когда вам нужна другая IP-камера. Это 2015; покупка того, который не поддерживает IPv6, является пустой тратой денег.
Майкл Хэмптон
это не так, как камера несколько лет: р
Crumar
2

Больше для людей, которые находят эту страницу, чем для OP обязательно (я пришел сюда в поисках решения для подключения IPv6 для приложения IPv4 (Twisted)), одна возможность - приложение 6tunnel, прослушивающее IPv6 и перенаправляющее запросы на другой интерфейс и порт.

замешательство
источник