Есть ли способ освободить порт 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
( статья здесь ). Я сделал это, но привязка к порту все еще существует.
Похоже, что виновником является служба systemd-resolved
.
Вы можете остановить службу с помощью команды $ sudo systemctl stop systemd-resolved
.
Для того, чтобы сделать это на GCE с использованием оптимизированной для контейнеров ОС Google (COS), мне нужно было отменить выбор опции загрузки из образа контейнера, а затем вручную войдите и введите соответствующие команды, чтобы запустить среду, как показано ниже.
Следующие 2 команды необходимы для извлечения из частного реестра GCR:
$ docker-credential-gcr configure-docker
$ docker pull gcr.io/
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 работал правильно.
Тем не менее, для тех, кто хочет просто отвязать порт 53 при запуске, вы можете сделать это с помощью следующего сценария запуска:
#! /bin/bash
systemctl stop systemd-resolved
Инструкции по добавлению сценария запуска к вашей виртуальной машине на GCE можно найти здесь ].