Comments 15
Могу ли я через сокат соедить два сервера через третий? Т.е. первый и второй не могут соединиться с друг другом, но оба могут соединиться с третьим.
С помощью магии программирования вы сможете это сделать?
Третий сервер будет принимать данные от первого и отправлять их на второй и наоборот.
Если на трерьем есть 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), что бы пароли не вводить каждый раз
Сервер С — это действительно сервер и там можно запустить почти любое ПО. На нем работает программа, которая подключена к порту устройства А и подключена к порту устройства В и просто читает из одного порта и записывает в другой.
Мне стало интересно можно ли это же сделать чем-то наподобие socat. Т.е. имеет ли задача решение стандартными средствами linux, без написания скриптов, например, python.
Поэтому команда для запуска будет выглядеть так:
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
Перед публикацией самостоятельно выполнить собственную лабораторную работу не пробовали?
Очевидно же, что тут вместо <
должно быть < — видимо, где-то неверно отработал парсер и заменил символ (возможно даже непосредственно на этапе публикации на сайт), это ошибка не человека а машины (и недосмотр человека, да).
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", а не так, как сейчас.
Сокеты в ОС Linux