Информация

Дата основания
Местоположение
Россия
Сайт
otus.ru
Численность
51–100 человек
Дата регистрации

Блог на Хабре

Обновить
Комментарии 15

Могу ли я через сокат соедить два сервера через третий? Т.е. первый и второй не могут соединиться с друг другом, но оба могут соединиться с третьим.

С помощью магии программирования вы сможете это сделать?
Третий сервер будет принимать данные от первого и отправлять их на второй и наоборот.

Даже программирования не нужно.
Пару строк в iptables с пробросами нужных портов и voilà.
Сокеты, как таковые, тут тоже особо не при чём.

Не так просто. Третий имеет серый IP и в одной сети с одним из тех двух. А последний где-то в интернет. Возможно можно сделать какой-то трюк на третьем типа
socat [server1] | socat [server2]

Этот трюк делают все reverse proxy servers.

pwnat уже смотрели?

Если на трерьем есть ssh то можно прокинуть порт. Например:
A: 10.0.0.1 — первый
B: 10.0.1.3 — второй (в другой сети не доступный первому)
С: 10.0.0.2, 10.0.1.2 — третий видит обе сети

На А подключаемся к С с пробросом портов
ssh 10.0.0.2 -L8080:10.0.0.3:80
И потом лезим с А по 10.0.0.2:8080 и попадаем на 10.0.1.3:80

ps: предварительно добавив свои ключи (ssh-copy-id), что бы пароли не вводить каждый раз
Про проброс ssh широко известно и я бы не поинтересовался тем, что легко нагуглить. Тут задача о несколько необычных серверах. A и B это устройства. Устройство А на порт идут специальные двоичные данные. А устройство «В» имеет порт, к которому можно подключиться и записывать туда такие же данные.
Сервер С — это действительно сервер и там можно запустить почти любое ПО. На нем работает программа, которая подключена к порту устройства А и подключена к порту устройства В и просто читает из одного порта и записывает в другой.
Мне стало интересно можно ли это же сделать чем-то наподобие socat. Т.е. имеет ли задача решение стандартными средствами linux, без написания скриптов, например, python.
Если это сервер то iptables либо redir
Но видимо можно и socat-ом
socat TCP4-LISTEN:8080,fork TCP4:10.0.1.3:80
Ну и через опятьже ssh. Прям на сервере ssh 127.0.0.1 -L8080:10.0.1.3:80
Спасибо. Заработало так socat -v TCP4:AServer:8080, fork TCP4:BServer:8081
Поэтому команда для запуска будет выглядеть так:
sudo mkfifo /tmp/repeater #создать FIFO файл
sudo nc -l -p 4545 < /tmp/repeater | nc -u -l 10.0.3.5 7878 > tmp/repeater

Результат:
user@backup-server:~$ sudo mkfifo /tmp/repeater
[sudo] password for user: 
user@backup-server:~$ sudo nc -l -p 4545 < /tmp/repeater | nc -u -l 10.0.3.5 7878 > tmp/repeater
[1] 913
-bash: lt: command not found
-bash: tmp/repeater: No such file or directory
-bash: /tmp/repeater: Permission denied

Перед публикацией самостоятельно выполнить собственную лабораторную работу не пробовали?

Очевидно же, что тут вместо &lt; должно быть < — видимо, где-то неверно отработал парсер и заменил символ (возможно даже непосредственно на этапе публикации на сайт), это ошибка не человека а машины (и недосмотр человека, да).

А отсутствие дроби перед вторым tmp — это тоже проделки парсера?
user@backup-server:~$ sudo nc -l -p 4545 < /tmp/repeater | nc -u -l 10.0.3.5 7878 > tmp/repeater    
-bash: tmp/repeater: No such file or directory

Сначала отписывал штатным средством об опечатках, потом понял — всё неверно. Правильная команда (можно без sudo — достаточно прав обычного пользователя):


mkfifo /tmp/repeater
nc -kl -p 4545 > /tmp/repeater | nc -u 10.0.3.5 7878 < /tmp/repeater

-k позволит не закрывать сокет, а перенаправления должны быть сделаны наоборот: пишем в канал, а потом из него читаем и отправляем данные на Destination.

Сразу в первом абзаце логическая ошибка. Либо неточность в заголовке статьи.
Сокет — это буквально "гнездо", он в чём-то очень похож на пару труб (pipe). Клиенты подключаются к сокету и обмениваются через него данными — один пишет, другой читает (одна труба), и наоборот (вторая). Никаких ip-адресов, портов и т.д. не подразумевается, в linux (и unix) сокет обычно выглядит как специальный файл с самым обычным путём от корня.
А то, что имеет ip-адрес — это уже особый сетевой сокет. Он в целом похож на unix-сокет, но говоря о "сокетах в linux" я бы ожидал увидеть прежде всего именно unix-сокеты, и уже потом сетевые. Либо ожидал бы, что статья называется "сетевые сокеты в linux", а не так, как сейчас.

Именно так. Даже фраза "Каждому сокету соответствует пара IP-адрес + номер порта." будет неверна для raw-сокетов.

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.