У меня 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
ВМ3, у меня 999 портов фильтрованный - подразумевается, что брандмауэр их маскирует? - и просто ssh
порт открыт.
Я могу curl
из VM2, но время ожидания VM3 истекло.
Я ожидаю, что смогу общаться по внутренней сети без назначения внешних IP-адресов. Что я делаю не так?
(Единственная небольшая сложность заключается в том, что VPC определен в одном проекте, а VPC-Shared во втором проекте. Правила и маршруты брандмауэра определены в главном проекте VPC. Виртуальные машины находятся во втором проекте, но в общем VPC.)
Изменить: результат netstat -antp
из ВМ2:
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-адреса, я не могу выполнить оболочку (без сложного танца ...).
РЕДАКТИРОВАТЬ: шаги по воспроизведению:
ssh
и http
теги соответственно)source
на VPC с использованием Debian с ssh
сетевой тег и внешний IP (для поддержки SSH-соединения)target1
на VPC с использованием COS и nginxdemos/hello
образ докера ("привет, мир" открыт через порт 80) с http
сетевой тег и внешний IPtarget2
на VPC с использованием COS и nginxdemos/hello
образ докера с http
сетевой тег и нет внешний IPsource
ВМ и пинг оба target1
и target2
- они отвечаютcurl target1
и он отвечает с приветственной мировой страницейcurl target2
и время истекаетnmap -Pn target1
показывает ssh + http открыто, все остальные закрытыnmap -Pn target2
показывает ssh открытым, а все остальные отфильтрованыВам не нужен внешний IP-адрес для подключения между вашими экземплярами GCE. Вы можете общаться между своими экземплярами GCE, используя внутренний IP-адрес виртуальной машины. Убедитесь, что ваш брандмауэр настроен правильно, необходимые порты открыты для ваших целей и у вас есть служба, прослушивающая порт 80.
Это намного проще, чем я ожидал ...
Без внешнего IP-адреса экземпляр ContainerOS не может подключиться к Интернету чтобы вытащить образ Docker. Если вы добавите экземпляр Cloud NAT (https://cloud.google.com/nat/docs/using-nat), экземпляр вытаскивает изображение, запускает его, и все работает.
Причина nmap
не показывал http, а все остальное «отфильтровано» должно быть потому, что правила брандмауэра не применяются, пока экземпляр не будет запущен и запущен.
(Чтобы найти это, мне пришлось переключить флаг «Частный доступ Google» в подсети. Это позволило виртуальной машине, предназначенной только для внутреннего использования, отправлять журналы в Stackdriver, что ясно показывало тайм-аут вывода Docker.)