socat: Как создать двунаправленный IP-туннель через UDP - PullRequest
3 голосов
/ 02 февраля 2012

Я хотел бы решить следующую проблему: Предположим, у меня есть два компьютера, A и B.

Машина A принимает все IP-пакеты с интерфейса (я полагаю, что это "интерфейс" tun "), отправляет его процессу Java (который может изменять данные) и отправляет его на компьютер B с использованием UDP. На компьютере B содержимое извлекается снова и отправляется интерфейсу.

Например, на компьютере A я бы набрал команду ping B, после чего запрос ping будет получен процессом Java (включая заголовки IP), отправлен на машину B с использованием UDP, отправлен на интерфейс, который будет затем отправьте ответ обратно через тот же туннель. Я не могу просто использовать socat, потому что я хочу что-то сделать с данными в Java-процессе.

То, что я пробовал, это (предположим, на машине A):

socat -u tun:123.123.123.123/24,iff-up,iff-no-pi udp:localhost:1234 &
socat -u udp-listen:1236 interface:tun0 &

Весь трафик (например, запрос ping) отправляется на локальный UDP-сокет на порту 1234. Мой Java-процесс получает с этого порта, отправляет его на компьютер B и на машине на локальный порт 1236. Кажется, что Интерфейс tun0 правильно получает пинг. Проблема заключается в зацикливании пакетов между двумя компьютерами, возможно потому, что вторая команда socat отправляет пакет в tun0, а затем первая команда в свою очередь отправит пакет обратно в Java и т. Д.

Есть ли у вас какие-либо идеи, как туннелировать IP в UDP через Java без этой проблемы?

...