Как отключить и включить подключение к Интернету из контейнера Docker?

Я очищаю /etc/resolv.conf, чтобы отключить сеть:

sudo mv /etc/resolv.conf /etc/resolv_backup.conf
sudo touch /etc/resolv.conf

Затем, чтобы включить сеть:

sudo mv /etc/resolv_backup.conf /etc/resolv.conf

Однако ресурс занят, и я не могу выполнить эти команды.

Я хочу отключить Интернет из контейнера и не использовать:

отключение сети docker [ВАРИАНТЫ] СЕТЕВОЙ КОНТЕЙНЕР

который делает это с сервера, на котором развернут контейнер. Я использую Альпайн.


person LazyCoder    schedule 18.06.2018    source источник


Ответы (2)


Изнутри контейнера вам обычно запрещено изменять состояние сети:

$ docker run -it --rm alpine:latest /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
929: eth0@if930: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # ip link set eth0 down
ip: ioctl 0x8914 failed: Operation not permitted

Это сделано намеренно в целях безопасности, чтобы предотвратить выход приложений из изолированной программной среды контейнера. Если вам не нужна защита ваших контейнеров (и поэтому я не рекомендую этого делать), вы можете запустить свой контейнер с дополнительными сетевыми возможностями:

$ docker run -it --rm --cap-add NET_ADMIN alpine:latest /bin/sh
/ # netstat -nr
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         172.17.0.1      0.0.0.0         UG        0 0          0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 eth0
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
933: eth0@if934: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # ip link set eth0 down
/ # ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
ping: sendto: Network unreachable

Когда вы попытаетесь восстановить сеть, вам также потребуется снова настроить маршрут по умолчанию, чтобы иметь возможность подключаться к внешним сетям:

/ # ip link set eth0 up
/ # ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
ping: sendto: Network unreachable
/ # netstat -nr
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 eth0
/ # route add default gw 172.17.0.1
/ # ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=58 time=12.518 ms
64 bytes from 8.8.8.8: seq=1 ttl=58 time=11.481 ms
^C
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 11.481/11.999/12.518 ms
person BMitch    schedule 18.06.2018
comment
При использовании ip link set eth0 down вы также теряете подключение к другим контейнерам той же сети (кроме доступа в Интернет)? - person tgogos; 18.06.2018
comment
Да, контейнер теряет весь доступ к сети, кроме петлевого интерфейса. Лучшее место для более тонкой настройки доступа к сети контейнера — за пределами контейнера с политикой входа/выхода. Их можно найти в таких инструментах, как Istio/Envoy, и в других сетевых драйверах. В качестве быстрого хака вы можете попробовать настроить таблицу маршрутизации вручную и удалить маршрут по умолчанию. - person BMitch; 18.06.2018
comment
Благодарю за разъяснение! - person tgogos; 18.06.2018
comment
Я не хочу терять соединение с другими контейнерами, так как мне нужно соединение с контейнером базы данных. - person LazyCoder; 18.06.2018

Во-первых, очистка resolv.conf не является правильным способом отключения сети для вашего контейнера. Это просто позволяет избежать разрешения имен, но вы все равно можете использовать IP-подключение.

Чтобы отключить сеть, вы должны использовать соответствующий скрипт в зависимости от того, используете ли вы systemd или sysV. Что-то похожее на это должно работать (это зависит от вашего дистрибутива):

# /etc/init.d/networking stop
# systemctl stop networking

Надеюсь это поможет! :-)

person aicastell    schedule 18.06.2018