Чем public subnet отличается от private subnet?
Публичная подсеть имеет маршрут 0.0.0.0/0 через Internet Gateway, ресурсы в ней доступны из интернета при наличии публичного IP. Приватная подсеть маршрутизирует интернет-трафик через NAT Gateway и не имеет прямой достижимости извне.
Публичная vs приватная подсеть в AWS VPC
Разница между публичной и приватной подсетью в AWS — это не флаг или атрибут самой подсети, а исключительно конфигурация маршрутизации. Обе подсети технически одинаковы; то, что делает подсеть публичной — это наличие маршрута к Internet Gateway.
Публичная подсеть
Подсеть считается публичной, если выполнены все три условия:
- В ассоциированной route table есть маршрут
0.0.0.0/0 → igw-xxxxxxxx(Internet Gateway). - IGW подключён к VPC.
- Ресурс в подсети имеет публичный IP или Elastic IP.
Ресурсы в публичной подсети доступны из интернета (при условии, что Security Group разрешает входящий трафик) и могут сами инициировать соединения в интернет.
Приватная подсеть
Подсеть считается приватной, если:
- В ассоциированной route table нет маршрута через IGW.
- Исходящий трафик в интернет (если он нужен) идёт через NAT Gateway, который находится в публичной подсети.
- У ресурсов нет публичных IP (или они есть, но недостижимы из интернета — нет маршрута).
Ресурсы в приватной подсети недоступны из интернета напрямую. Для управления используют Bastion Host или AWS Systems Manager Session Manager.
Типичная архитектура 3-уровневого приложения
# Публичные подсети: Load Balancer, Bastion, NAT Gateway
# Приватные подсети app tier: EC2 с приложением
# Приватные подсети db tier: RDS, ElastiCache
# Route table для публичной подсети
# 10.0.0.0/16 -> local
# 0.0.0.0/0 -> igw-0123456789abcdef0
# Route table для приватной подсети
# 10.0.0.0/16 -> local
# 0.0.0.0/0 -> nat-0123456789abcdef0
# Route table для DB-подсети (без интернета вообще)
# 10.0.0.0/16 -> local
# Включить auto-assign public IP для публичной подсети
aws ec2 modify-subnet-attribute \
--subnet-id subnet-0123456789abcdef0 \
--map-public-ip-on-launch
Атрибут Auto-assign Public IP
У каждой подсети есть атрибут MapPublicIpOnLaunch. Если он включён, каждый новый инстанс в этой подсети автоматически получает публичный IP. Для публичных подсетей рекомендуется его включить. Но сам по себе этот атрибут не делает подсеть публичной — без маршрута к IGW публичный IP бесполезен.
Подводные камни
- Публичный IP у инстанса не означает, что он доступен из интернета — Security Group может блокировать весь входящий трафик.
- Приватный IP инстанса в публичной подсети — инстанс без публичного IP в публичной подсети всё равно не доступен из интернета, хотя маршрут к IGW есть.
- При остановке EC2 публичный IP (не Elastic IP) освобождается и при запуске выдаётся новый — используйте Elastic IP для стабильных адресов.
- RDS в публичной подсети с флагом
PubliclyAccessible=true— частая ошибка безопасности. Даже если нужен внешний доступ, лучше использовать VPN или туннель. - Default VPC создаёт все подсети публичными — при запуске EC2 в Default VPC он сразу получает публичный IP.
- Приватная подсеть без NAT Gateway — EC2 не сможет обновить пакеты, обратиться к AWS API по публичным эндпоинтам. Нужен NAT или VPC Endpoints.
Common mistakes
- Определять subnet по имени Public или Private.
- Забывать про public IP для IPv4 internet access.
- Считать security group заменой routing decision.
What the interviewer is testing
- Объясняет роль route table и IGW.
- Понимает public IP requirement.
- Размещает ALB, app и DB в правильных subnet tiers.