Как мне выполнить привязку к порту 53 UDP в GCE (ОС, оптимизированная для контейнеров)?

Есть ли способ освободить порт 53 UDP на моем экземпляре GCE, чтобы я мог к нему привязаться?

Я запускаю контейнер на GCE, который должен прослушивать порт 53 UDP, поскольку он прослушивает DNS-соединения. Однако, когда я пытаюсь запустить свой контейнер и выполнить привязку к UDP-порту 53, я получаю следующее сообщение об ошибке:

docker: Ошибка ответа от демона: драйвер не удалось программировать внешнее подключение к конечной точке (): Ошибка при запуске прокси-сервера пользователя: прослушивание udp 0.0.0.0:53: привязка: адрес уже используется.

Проверка открытых портов показывает, что 127.0.0.53 подключен к UDP-порту 53:

$ netstat -tuln | grep 53
tcp        0      0 0.0.0.0:5355            0.0.0.0:*               LISTEN     
tcp6       0      0 :::5355                 :::*                    LISTEN     
udp        0      0 127.0.0.53:53           0.0.0.0:*                          
udp        0      0 0.0.0.0:5355            0.0.0.0:*                          
udp6       0      0 :::5355                 :::*

Читая документацию, единственной ссылкой на что-то подобное было зональный DNS, который может можно отключить, установив метаданные экземпляра или проекта VmDnsSetting = GlobalOnly ( статья здесь ). Я сделал это, но привязка к порту все еще существует.

0
задан 3 July 2019 в 19:12
1 ответ

Решение

Похоже, что виновником является служба systemd-resolved .

Вы можете остановить службу с помощью команды $ sudo systemctl stop systemd-resolved .


Подробнее

Для того, чтобы сделать это на GCE с использованием оптимизированной для контейнеров ОС Google (COS), мне нужно было отменить выбор опции загрузки из образа контейнера, а затем вручную войдите и введите соответствующие команды, чтобы запустить среду, как показано ниже.

Следующие 2 команды необходимы для извлечения из частного реестра GCR:

$ docker-credential-gcr configure-docker

$ docker pull gcr.io//[12234 visibleОстановить службу systemd-resolved :

$ sudo systemctl stop systemd-resolved

Запустить контейнер докера (обратите внимание на - флаг сетевого хоста , который COS делает по умолчанию, когда вы выбираете опцию загрузки из образа контейнера в конфигурации экземпляра):

$ docker run -d --network host --restart = if-stop

Открыть соответствующие порты (необходимы, если не выполняется явная загрузка из образа контейнера при настройке экземпляра):

$ sudo iptables -w -A INPUT -p tcp --dport 22 -j ACCEPT

$ sudo iptables -w -A INPUT -p udp --dport 53 -j ACCEPT

Примечание по автоматизации

Обратите внимание, что вы не можете ввести первую команду ( $ docker-credential-gcr configure-docker ) в сценарии запуска, так как он не работает из-за того, что каталог /root/.docker/ доступен только для чтения; сценарии запуска запускаются от имени пользователя root, когда сеть становится доступной.

Я еще не понял этого, но я обновлю этот ответ, как только у меня появится, чтобы сделать его немного менее ручным для всех, кто это читает.

] Обновление по автоматизации

Оказывается, вы можете создать пользователя в сценарии cloud-init , а затем использовать $ su - в сценарии запуска перед запуском $ docker-credential-gcr configure-docker команда от имени этого пользователя для сохранения учетных данных (ссылка на это сообщение форума поддержки ). Однако для меня это слишком хакерский метод, поэтому я решил просто запускать команды вручную после запуска экземпляра GCE, чтобы Docker работал правильно.

tl; dr: Как отвязать порт 53 при запуске

Тем не менее, для тех, кто хочет просто отвязать порт 53 при запуске, вы можете сделать это с помощью следующего сценария запуска:

#! /bin/bash

systemctl stop systemd-resolved

Инструкции по добавлению сценария запуска к вашей виртуальной машине на GCE можно найти здесь ].

1
ответ дан 4 December 2019 в 15:40

Теги

Похожие вопросы