Как ограничить сетевой доступ в контейнере Docker?

Ограничение сетевого доступа в контейнерах Docker — это важный шаг для обеспечения безопасности и управления сетевыми взаимодействиями контейнеров с внешними сервисами и друг с другом. Docker предоставляет несколько способов ограничения и контроля сетевого доступа, включая использование сетевых политик, встроенные возможности сетевых пространств (namespaces), настройки сетей и брандмауэра (iptables).


В этом руководстве мы рассмотрим различные способы ограничения сетевого доступа в контейнере Docker.

1. Использование пользовательских сетей Docker

Одним из простейших способов контролировать сетевые взаимодействия между контейнерами — это использование пользовательских сетей Docker. Когда контейнеры подключены к одной сети Docker, они могут "видеть" друг друга, а если они подключены к разным сетям — они изолированы. Это позволяет ограничивать доступ контейнеров друг к другу.

Создание пользовательской сети

Чтобы создать отдельную сеть для контейнеров, можно использовать команду docker network create. Например:


docker network create isolated_network

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

Запуск контейнеров в пользовательской сети

Вы можете запустить контейнеры и подключить их к созданной сети:


docker run -d --name container1 --network isolated_network nginx
docker run -d --name container2 --network isolated_network redis

Контейнеры container1 и container2 будут изолированы от других контейнеров в сети по умолчанию, но смогут общаться друг с другом.

Отключение сетевого доступа для контейнера

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


docker run -d --network none --name isolated_container nginx

Контейнер isolated_container не будет иметь доступа к сети и не сможет взаимодействовать с другими контейнерами или внешними сетевыми ресурсами.

2. Ограничение сетевого доступа с использованием iptables

Docker использует iptables для управления сетевыми правилами. Вы можете добавлять свои собственные правила iptables для ограничения доступа к контейнерам или от контейнеров к внешним ресурсам.

Просмотр текущих правил iptables

Вы можете просмотреть правила iptables, которые управляют сетевым доступом, используя следующую команду:


iptables -L

Добавление правил iptables для ограничения сетевого доступа

Например, вы можете заблокировать исходящий трафик от определённого контейнера, добавив правило iptables:


iptables -I FORWARD -s  -j DROP

Эта команда блокирует весь исходящий трафик с IP-адреса контейнера. Чтобы узнать IP-адрес контейнера, выполните команду:


docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <название_контейнера>

После добавления этого правила контейнер не сможет отправлять пакеты во внешнюю сеть.

Пример блокировки доступа к определённому IP

Вы можете заблокировать доступ контейнера к конкретному IP-адресу (например, к определённому внешнему сервису):


iptables -I FORWARD -s  -d <цель_IP> -j DROP

Это ограничит доступ контейнера к конкретному IP-адресу, например, к определённому серверу или сети.

3. Использование параметра --network для управления доступом

При запуске контейнеров с помощью флага --network можно выбирать различные сетевые режимы, такие как bridge, host, none, или пользовательские сети. Это позволяет контролировать доступ контейнера к сетевым ресурсам.

Режим host

При запуске контейнера в режиме host контейнер будет использовать сетевые интерфейсы хост-системы, и он не будет изолирован сетевым пространством (namespace). Этот режим даёт контейнеру полный доступ ко всем сетевым ресурсам хоста, что не рекомендуется для повышения безопасности.


docker run -d --network host nginx

Контейнер, запущенный с флагом --network host, получит доступ ко всей сети хоста и к его интерфейсам, что обычно менее безопасно.

Режим none

При запуске контейнера в режиме none контейнер полностью изолирован от всех сетей и не имеет доступа к сети.


docker run -d --network none nginx

Контейнер, запущенный в режиме none, не сможет отправлять или получать данные по сети.

4. Ограничение сетевого доступа с использованием Docker Compose

Если вы используете Docker Compose, вы можете задавать сетевые настройки прямо в файле docker-compose.yml. Это позволяет контролировать, какие контейнеры могут взаимодействовать друг с другом и с внешними сетями.

Пример docker-compose.yml с ограниченным доступом


version: '3'
services:
  web:
    image: nginx
    networks:
      - frontend

  db:
    image: postgres
    networks:
      - backend

networks:
  frontend:
  backend:

В этом примере контейнеры web и db находятся в разных сетях (frontend и backend), что означает, что они не могут взаимодействовать друг с другом напрямую.

5. Ограничение сетевого доступа с использованием сетевых политик (Docker Swarm и Kubernetes)

Если вы используете Docker Swarm или Kubernetes, вы можете задавать более сложные сетевые политики, которые позволяют управлять сетевыми взаимодействиями контейнеров на уровне кластеров. Сетевые политики позволяют задавать правила для разрешения или блокировки трафика между различными контейнерами или сервисами.

Пример сетевой политики в Kubernetes:


apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress
  ingress: []
  egress: []

Эта сетевая политика запрещает все входящие и исходящие подключения к подам в Kubernetes, что эффективно изолирует контейнеры от сети.

Заключение

Docker предоставляет множество способов ограничения сетевого доступа в контейнерах. Вы можете управлять доступом через пользовательские сети Docker, использовать iptables для тонкой настройки сетевых правил или использовать сетевые политики в Docker Swarm и Kubernetes. Каждый из этих методов позволяет обеспечить безопасность и изоляцию контейнеров в зависимости от вашего сценария использования.

Важно выбирать подходящий способ ограничения сетевого доступа в зависимости от ваших требований к безопасности, масштаба инфраструктуры и используемых инструментов оркестрации.

Блог НАЙС ОС

Блог НАЙС ОС — это платформа для пользователей и разработчиков, где публикуются статьи, руководства и новости о мире Linux. Основное внимание уделено использованию, настройке и оптимизации ОС, а также обзору новых функций и технологий, доступных в дистрибутиве НАЙС ОС.