Рейтинг:0

Скользящие обновления бэкэнда с сокетами сервера udp

флаг fr

У меня есть серверная система, используемая для устройств IOT, которые используют протокол UDP для связи. И есть определенные API на основе TCP (HTTP2) для мобильных приложений из того же бэкэнда.

Я пытаюсь создать функцию непрерывного обновления, чтобы обеспечить исправление нулевого времени простоя серверных служб.

Моя установка такая.

Вместо того, чтобы напрямую открывать сокеты приложениям, я пытаюсь сделать прозрачный прокси для своих процессов. Я выставил 2 сокета (1 udp и 1 tcp) в общедоступный Интернет с помощью брандмауэра.

Мой рабочий сервер открывает другой набор портов для udp и tcp (которые можно изменить с помощью переменных среды без изменения базового двоичного файла).

Шаг 1:

введите описание изображения здесь

Я пытаюсь создать прозрачный прокси-сервер на той же машине с udp-порта 16002 на 17002. Для udp мой сервер также инициирует некоторую связь с устройствами в дикой природе. Сервер должен видеть исходный IP/порт, а также обмениваться данными с этими устройствами, которые могут находиться под некоторыми NAT. (как правило, WiFi-маршрутизатор), соблюдая политику одинакового происхождения NAT.

И то же самое для tcp. С порта 16012 на порт 17012. Это типичное развертывание путем экстернализации реальных портов.

Я не могу сделать эту работу.

Шаг 2:

Всякий раз, когда нужно исправить новый код, я хочу запустить новый код на двух разных наборах портов, как показано на рисунке ниже (P2 — Процесс 2).

Когда процесс 2 запущен и запущен, я изменю сопоставление IP-адреса с новым процессом (P2). Предоставив P1 определенное время для завершения любых ожидающих операций ввода-вывода, мы остановим процесс P1.

Для следующего патча мы поднимем P1 'и процесс будет обратным.

введите описание изображения здесь

Есть ли недостатки в этой конструкции? Можно ли этого добиться технически, используя iptables и tproxy или любые другие инструменты Linux?

Я рассматривал возможность создания маршрутизатора L7 и ретрансляции пакетов туда и обратно с помощью определения объектов высокого уровня. Но мне любопытно, можно ли это сделать с помощью низкоуровневой маршрутизации L3/L4, поскольку она может быть более эффективной и проверенной в бою. Конечно, эти инструменты nft, iptables имеют проблемы с удобством использования и не очень интуитивно понятны, особенно nft, для разработчика.

Рейтинг:1
флаг br

Это можно сделать с помощью iptables. Чтобы создать переадресацию портов с 17X на 16X:

iptables -A PREROUTING -t nat -p tcp -m tcp --dport 16012 -j DNAT --к месту назначения: 17012
iptables -A PREROUTING -t nat -p udp -m udp --dport 16002 -j DNAT --to-destination:17002

Затем, когда вы хотите переключить порт, на который он указывает, после запуска обновленной версии вашего приложения:

iptables -D PREROUTING -t nat -p tcp -m tcp --dport 16012 -j DNAT --к месту назначения: 17012
iptables -D PREROUTING -t nat -p udp -m udp --dport 16002 -j DNAT --к месту назначения: 17002
iptables -A PREROUTING -t nat -p tcp -m tcp --dport 16012 -j DNAT --к месту назначения: 18012
iptables -A PREROUTING -t nat -p udp -m udp --dport 16002 -j DNAT --to-destination:18002

Если вы находитесь в дистрибутиве, использующем iptables.service и вы хотите, чтобы эти изменения были постоянными, вы можете добавить строки -A в /etc/sysconfig/iptables или там, где находится ваш файл конфигурации. Если вы используете дистрибутив, который использует firewalld.service то вы можете достичь той же цели и сделать ее постоянной при перезагрузке следующим образом:

Эта первая строка нужна только один раз, чтобы включить маскировку в целом.

firewall-cmd --permanent --add-masquerade

Затем, чтобы создать ваши первоначальные переадресации:

firewall-cmd --permanent --add-forward-port=port=16002:proto=udp:toport=17002
firewall-cmd --permanent --add-forward-port=port=16012:proto=tcp:toport=17012

Если вы хотите изменить приложение для прослушивания другого порта, просто запустите:

firewall-cmd --permanent --remove-forward-port=port=16002:proto=udp:toport=17002
firewall-cmd --permanent --remove-forward-port=port=16012:proto=tcp:toport=17012
firewall-cmd --permanent --add-forward-port=port=16002:proto=udp:toport=18002
firewall-cmd --permanent --add-forward-port=port=16012:proto=tcp:toport=18012
флаг fr
Спасибо Bofa за четкий ответ. Я постараюсь обновить принятие через день или два, так как я занят работой над некоторыми другими выпусками.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.