Рейтинг:0

Исходящий прокси-сервер с использованием нескольких общедоступных IP-адресов на EC2

флаг br

У нас есть несколько внутренних серверов в виде экземпляров EC2, расположенных в частной подсети в AWS VPC, которым необходимо взаимодействовать со сторонним API. Этот API ограничивает запросы, которые мы можем отправлять, на основе исходного IP-адреса, и при масштабировании нашей настройки мы начали достигать ограничений на IP-адрес шлюза NAT, который используется для всего исходящего трафика.

Таким образом, я хочу настроить прокси для исходящего трафика с несколькими подключенными EIP. Для тестирования в настоящее время я использую экземпляр Amazon Linux 2 с 2 ENI с 2 EIP, прикрепленными к каждому.Бэкенд-серверы открывают туннель SSH для исходящего прокси-сервера и сопоставляют сторонний API с локальным портом, запись в файле хостов серверов перенаправляет весь трафик с этого имени хоста на локальный хост, и эта настройка в целом работает нормально, но исходящий трафик от прокси всегда использует только первый связанный EIP.

Итак, моя установка выглядит так:

ЭНИ1: eth0
частный IP1: 10.0.11.81
частный IP2: 10.0.11.82

ЭНИ2: eth1
частный IP3: 10.0.11.52
частный IP4: 10.0.11.53

исходная таблица маршрутов:
по умолчанию через 10.0.11.1 dev eth0
по умолчанию через 10.0.11.1 dev eth1 metric 10001
10.0.11.0/24 dev eth0 ссылка на область действия ядра proto src 10.0.11.81
10.0.11.0/24 dev eth1 ссылка на область ядра proto src 10.0.11.52
169.254.169.254 разработчик eth0

Теперь я хочу иметь возможность указать, какой внутренний сервер использует какой EIP при вызове API через исходящий прокси-сервер. Моя первая попытка была следующей:

  • настроить 4 разных пользователей на прокси-хосте
  • добавьте правила iptable для каждого пользователя следующим образом: iptables -t nat -m owner --uid-owner user1 -A POSTROUTING -j SNAT --to IP1 и т.д.
  • это работает для двух IP-адресов, подключенных к основному ENI (например, eth0 на машине), но не работает для двух IP-адресов, связанных со вторым ENI (eth1).
  • добавление -о эт1 к утверждению тоже не сработало

Моей следующей попыткой было создать пользовательские таблицы маршрутизации для каждого IP-адреса и сопоставить их с правилами политики:

  • создать собственную таблицу маршрутов, т.е. для IP3:
по умолчанию через 10.0.11.1 dev eth1
10.0.11.0/24 dev eth1 proto static scope link src 10.0.11.52
169.254.169.254 dev eth1 ссылка на область видимости
  • создайте правило iptables для маркировки трафика, исходящего от user3: -A ВЫВОД -m owner --uid-owner 1003 -j MARK --set-xmark 0x3/0xffffffff
  • создайте правило для использования пользовательской таблицы маршрутизации для всех пакетов с пометкой 3: 32763: из всех fwmark 0x3 поиск ip3
  • это опять не работает. пакеты обрабатываются по-разному. все пользователи могут общаться с миром, кроме пользователя 3 в приведенном выше примере.

Что я делаю не так? Есть ли что-то тривиальное, что мне не хватает, или весь мой подход обречен на провал? Я очень открыт для предложений, как о том, как заставить эту настройку работать, так и об альтернативных подходах...

Заранее большое спасибо!

Tim avatar
флаг gp
Tim
Более простой временной мерой может быть один шлюз NAT на подсеть/зону доступности с соответствующей настройкой маршрутизации. Экземпляр NAT вместо шлюзов NAT будет дешевле, но потребует больше настройки/обслуживания. Ответ Джона, вероятно, лучше всего, увеличьте лимит.
флаг br
Исходящий прокси - моя временная мера. Реорганизация подсетей, перемещение серверов и т. д. потребует гораздо больше усилий, чем простое перенаправление части исходящего трафика через туннель SSH. Это можно сделать на существующих машинах с минимальным воздействием на архитектуру и без простоев.
Рейтинг:3
флаг cn

Свяжитесь с организацией, использующей API, и объясните ситуацию. Создание деловых отношений является хорошим началом для решения проблемы.

Внедрите IPv6 для снижения технической сложности. AWS предоставит вам /64 на подсеть общедоступного пространства, что обеспечит прямую связь между вашими экземплярами и API. Уникальный адрес для каждого экземпляра делает очевидным, что вы действительно выполняете масштабирование. Просить, чтобы вашим сетям была разрешена более высокая квота, становится проще, так как все они находятся в вашем VPC /56.

флаг br
Спасибо! Увеличение лимита действительно было бы вариантом, который я еще не рассматривал. IPv6, к сожалению, ими не поддерживается, иначе это был бы мой первый выбор. Я рассматривал возможность дальнейшего сегментирования подсети, чтобы иметь возможность добавить больше шлюзов NAT и распределить нагрузку, или даже перенести все внутренние серверы в общедоступную подсеть, чтобы иметь возможность напрямую назначать им отдельные EIP. Но я хотел бы избежать перемещения внутренних серверов с доступом к базе данных в общедоступную подсеть, а повторная сегментация текущей настройки также требует значительных усилий. Исходящий прокси показался хорошим временным решением.
Рейтинг:0
флаг br

В конце концов, я сам нашел решение и задокументировал его здесь: Лучший способ маршрутизировать трафик на основе вошедшего в систему пользователя по определенному избыточному маршруту?

На всякий случай, если кто-то наткнется на это в будущем.

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

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