Зачем мне нужен внешний адрес для создания внутреннего соединения между экземплярами GCE?
У меня есть VPC (10.11.0.0/20) с 3 виртуальными машинами. VM2 и VM3 одинаковы, за исключением того, что VM2 имеет внешний IP-адрес (эфемерный), а VM3 - нет. Они оба запускают образ Docker с веб-сервером, выставляющим порт 80.
У меня есть "разрешить все внутренние" правила брандмауэра:
NAME NETWORK DIRECTION PRIORITY SRC_RANGES ALLOW
dev-internal dev INGRESS 1000 10.11.0.0/20 icmp,tcp:0-65535,udp:0-65535
Я могу подключиться к VM1, и с него я могу пропинговать как VM2, так и VM3.
Когда я nmap
VM2, я вижу 998 закрытых портов и оба ssh
а также http
открыть - как и ожидалось.
Когда я nmap
VM3, у меня отфильтровано 999 портов - значит, брандмауэр их маскирует? - и только ssh
порт выставлен.
Я могу curl
от VM2, но VM3 время ожидания.
Я ожидаю, что смогу общаться через внутреннюю сеть без назначения внешних IP-адресов. Что я делаю неправильно?
(Единственное небольшое осложнение заключается в том, что VPC определен в одном проекте, а VPC-Shared - во втором проекте. Правила и маршруты межсетевого экрана определены в хост-проекте VPC. Виртуальные машины живут во втором проекте, но в общем VPC.)
Изменить: результат netstat -antp
от VM2:
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1207/nginx: master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 311/sshd
tcp 0 0 0.0.0.0:5355 0.0.0.0:* LISTEN 299/systemd-resolve
tcp 0 0 10.11.0.6:46458 169.254.169.254:80 ESTABLISHED 381/python2.7
tcp 0 272 10.11.0.6:22 173.194.90.33:64360 ESTABLISHED 43364/sshd: jamie_h
tcp 0 0 10.11.0.6:53880 169.254.169.254:80 ESTABLISHED 401/device_policy_m
tcp 0 0 10.11.0.6:46454 169.254.169.254:80 CLOSE_WAIT 385/python2.7
tcp 0 0 10.11.0.6:46460 169.254.169.254:80 ESTABLISHED 385/python2.7
tcp 0 0 10.11.0.6:46456 169.254.169.254:80 ESTABLISHED 384/python2.7
tcp6 0 0 :::5355 :::* LISTEN 299/systemd-resolve
VM3 идентична - обе контейнерные ОС, обе работают с одним и тем же образом Docker - и поскольку у меня нет внешнего IP-адреса, я не могу подключиться к нему (не выполняя сложный танец...).
РЕДАКТИРОВАТЬ: шаги для воспроизведения:
- Создать VPC
- Создать правила брандмауэра для внешнего доступа SSH и HTTP к подсети (я использую
ssh
а такжеhttp
теги соответственно) - Создать правило брандмауэра для внутреннего трафика на VPC (источник = подсеть, цель = все экземпляры в подсети)
- Создать ВМ под названием
source
на VPC используя Debian сssh
сетевой тег и внешний IP (для поддержки SSH-соединения) - Создать ВМ под названием
target1
на VPC с использованием COS иnginxdemos/hello
образ докера ("hello world", выставленный на порту 80) сhttp
сетевой тег и внешний IP - Создать ВМ под названием
target2
на VPC с использованием COS иnginxdemos/hello
изображение докера сhttp
сетевой тег и без внешнего IP - SSH к
source
ВМ и пинг какtarget1
а такжеtarget2
- они отвечают curl target1
и он отвечает с привет страницы мираcurl target2
и это время истеклоnmap -Pn target1
показывает ssh + http открыто, все остальные закрытыnmap -Pn target2
показывает ssh открытый и все остальные отфильтрованные
2 ответа
Это намного проще, чем я ожидал...
Без внешнего IP-адреса экземпляр ContainerOS не может подключиться к Интернету для получения образа Docker. Если вы добавите экземпляр Cloud NAT ( https://cloud.google.com/nat/docs/using-nat), он извлекает изображение, запускает его и все работает.
Причина nmap
не показывал http, а все остальное "фильтруется" должно быть потому, что правила брандмауэра не применяются, пока экземпляр не будет запущен и работает.
(Чтобы найти это, мне нужно было включить флаг "Частный доступ к Google" в подсети. Это позволило виртуальной машине только для внутреннего использования отправлять журналы в Stackdriver, что четко показывало время ожидания Docker.)
Вам не нужен внешний IP для подключения между вашими экземплярами GCE. Вы можете общаться между вашими экземплярами GCE, используя внутренний IP-адрес виртуальной машины. Убедитесь, что ваш брандмауэр настроен правильно, необходимые порты открыты для вашей цели, и у вас есть служба, прослушивающая порт 80.