Я пытаюсь настроить сервер 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?
Это ошибка? В сокате? В линуксе ?!

2 ответа2

0

Это может оказаться невозможным для работы, так как протокол TeamSpeak встраивает IP-адрес в (плохо зашифрованные) полезные данные, и, как таковая, пересылка данных на другие хосты, вероятно, приведет к сбоям соединения как клиента, сервера, так и обоих, полностью игнорируйте, откуда поступают данные, и пытайтесь использовать IP-адреса, которые, по их мнению, должны поступать.

0

Добавление опции -T к socat как-то решает проблему.

-T<timeout>
       Total  inactivity timeout: when socat is already in the transfer
       loop and nothing has happened for  <timeout>  [timeval]  seconds
       (no  data arrived, no interrupt occurred...) then it terminates.
       Useful with protocols like UDP that cannot transfer EOF.

Обновленные команды:

ldericher@fwbox$ socat TCP4-LISTEN:1234,reuseaddr,fork TCP6:tsbox.net1.mydomain:61234 &# queryport
ldericher@fwbox$ socat TCP4-LISTEN:1235,reuseaddr,fork TCP6:tsbox.net1.mydomain:61235 &# fileport
ldericher@fwbox$ socat -T15 UDP4-LISTEN:1234,reuseaddr,fork UDP6:tsbox.net1.mydomain:61234 &# voiceport

ldericher@tsbox$ socat TCP6-LISTEN:61234,reuseaddr,fork TCP4:localhost:1234 &# queryport
ldericher@tsbox$ socat TCP6-LISTEN:61235,reuseaddr,fork TCP4:localhost:1235 &# fileport
ldericher@tsbox$ socat -T15 UDP6-LISTEN:61234,reuseaddr,fork UDP4:localhost:1234 &# voiceport

Я не до конца понимаю, почему это работает (поскольку, очевидно, никогда не проходит 15 секунд), но я счастлив, что это работает.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .