Я пытаюсь настроить сервер TeamSpeak3 в моей домашней сети "net1.mydomain". Он использует подсеть IPv4 10.0.0.0/8 в локальной сети; доступ в Интернет с использованием IPv4 возможен через CGN. Это делает слушателей только для IPv4 (как и TeamSpeak) недоступными для клиентов за пределами «net1.mydomain».
Чтобы обойти этот единственный недостаток, я нашел полезным использование socat
(SOcket CAT; многоцелевое реле), поскольку у меня также есть доступ к машине fwbox.net2.mydomain
которая имеет полное соединение двух стеков IPv4 и IPv6.
Пусть сервер работает на компьютере tsbox.net1.mydomain
, порты 1234/UDP4
(голос), 1234/TCP4
(запрос), 1235/TCP
(файл). После запуска следующего набора команд я могу использовать TS3-клиент для подключения к fwbox.net2.mydomain:1234
как если бы мой TS3-сервер работал там.
ldericher@fwbox$ socat TCP4-LISTEN:1234,fork TCP6:tsbox.net1.mydomain:61234 &# queryport
ldericher@fwbox$ socat TCP4-LISTEN:1235,fork TCP6:tsbox.net1.mydomain:61235 &# fileport
ldericher@fwbox$ socat UDP4-LISTEN:1234,fork TCP6:tsbox.net1.mydomain:61236 &# voiceport
ldericher@tsbox$ socat TCP6-LISTEN:61234,fork TCP4:localhost:1234 &# queryport
ldericher@tsbox$ socat TCP6-LISTEN:61235,fork TCP4:localhost:1235 &# fileport
ldericher@tsbox$ socat TCP6-LISTEN:61236,fork UDP4:localhost:1234 &# voiceport
Ну, почти.
Из-за FIFO-фиксации голосового (UDP-) потока высокий процент пакетов теряется, и соединение становится непригодным для использования. Таким образом, в идеале, он будет просто передавать UDP-пакеты через IPv6 - но использование следующих команд вместо этого просто создает "Отказано в доступе " в tsbox
…
ldericher@fwbox$ socat UDP4-LISTEN:1234,reuseaddr,fork UDP6:tsbox.net1.mydomain:61234 &# voiceport
ldericher@tsbox$ socat UDP6-LISTEN:61234,reuseaddr,fork UDP4:localhost:1234 &# voiceport
... за что я виню в отсутствии соединений UDP. Я пытался поработать с опциями socat
, но безрезультатно. «UDP-RECVFROM» /«UDP-SENDTO» не выдает ошибок, но, похоже, только для однонаправленной пересылки. Я читал о stone
(приложение TCP /IP-повторитель), которое могло бы служить альтернативой, но не оказалось для меня более удобным, чем socat
.
Либо я полностью упустил какой-то момент в отношении UDP, либо просто невозможно выполнить переадресацию UDP вообще, или это мой набор инструментов.
Так есть ли какой-либо способ, какой-либо инструмент или любой фрагмент кода, который может удовлетворить мои потребности? Может быть, даже набор вариантов socat
, которые я еще не придумал?
ДОБАВИТЬ 03/06/2015
Можно пересылать трафик UDP , как я хочу. Даже при использовании SOCAT, есть способ. Я успешно проверил это с помощью другого окна, testbox.net1.mydomain
:
# File- and Query- portforwards omitted for irrelevance
ldericher@testbox$ socat UDP4-LISTEN:1234,fork UDP4:tsbox:61234 &
ldericher@tsbox$ socat UDP4-LISTEN:61234,fork UDP4:localhost:1234 &
Это работает без потери производительности, но не решает проблему невозможности использования IPv4 извне.
# File- and Query- portforwards omitted for irrelevance
ldericher@testbox$ socat UDP4-LISTEN:1234,fork UDP6:tsbox:61234 &
ldericher@tsbox$ socat UDP6-LISTEN:61234,fork UDP4:localhost:1234 &
Это не работает так же, как пересылка через fwbox
.
Итак, я просто упускаю важный момент об IPv6?
Это ошибка? В сокате? В линуксе ?!