AWS - Как настроить статический IP-адрес для исходящего трафика
У меня есть несколько экземпляров EC2 в 3 зонах доступности. Приложение, которое я запускаю в этих экземплярах, взаимодействует с несколькими сторонними приложениями, имеющими механизм белого списка. Я знаю, что могу общаться с этими сторонними приложениями, используя статические IP-адреса (Elastic IP), используя шлюз NAT. Если я сделаю это, мне нужно будет указать конкретный маршрут для каждого стороннего приложения, чтобы оно работало. Чего я хотел бы добиться, так это статического исходящего IP-адреса без определения всех этих маршрутов. Так что в основном по умолчанию маршрутизация всего трафика через шлюз NAT. Я попробовал следующее, но больше не могу получить доступ к своему приложению. (Кстати, все эти экземпляры EC2 находятся за приложением LoadBalancer)
таблица маршрутизации подсети:
10.0.0.0/16 -> local
0.0.0.0/0 -> NAT Gateway
Таблица маршрутизации подсети NAT Gateway
10.0.0.0/16 -> local
0.0.0.0/0 -> Internet Gateway
Это будет работать, если я настрою следующие таблицы маршрутизации, но тогда мне нужно будет настроить конкретные маршруты для каждого стороннего приложения, с которым мое приложение связывается.
таблица маршрутизации подсети:
10.0.0.0/16 -> local
0.0.0.0/0 -> Internet Gateway
ThirdPartyApplicationIp/32 -> NAT Gateway
Таблица маршрутизации подсети NAT Gateway
10.0.0.0/16 -> local
0.0.0.0/0 -> Internet Gateway
Определив эти маршруты конкретно, мы можем иметь проблемы, когда, например, обновляются записи DNS и меняются IP-адреса. Я знаю, что это произойдет, потому что я знаю, что некоторые сторонние приложения также используют AWS с ELB, и IP-адреса ELB со временем изменятся. Кроме того, это не очень удобно, когда нам приходится управлять всеми этими сторонними приложениями, как это.
Есть ли способ решить эту проблему, чтобы мне не приходилось определять конкретные маршруты для каждого стороннего приложения, и я по-прежнему могу получить доступ к моему приложению через Application LoadBalancer и учитывает изменения DNS?
Дополнительная проблема:
Решение этой проблемы также может решить следующую проблему, которой у меня пока нет, но которая возникнет в ближайшем будущем: В будущем, когда наше приложение будет взаимодействовать с приложением стороннего производителя, и это приложение также подключается к нашему приложению, тогда трафик маршрутизируется через шлюз NAT. Потому что это настроенная мной маршрутизация, но тогда она не будет работать, когда сторонние приложения пытаются подключиться через приложение LoadBalancer к нашим приложениям, потому что тогда трафик должен направляться через интернет-шлюз напрямую, а не через маршрутизатор NAT., Но если я сделаю это, я потеряю свой статический IP. Есть ли способ решить это?
Результаты предложения Мэтта : предложение Мэтта работает, но я не совсем понимаю, почему. Поэтому я начал играть с этой настройкой, чтобы попытаться выяснить, в чем разница. Потому что таблицы маршрутизации такие же, как я делал раньше, и это показалось мне странным. Оказывается, что если я добавлю один экземпляр EC2 в частную подсеть с назначенным общедоступным ip (снова делая ее общедоступной подсетью), вся маршрутизация завершится сбоем, и мой ELB больше не будет отвечать на запросы. После удаления этого нового экземпляра EC2 (с назначенным общедоступным IP-адресом) он все равно не удался. Только после удаления зон доступности в моем ELB и добавления моих личных подсетей снова это работает. Теперь я не понимаю, почему простое добавление нового экземпляра EC2 с публичным IP-адресом нарушает всю маршрутизацию? (Этот новый экземпляр EC2 находится не в целевой группе ELB, а просто сидит в подсети)
1 ответ
Чтобы эффективно использовать шлюз / экземпляр NAT, ваши экземпляры EC2 должны находиться в частных подсетях. Таким образом, у вас просто есть маршрут по умолчанию для всего исходящего трафика, проходящего через NAT.
Переместите экземпляры EC2 из общедоступных подсетей в частные подсети. Ваш балансировщик нагрузки будет по-прежнему иметь доступ к ним, поскольку ELB находится внутри вашего VPC.
Кроме того, перемещая экземпляры EC2 в частные подсети, вы улучшите безопасность, поскольку внешний мир не может получить к ним прямой доступ. Если вам нужно получить к ним доступ, настройте экземпляр бастионного EC2, который вы можете:
- Туннель через SSH, чтобы добраться до ваших внутренних экземпляров EC2, или
- SSH два раза, чтобы добраться до ваших внутренних инстансов EC2.
Я не Ansible всезнайка, но я уверен, что есть способ использовать Ansible и сохранить ваши экземпляры EC2 в секрете.