У нас есть несколько внутренних серверов в виде экземпляров 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 в приведенном выше примере.
Что я делаю не так? Есть ли что-то тривиальное, что мне не хватает, или весь мой подход обречен на провал? Я очень открыт для предложений, как о том, как заставить эту настройку работать, так и об альтернативных подходах...
Заранее большое спасибо!