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

Шифрование однорангового приложения с помощью iptables и stunnel

Я запускаю устаревшие приложения, в которых у меня нет доступа к исходному коду. Эти компоненты общаются друг с другом, используя открытый текст на определенном порту. Я хотел бы иметь возможность защищать связь между двумя или более узлами, используя что-то вроде stunnel для облегчения одноранговой связи вместо использования более традиционного (и централизованного) пакета VPN, такого как OpenVPN и т. Д.

В идеале транспортный поток должен выглядеть так:

  1. app @ hostA: 1234 пытается открыть TCP-соединение с app @ hostB: 1234.
  2. iptables захватывает и перенаправляет трафик на порт 1234 на stunnel, запущенный на hostA на порту 5678.
  3. stunnel @ hostA согласовывает и устанавливает соединение с stunnel @ hostB: 4567.
  4. stunnel @ hostB перенаправляет любой расшифрованный трафик в app @ hostB: 1234.

По сути, я пытаюсь настроить это туда, где любой исходящий трафик (сгенерированный на локальной машине) на порт N пересылает через stunnel на порт N + 1, а принимающая сторона получает на порт N + 1, расшифровывает и пересылает к локальному приложению в порту N.

Меня не особо беспокоит потеря исходного IP-адреса hostA / идентичности машины, когда stunnel @ hostB перенаправляет на app @ hostB, потому что полезная нагрузка связи содержит идентифицирующую информацию.

Другой трюк в том, что обычно с stunnel у вас есть архитектура клиент / сервер. Но это приложение гораздо больше P2P, потому что узлы могут приходить и уходить динамически, и жесткое кодирование какого-то типа «connection = hostN: port» в конфигурации stunnel не будет работать.

РЕДАКТИРОВАТЬ: Еще одна возможность может заключаться в настройке какого-либо маршрута по умолчанию, например, исходящий трафик на порт N пересылается через stunnel, настроенный как шлюз ...

Я думаю, что iptables здесь кажется излишним.

appA - это экземпляр приложения на hostA (внешний IP A.A.A.A) appB - это экземпляр app на hostB (внешний IP B.B.B.B)

  1. appA слушает 127.0.0.1:1234 на hostA
  2. stunnel на hostA настроен для пересылки зашифрованного соединения от A.A.A.A: 1234 на 127.0.0.1:1234

    [appA]

    accept = A.A.A.A: 1234

    подключить = 127.0.0.1:1234

    клиент = нет

  3. stunnel на hostB настроен для создания зашифрованного туннеля и прямого соединения с 127.0.0.1:4321 на A.A.A.A: 1234

    / usr / bin / stunnel -d 127.0.0.1:4321 -r A.A.A.A: 1234

  4. appB устанавливает соединение с 127.0.0.1:4321

и наоборот для hostB