Назад | Перейти на главную страницу

Мост между двумя портами на одном и том же сетевом интерфейсе на сервере Linux

Мне нужно построить мост между двумя сетевыми портами на сервере, чтобы все, что поступает на порт A, переходило в порт B, а все, что поступает на порт B, - на порт A.

У меня есть два устройства (dA и dB), которые находятся за разными NAT в разных сетях, оба могут устанавливать любое исходящее соединение, однако все входящие соединения заблокированы. Поэтому они не могут подключиться напрямую. На этих NAT невозможно настроить переадресацию портов.

Поэтому я поставлю сервер S, который может прослушивать все порты сети. Он принимает соединения на портах A и B и создает между ними мост, поэтому трафик проходит от A к B, как если бы они были подключены напрямую.

Окончательный результат, который я хочу заархивировать:

  1. Устройство dA подключается к серверу S через порт A. Напр. он подключается к server.com:A
  2. Устройство dB подключается к серверу S через порт B. Например. он подключается к server.com:B
  3. dA говорит с дБ через S

Есть ли способ сделать это с помощью сервера Linux? Сервер работает под управлением Linux на базе Debian wheezy.

Было бы здорово сделать это с помощью команд / инструментов командной строки, поэтому при необходимости порты можно изменить без редактирования какого-либо файла (с помощью скрипта).

Вы можете сделать это с помощью xinetd, используя его redirect директива. Я лично предпочитаю использовать socat, потому что конфигурация xinetd находится в очевидном месте (что упрощает управление с помощью Puppet или Chef) и будет автоматически запускаться во время загрузки.

Инструмент сокат делает то, что мне нужно, простым способом.

socat  TCP4-LISTEN:5060,reuseaddr TCP4-LISTEN:5061,reuseaddr

Он блокирует терминал, однако это лучшее решение, которое я смог найти.

Вы вроде как говорите про обратный прокси. Есть много полезных демонов (в частности, SOCKS-прокси), но вы ищете решение для командной строки.

Это может быть достигнуто с помощью переадресации портов ssh. Вы можете перенаправить порт с помощью:

user@dA:~$ ssh -R :1111:localhost:1111 user@server.com

Он откроет порт: 1111 на server.com. После принятия соединения на этом порте ssh перенаправит этот запрос на dA ​​и установит соединение локально на dA ​​с localhost:1111 пересылка всего трафика по существующему каналу ssh.

Итак, пока ваш сеанс ssh запущен и работает, каждый хост, подключающийся к server.com:1111, будет эффективно подключать dA: 1111

Обратите внимание на начальную точку с запятой. Это означает, что server.com должен принимать внешние подключения (по умолчанию он будет прослушивать только подключения от localhost).

Вам также нужно будет включить GatewayPorts опция в конфигурации ssh на server.com. В противном случае sshd не позволит принимать внешние подключения.

Почему вы не используете iptables?

iptables -t nat -I PREROUTING --src $SRC_IP_MASK --dst $DST_IP -p tcp --dport $portNumber -j REDIRECT --to-ports $rediectPort