docker Конфигурация DNS не обновляется после подключения к VPN - PullRequest
1 голос
/ 27 мая 2020

Вопрос

Я использую docker 19.03.9, на Ubuntu 18.04; docker Демон настроен на автоматический запуск. Когда я подключаюсь к VPN моего работодателя, конфигурация docker DNS не обновляется, если я не перезапущу демон docker.

Есть ли способ автоматически обновлять docker конфигурацию DNS при изменении конфигурации DNS хоста ?

Исследование

Мой сценарий: я хочу проверить связь с сервером в сети моей компании (скажем, server.mycompany.com ) из дома. Я пытаюсь выполнить эхо-запрос с моего хоста (ноутбук под управлением Ubuntu), а затем из контейнера на моем хосте

Примечание: все IP-адреса замаскированы в примерах ниже

Я создал небольшое docker изображение для проверки моего сценария:

FROM ubuntu:18.04

RUN apt-get update \
    && apt-get install -yqq iputils-ping

CMD cat /etc/resolv.conf \
    && echo \
    && ping -c 2 server.mycompany.com

Затем я создал этот образ: docker build -t test_dns .

1- тест без подключения VPN

В терминале на моем ноутбуке Ubuntu я выполняю 3 команды ниже:

    $ cat /etc/resolv.conf
    # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
    #     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
    # 127.0.0.53 is the systemd-resolved stub resolver.
    # run "systemd-resolve --status" to see details about the actual nameservers.

    nameserver 127.0.0.53
    search home

    $ ping server.mycompany.com
    ping: server.mycompany.com: Name or service not known

    $ docker run test_dns
    # This file is managed by man:systemd-resolved(8). Do not edit.
    #
    # This is a dynamic resolv.conf file for connecting local clients directly to
    # all known uplink DNS servers. This file lists all configured search domains.
    #
    # Third party programs must not access this file directly, but only through the
    # symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
    # replace this symlink by a static file or a different symlink.
    #
    # See man:systemd-resolved.service(8) for details about the supported modes of
    # operation for /etc/resolv.conf.

    nameserver 192.168.xxx.xxx
    nameserver 198.235.yyy.yyy
    search home

    ping: server.mycompany.com: Name or service not known

Как и ожидалось, server.mycompany.com не может быть разрешен и недоступен (ни один из моих хоста или из контейнера)

Обратите внимание, что:

  • 192.168.xxx.xxx - это IP-адрес моего Wi-Fi роутера
  • 198.235.yyy.yyy - это DNS моего провайдера адрес сервера

2- После подключения к VPN моей компании

После подключения к VPN моей компании я выполняю 3 одинаковые команды:

    $ cat /etc/resolv.conf
    # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
    #     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
    # 127.0.0.53 is the systemd-resolved stub resolver.
    nameserver 10.xxx.xxx.xxx
    nameserver 10.yyy.yyy.yyy
    nameserver 10.zzz.zzz.zzz
    nameserver 127.0.0.53

    search mycompany.com mycompany-other-domain.com home

    $ ping -c 2 server.mycompany.com
    PING server.mycompany.com (10.sss.sss.sss) 56(84) bytes of data.
    64 bytes from 10.sss.sss.sss (10.sss.sss.sss): icmp_seq=1 ttl=120 time=15.6 ms
    64 bytes from 10.sss.sss.sss (10.sss.sss.sss): icmp_seq=2 ttl=120 time=16.4 ms

    --- server.mycompany.com ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1000ms
    rtt min/avg/max/mdev = 15.681/16.058/16.435/0.377 ms

    $ docker run test_dns
    # This file is managed by man:systemd-resolved(8). Do not edit.
    #
    # This is a dynamic resolv.conf file for connecting local clients directly to
    # all known uplink DNS servers. This file lists all configured search domains.
    #
    # Third party programs must not access this file directly, but only through the
    # symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
    # replace this symlink by a static file or a different symlink.
    #
    # See man:systemd-resolved.service(8) for details about the supported modes of
    # operation for /etc/resolv.conf.

    nameserver 192.168.xxx.xxx
    nameserver 198.235.yyy.yyy
    search home

    ping: server.mycompany.com: Name or service not known
  • на моем хосте:

    При подключении к mycompany VPN обновлена ​​конфигурация DNS: мы видим mycompany 3 частный DNS серверы (10.xxx.xxx.xxx, 10.yyy.yyy.yyy и 10.zzz.zzz.zzz)

    Как и ожидалось, server.mycompany.com разрешен и доступен по моему запросу ping

  • в контейнере:

    Docker все еще использует предыдущую конфигурацию DNS. Он не обновлялся при изменении DNS хоста (при подключении к VPN).

    Есть ли способ заставить docker автоматически обновлять конфигурацию DNS (когда она изменяется на хосте)?

3- Перезапуск docker демон (все еще подключен к VPN моей компании)

Я перезапускаю docker демон: sudo service docker restart

Затем снова выполняю 3 те же команды:

    $ cat /etc/resolv.conf
    # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
    #     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
    # 127.0.0.53 is the systemd-resolved stub resolver.
    nameserver 10.xxx.xxx.xxx
    nameserver 10.yyy.yyy.yyy
    nameserver 10.zzz.zzz.zzz
    nameserver 127.0.0.53

    search mycompany.com mycompany-other-domain.com home

    $ ping -c 2 server.mycompany.com
    PING server.mycompany.com (10.sss.sss.sss) 56(84) bytes of data.
    64 bytes from 10.sss.sss.sss (10.sss.sss.sss): icmp_seq=1 ttl=120 time=23.3 ms
    64 bytes from 10.sss.sss.sss (10.sss.sss.sss): icmp_seq=2 ttl=120 time=11.7 ms

    --- server.mycompany.com ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 999ms
    rtt min/avg/max/mdev = 11.786/17.551/23.317/5.767 ms

    $ docker run test_dns
    # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
    #     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
    # 127.0.0.53 is the systemd-resolved stub resolver.
    nameserver 10.xxx.xxx.xxx
    nameserver 10.yyy.yyy.yyy
    nameserver 10.zzz.zzz.zzz
    search mycompany.com mycompany-other-domain.com home

    PING server.mycompany.com (10.sss.sss.sss) 56(84) bytes of data.
    64 bytes from 10.sss.sss.sss (10.sss.sss.sss): icmp_seq=1 ttl=119 time=11.5 ms
    64 bytes from 10.sss.sss.sss (10.sss.sss.sss): icmp_seq=2 ttl=119 time=10.7 ms

    --- server.mycompany.com ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1001ms
    rtt min/avg/max/mdev = 10.750/11.159/11.569/0.422 ms
  • на моем хосте: все еще отлично работает: server.mycompany.com все еще разрешен и доступен

  • в контейнере: docker Конфигурация DNS теперь использует mycompany VPN настройки; server.mycompany.com теперь разрешен и доступен по моему запросу ping внутри любого контейнера docker.

4- Отключиться от VPN моей компании

Я отключаюсь от моей компании VPN и снова выполните 3 те же команды:

    $ cat /etc/resolv.conf
    # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
    #     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
    # 127.0.0.53 is the systemd-resolved stub resolver.
    nameserver 127.0.0.53

    search home

    $ ping -c 2 server.mycompany.com
    ping: server.mycompany.com: Name or service not known

    $ docker run test_dns
    # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
    #     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
    # 127.0.0.53 is the systemd-resolved stub resolver.
    search home

    nameserver 8.8.8.8
    nameserver 8.8.4.4

    ping: server.mycompany.com: Name or service not known
  • на моем хосте: точно такое же поведение, как на шаге 1: я за пределами сети mycompany, таким образом, сервер. mycompany.com не может быть ни разрешен, ни достигнута

  • в контейнере: на этот раз конфигурация DNS была автоматически обновлена ​​для использования DNS-серверов Google publi c. server.mycompany.com не может быть ни разрешен, ни достигнут (как ожидалось)

5- Подключитесь снова к моей компании VPN

Я снова подключаюсь к моей компании VPN и выполняю снова 3 те же команды:

    $ cat /etc/resolv.conf
    # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
    #     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
    # 127.0.0.53 is the systemd-resolved stub resolver.
    nameserver 10.xxx.xxx.xxx
    nameserver 10.yyy.yyy.yyy
    nameserver 10.zzz.zzz.zzz
    nameserver 127.0.0.53

    search mycompany.com mycompany-other-domain.com home

    $ ping -c 2 server.mycompany.com
    PING server.mycompany.com (10.sss.sss.sss) 56(84) bytes of data.
    64 bytes from 10.sss.sss.sss (10.sss.sss.sss): icmp_seq=1 ttl=120 time=20.5 ms
    64 bytes from 10.sss.sss.sss (10.sss.sss.sss): icmp_seq=2 ttl=120 time=12.3 ms

    --- server.mycompany.com ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1001ms
    rtt min/avg/max/mdev = 12.308/16.442/20.577/4.136 ms

    $ docker run test_dns
    # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
    #     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
    # 127.0.0.53 is the systemd-resolved stub resolver.
    nameserver 10.xxx.xxx.xxx
    nameserver 10.yyy.yyy.yyy
    nameserver 10.zzz.zzz.zzz
    search mycompany.com mycompany-other-domain.com home

    PING server.mycompany.com (10.sss.sss.sss) 56(84) bytes of data.
    64 bytes from 10.sss.sss.sss (10.sss.sss.sss): icmp_seq=1 ttl=119 time=13.2 ms
    64 bytes from 10.sss.sss.sss (10.sss.sss.sss): icmp_seq=2 ttl=119 time=14.3 ms

    --- server.mycompany.com ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1001ms
    rtt min/avg/max/mdev = 13.257/13.791/14.325/0.534 ms
  • на моем хосте: конфигурация DNS была изменена при повторном подключении к VPN; таким образом server.mycompany.com может быть разрешен и снова доступен

  • в контейнере: на этот раз конфигурация DNS была автоматически обновлена ​​для использования DNS-серверов mycompany !! server.mycompany.com может быть разрешен и доступен.

6- Заключение и вопросы:

  • Почему docker ведет себя по-разному на шагах 2 и 5 ? Чем отличаются эти шаги?
  • Есть ли способ заставить docker автоматически обновлять свою конфигурацию DNS на шаге 2?
  • Это ошибка в docker демоне?
...