Как установить Docker CE на Debian 10 с поддержкой двойного стека IPv6-NAT и поддержкой брандмауэра

Введение

В этом руководстве мы установим Docker Community Edition на облачный сервер, на котором работает Docker 10 Buster, и настроим его конфигурацию docker и брандмауэра, чтобы легко поддерживать переадресацию портов с двумя стеками (симметричная маршрутизация IPv4 и IPv6) через IPv6-NAT и передачу брандмауэра через IPTables.
Предпосылки
Это руководство было протестировано на облачном сервере Hetzner, но должно работать с любым облачным сервером.
  • Нам нужен облачный сервер со свежим образом Debian 10 Buster.
  • Рекомендуется использовать аутентификацию с открытым ключом для доступа по SSH.
  • Если мы хотим использовать какие-либо внутренние сети или плавающие IP-адреса, мы должны добавить и настроить их, прежде чем приступить к этому учебнику.

Шаг 1 - Подготовка среды

Во-первых, нам нужно войти на облачный сервер, используя SSH. Если мы не вошли в систему как root напрямую, нам нужно открыть корневую оболочку с помощью sudo:
sudo -i

Шаг 1.1 - Установите переменные среды

Некоторые значения, такие как основной адрес IPv4 и IPv6, будут использоваться несколько раз, поэтому мы будем экспортировать их как переменные среды для простого повторного использования.
Пожалуйста, введите ваши значения и выполните следующие команды экспорта:
# Main IPv4 address for the cloud server
export HCTUT_IPV4MAIN="192.0.2.1"
# Main IPv6 address for the cloud server
export HCTUT_IPV6MAIN="2001:DB8::2"
# Configured SSH port used to connect to the cloud server (default: 22)
export HCTUT_SSHPORT="22"
# Private IPv4 Subnet for custom docker bridge
export HCTUT_PSUBIPV4="172.25.0.0/24"
# Private IPv6 Subnet for custom docker bridge
export HCTUT_PSUBIPV6="fdef::/64"
Нам также понадобится последняя версия docker-ipv6nat . Пожалуйста, проверьте его страницу выпуска и получите последнюю версию строки. Добавьте эту строку версии в качестве переменной среды:
export HCTUT_IPV6NAT_VERSION="vX.X.X"

Шаг 1.2 - Обновление и обновление облачного сервера

Мы должны убедиться, что на облачном сервере установлены последние обновления, а его списки пакетов актуальны:
apt update
apt dist-upgrade

Шаг 1.3 - сетевое исправление IPv6

В настоящий момент основной IPv6-адрес, настроенный в конфигурации cloud-init, добавлен как устаревший . Это сломает IPv6-NAT, поэтому нам нужно это исправить, просто принудительно привязав IPv6-адрес eth0вместо обозначенного eth0:0:
sed -i 's/eth0:0/eth0/g' /etc/network/interfaces.d/50-cloud-init.cfg
systemctl restart networking.service

Шаг 2 - Сконфигурируйте модули ядра для Debian 10 Buster

В Debian 10 Buster есть две подсистемы ядра, которые будут обрабатывать задания брандмауэра для вашей системы: nf_tables (nftables) и x_tables (iptables). Кроме того, можно использовать новую подсистему ( таблицы nf ), настроив ее с помощью устаревших команд (iptables / ip6tables). В настоящее время есть некоторые ошибки ( # 934168 ) в официальном ядре Debian при использовании определенных правил с подсистемой nf tables и устаревшими командами iptables. Docker CE также не предоставляет встроенной поддержки для nftables. Поскольку использование обеих подсистем ядра не рекомендуется из-за непредвиденного поведения, мы будем использовать только x_tables и устаревшие команды iptables / ip6tables .

Шаг 2.1 - Отключить модуль ядра nf_tables

Поскольку мы хотим использовать только подсистему x_tables , мы отключим модуль ядра nf_tables, чтобы предотвратить любую непреднамеренную загрузку этого модуля:
cat << \EOF > /etc/modprobe.d/nftables.conf
install nf_tables /bin/false
EOF

Шаг 2.2 - Загрузка br_netfilter при загрузке

Docker использует модуль ядра br_netfilter, который иногда не может быть загружен динамически самим демоном docker. Чтобы убедиться, что этот модуль загружен, мы загрузим его непосредственно при загрузке:
cat << \EOF > /etc/modules-load.d/br_netfilter.conf
br_netfilter
EOF

Шаг 2.3 - Установите параметр ядра для сетевой маршрутизации

Некоторые параметры ядра необходимо настроить для поддержки надежной маршрутизации IPv4 и IPv6 с помощью Docker:
cat << \EOF > /etc/sysctl.d/85-network.conf
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
EOF
sysctl --system

Шаг 3 - Установите и настройте брандмауэр

Как указывалось ранее, мы (и докер) будем использовать iptables и ip6tables для настройки нашего брандмауэра.

Шаг 3.1 - Установите iptables с сохранением задания

Прежде всего, нам нужно установить iptables и системное задание постоянства, которое будет загружать сохраненные правила брандмауэра при загрузке:
apt install iptables iptables-persistent
Процесс установки спросит, хотим ли мы сохранить текущие правила брандмауэра IPv4 и IPv6. Не имеет значения, сохраним ли мы текущие наборы правил или нет, так как мы еще не добавили никаких правил.

Шаг 3.2 - Использование устаревших команд iptables / ip6tables

Нам нужно принудительно использовать устаревшие команды для iptables / ip6tables:
update-alternatives --set iptables /usr/sbin/iptables-legacy
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy

Шаг 3.3 - Создание основных правил брандмауэра

Настройка брандмауэра - сложная тема, которую мы будем и не можем полностью охватить в этом руководстве. Мы будем использовать очень простую конфигурацию по умолчанию, которая будет разрешать входящие соединения SSH только на все основные IP-адреса облачного сервера и некоторые пакеты ICMP / ICMPv6:
cat << EOF > /etc/iptables/rules.v4
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:HCFW-ICMP - [0:0]
:HCFW-Local - [0:0]
:HCFW-Services - [0:0]
:HCFW-State - [0:0]
-A INPUT -j HCFW-Local
-A INPUT -j HCFW-State
-A INPUT -p icmp -j HCFW-ICMP
-A INPUT -j HCFW-Services
-A OUTPUT -j HCFW-Local
-A OUTPUT -j HCFW-State
-A OUTPUT -j ACCEPT
-A HCFW-ICMP -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A HCFW-ICMP -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A HCFW-ICMP -p icmp -m icmp --icmp-type 8 -m limit --limit 8/sec -j ACCEPT
-A HCFW-Local -i lo -j ACCEPT
-A HCFW-Services -p tcp -m tcp -d $HCTUT_IPV4MAIN --dport $HCTUT_SSHPORT -j ACCEPT
-A HCFW-State -m conntrack --ctstate INVALID -j DROP
-A HCFW-State -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
COMMIT
EOF
cat << EOF > /etc/iptables/rules.v6
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:WCFW-ICMP - [0:0]
:WCFW-Local - [0:0]
:WCFW-Services - [0:0]
:WCFW-State - [0:0]
-A INPUT -j WCFW-Local
-A INPUT -j WCFW-State
-A INPUT -p ipv6-icmp -j WCFW-ICMP
-A INPUT -j WCFW-Services
-A OUTPUT -j WCFW-Local
-A OUTPUT -j WCFW-State
-A OUTPUT -j ACCEPT
-A WCFW-ICMP -p ipv6-icmp -m icmp6 --icmpv6-type 1 -j ACCEPT
-A WCFW-ICMP -p ipv6-icmp -m icmp6 --icmpv6-type 2 -j ACCEPT
-A WCFW-ICMP -p ipv6-icmp -m icmp6 --icmpv6-type 3 -j ACCEPT
-A WCFW-ICMP -p ipv6-icmp -m icmp6 --icmpv6-type 4 -j ACCEPT
-A WCFW-ICMP -p ipv6-icmp -m icmp6 --icmpv6-type 133 -j ACCEPT
-A WCFW-ICMP -p ipv6-icmp -m icmp6 --icmpv6-type 134 -j ACCEPT
-A WCFW-ICMP -p ipv6-icmp -m icmp6 --icmpv6-type 135 -j ACCEPT
-A WCFW-ICMP -p ipv6-icmp -m icmp6 --icmpv6-type 136 -j ACCEPT
-A WCFW-ICMP -p ipv6-icmp -m icmp6 --icmpv6-type 128 -m limit --limit 8/sec -j ACCEPT
-A WCFW-Local -i lo -j ACCEPT
-A WCFW-Services -p tcp -m tcp -d $HCTUT_IPV6MAIN --dport $HCTUT_SSHPORT -j ACCEPT
-A WCFW-State -m conntrack --ctstate INVALID -j DROP
-A WCFW-State -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
COMMIT
EOF

Шаг 4 - Установите и настройте Docker CE

Теперь мы можем установить Docker CE в нашей системе Debian 10 Buster. Мы установим официальные пакеты от Docker Inc., так как репозитории пакетов debian не содержат последних обновлений для Docker CE.

Шаг 4.1. Настройка хранилищ APT Docker Inc.

Перед установкой Docker CE нам нужно добавить репозитории apt от Docker Inc. к нашим источникам пакетов и ключ подписи Debian Inc. к нашим доверенным ключам apt:
apt install apt-transport-https
wget -O /tmp/docker https://download.docker.com/linux/debian/gpg
gpg --dearmor /tmp/docker
cp /tmp/docker.gpg /etc/apt/trusted.gpg.d/docker.gpg
rm -rf /tmp/docker /tmp/docker.gpg
cat << \EOF > /etc/apt/sources.list.d/docker.list
deb https://download.docker.com/linux/debian buster stable
EOF

Шаг 4.2 - Установите Docker Community Edition

Теперь мы можем установить Docker CE. Мы не будем устанавливать aufs, который является более старым драйвером хранилища и больше не рекомендуется.
apt update
apt install docker-ce aufs-tools-

Шаг 4.3. Настройка docker-демона

Теперь нам нужно установить некоторые параметры конфигурации для демона Docker. В качестве DNS-серверов докер по умолчанию будет использовать собственный прокси-сервер dns, но в качестве резервной копии мы предоставим DNS-сервер Hetzner IPv4 и IPv6. Поскольку мы используем iptables / ip6tables для переадресации портов, прокси-сервер пользователя не нужен и должен быть отключен. В дополнение к этому, мы создадим новый мост по умолчанию, который будет использоваться докерными контейнерами, так что собственный мост докера больше не нужен.
cat << \EOF > /etc/docker/daemon.json
{
    "log-driver": "journald",
    "bridge": "none",
    "userland-proxy": false,
    "dns": ["2a01:4f8:0:1::add:1010", "213.133.100.100"]
}
EOF

Шаг 4.4 - Создать новый мост по умолчанию для докера

Используя наши предустановленные подсети, мы теперь создаем наш новый мост по умолчанию:
docker network create \
  -d bridge \
  --ipv6 \
  --subnet $HCTUT_PSUBIPV4 \
  --subnet $HCTUT_PSUBIPV6 \
  -o "com.docker.network.bridge.enable_icc=false" \
  -o "com.docker.network.bridge.name=dnetDefault" \
  dnetDefault
Контейнеры смогут получать доступ к внешним сетевым адресам через NAT, но не смогут взаимодействовать друг с другом. Если вы хотите связь между контейнерами, создайте дополнительную сеть и установите com.docker.network.bridge.enable_iccзначение true.
Мы не используем docker0мост, поэтому нам нужно указать сеть docker run --network dnetDefault ...для каждого контейнера. В противном случае контейнер будет создан без подключения к сети. Как побочный эффект, это предотвратит случайное создание контейнеров с сетевыми возможностями.

Шаг 4.5 - Исправление системного сервисного модуля docker.service

Docker добавит и удалит правила iptables в наш набор правил. Если у нас есть существующие правила iptables, их необходимо загрузить до запуска Docker. Этого можно достичь, начав docker.serviceпосле netfilter-persistent.service. Кроме того, некоторые IP-адреса могут быть не готовы непосредственно при запуске (например, DHCP для внутренних сетей), поэтому мы отложим запуск службы докера на две секунды. Следующая команда переопределит существующий сервисный модуль systemd для докера:
cat << \EOF > /etc/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
BindsTo=containerd.service
After=network-online.target firewalld.service netfilter-persistent.service containerd.service
Wants=network-online.target
Requires=docker.socket

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStartPre=/bin/sleep 5
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3

# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s

# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity

# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes

# kill only the docker process, not all processes in the cgroup
KillMode=process

[Install]
WantedBy=multi-user.target
EOF

Шаг 4.6 - Установите флаги ядра в GRUB_CMDLINE

Некоторые функции ядра должны быть включены для демона docker при запуске системы и должны быть добавлены в командную строку grub по умолчанию:
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="/GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory swapaccount=1 /g' /etc/default/grub
update-grub

Шаг 5 - Установите и настройте docker-ipv6nat

Наша главная цель - симметричная конфигурация с двумя стеками для докера. Возможно, вы сможете добавить общедоступные адреса IPv6 в контейнеры Docker, но тогда у вас будет прямой доступ через IPv6 и косвенный доступ через IPv4, что усложнит систему с двумя стеками. Чтобы обеспечить симметричную конфигурацию, мы будем использовать docker-ipv6nat, который добавит правила IPv6 NAT для подсетей IPv6, используемых docker.

Шаг 5.1 - Загрузите и установите бинарный файл docker-ipv6nat

wget -O /tmp/docker-ipv6nat.amd64 https://github.com/robbertkl/docker-ipv6nat/releases/download/$HCTUT_IPV6NAT_VERSION/docker-ipv6nat.amd64
chown root:root /tmp/docker-ipv6nat.amd64
mv /tmp/docker-ipv6nat.amd64 /usr/local/sbin/docker-ipv6nat
chmod +x /usr/local/sbin/docker-ipv6nat

Шаг 5.2 - Создать системный сервисный модуль для docker-ipv6nat

cat << \EOF > /etc/systemd/system/docker-ipv6nat.service
[Unit]
Description=Docker IPv6-NAT
After=network.target docker.service
StartLimitIntervalSec=60

[Service]
Type=simple
Restart=on-failure
RestartSec=10
ExecStart=/usr/local/sbin/docker-ipv6nat -cleanup -retry

[Install]
WantedBy=multi-user.target
EOF
systemctl enable docker-ipv6nat

Шаг 6 - Перезагрузка

Теперь мы можем выйти из корневой оболочки и перезагрузить облачный сервер:
reboot

Шаг 7 - Создать основной веб-сервер HTTPD (необязательно)

После перезагрузки облачного сервера мы можем протестировать нашу конфигурацию и запустить базовый веб-сервер HTTPD.

Шаг 7.1 - Проверка системных сервисов

Сначала нам нужно проверить, все ли сервисы systemd выполнены правильно:
sudo systemctl status netfilter-persistent.service --no-pager
sudo systemctl status docker.service --no-pager
sudo systemctl status docker-ipv6nat.service --no-pager
Постоянное задание netfilter должно быть успешно выполнено. Две другие службы должны работать без ошибок.

Шаг 7.2 - Проверьте сеть

В качестве следующего шага мы должны проверить, правильно ли настроен наш док-мост.
ip addr
Теперь вы должны увидеть dnetDefaultинтерфейс (используя примеры значений для подсетей):
4: dnetDefault: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:5e:d8:b7:5e brd ff:ff:ff:ff:ff:ff
    inet 172.25.0.1/24 brd 172.25.0.255 scope global dnetDefault
       valid_lft forever preferred_lft forever
    inet6 fdef::1/64 scope global tentative
       valid_lft forever preferred_lft forever
    inet6 fe80::1/64 scope link tentative
       valid_lft forever preferred_lft forever

Шаг 7.3 - Проверка модулей ядра

Мы не должны иметь возможность проверять работоспособность отключенного nf_tablesмодуля ядра:
sudo modprobe nf_tables
Вывод должен выглядеть так:
modprobe: ERROR: ../libkmod/libkmod-module.c:979 command_do() Error running install command for nf_tables
modprobe: ERROR: could not insert 'nf_tables': Operation not permitted
В дополнение к этому, br_netfilterдолжны быть загружены:
lsmod | grep br_netfilter
Вывод должен выглядеть так:
br_netfilter           24576  0
bridge                188416  1 br_netfilter

Шаг 7.4 - Spawn HTTPD контейнер

Теперь мы можем порождать контейнер (соответственно заменить значения):
# Main IPv4 address for the cloud server
export HCTUT_IPV4MAIN="192.0.2.1"
# Main IPv6 address for the cloud server
export HCTUT_IPV6MAIN="2001:DB8::1"
sudo docker run \
  -d \
  --restart always \
  --name test-httpd \
  --network dnetDefault \
  --publish $HCTUT_IPV4MAIN:8080:80 \
  --publish [$HCTUT_IPV6MAIN]:8080:80 \
  httpd:latest
Теперь вы должны иметь возможность доступа http://$HCTUT_IPV4MAIN:8080и http://[$HCTUT_IPV6MAIN]:8080.

Шаг 7.5 - Проверьте iptables

sudo iptables -t nat -nvL
sudo iptables -nvL
Вывод должен выглядеть так:
root@tutorial:~# sudo iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 6 packets, 292 bytes)
 pkts bytes target     prot opt in     out     source               destination
   29  1712 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 1 packets, 60 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 5 packets, 300 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 MASQUERADE  all  --  *      dnetDefault  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match src-type LOCAL
    0     0 MASQUERADE  all  --  *      !dnetDefault  172.25.0.0/24        0.0.0.0/0
    0     0 MASQUERADE  tcp  --  *      *       172.25.0.2           172.25.0.2           tcp dpt:80

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination
    5   300 DNAT       tcp  --  *      *       0.0.0.0/0            116.203.191.110      tcp dpt:8080 to:172.25.0.2:80
root@tutorial:~# sudo iptables -nvL
Chain INPUT (policy DROP 5 packets, 232 bytes)
 pkts bytes target     prot opt in     out     source               destination
 6028   57M HCFW-Local  all  --  *      *       0.0.0.0/0            0.0.0.0/0
 6028   57M HCFW-State  all  --  *      *       0.0.0.0/0            0.0.0.0/0
    0     0 HCFW-ICMP  icmp --  *      *       0.0.0.0/0            0.0.0.0/0
   27  1552 HCFW-Services  all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
   51  7055 DOCKER-ISOLATION-STAGE-1  all  --  *      *       0.0.0.0/0            0.0.0.0/0
   26  3428 ACCEPT     all  --  *      dnetDefault  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    5   300 DOCKER     all  --  *      dnetDefault  0.0.0.0/0            0.0.0.0/0
   20  3327 ACCEPT     all  --  dnetDefault !dnetDefault  0.0.0.0/0            0.0.0.0/0
    0     0 DROP       all  --  dnetDefault dnetDefault  0.0.0.0/0            0.0.0.0/0

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
 1475  129K HCFW-Local  all  --  *      *       0.0.0.0/0            0.0.0.0/0
 1475  129K HCFW-State  all  --  *      *       0.0.0.0/0            0.0.0.0/0
   44  2906 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain DOCKER (1 references)
 pkts bytes target     prot opt in     out     source               destination
    5   300 ACCEPT     tcp  --  !dnetDefault dnetDefault  0.0.0.0/0            172.25.0.2           tcp dpt:80

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
 pkts bytes target     prot opt in     out     source               destination
   20  3327 DOCKER-ISOLATION-STAGE-2  all  --  dnetDefault !dnetDefault  0.0.0.0/0            0.0.0.0/0
   51  7055 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DROP       all  --  *      dnetDefault  0.0.0.0/0            0.0.0.0/0
   20  3327 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain HCFW-ICMP (1 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 3
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 11
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 8 limit: avg 8/sec burst 5

Chain HCFW-Local (2 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0

Chain HCFW-Services (1 references)
 pkts bytes target     prot opt in     out     source               destination
    3   180 ACCEPT     tcp  --  *      *       0.0.0.0/0            116.203.191.110      tcp dpt:22

Chain HCFW-State (2 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate INVALID
 7432   57M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED

Шаг 7.6 - Проверьте ip6tables

sudo ip6tables -t nat -nvL
sudo ip6tables -nvL
Вывод должен выглядеть так:
root@tutorial:~# sudo ip6tables -t nat -nvL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    5   400 DOCKER     all      *      *       ::/0                 ::/0                 ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 1 packets, 96 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DOCKER     all      *      *       ::/0                 ::/0                 ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 6 packets, 496 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 MASQUERADE  all      *      !dnetDefault  fdef::/64            ::/0
    0     0 MASQUERADE  tcp      *      *       fdef::2              fdef::2              tcp dpt:80

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination
    5   400 DNAT       tcp      *      *       ::/0                 2a01:4f8:c2c:159e::1  tcp dpt:8080 to:[fdef::2]:80
root@tutorial:~# sudo ip6tables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
   19  1352 WCFW-Local  all      *      *       ::/0                 ::/0
   19  1352 WCFW-State  all      *      *       ::/0                 ::/0
   16  1064 WCFW-ICMP  icmpv6    *      *       ::/0                 ::/0
    0     0 WCFW-Services  all      *      *       ::/0                 ::/0

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
   63  8997 DOCKER-ISOLATION  all      *      *       ::/0                 ::/0
   43  5270 DOCKER     all      *      dnetDefault  ::/0                 ::/0
    0     0 ACCEPT     all      *      dnetDefault  ::/0                 ::/0                 ctstate RELATED,ESTABLISHED
   20  3727 ACCEPT     all      dnetDefault !dnetDefault  ::/0                 ::/0
   12   880 DROP       all      dnetDefault dnetDefault  ::/0                 ::/0

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
   42  3800 WCFW-Local  all      *      *       ::/0                 ::/0
   42  3800 WCFW-State  all      *      *       ::/0                 ::/0
   42  3800 ACCEPT     all      *      *       ::/0                 ::/0

Chain DOCKER (1 references)
 pkts bytes target     prot opt in     out     source               destination
   31  4390 ACCEPT     tcp      !dnetDefault dnetDefault  ::/0                 fdef::2              tcp dpt:80

Chain DOCKER-ISOLATION (1 references)
 pkts bytes target     prot opt in     out     source               destination
   63  8997 RETURN     all      *      *       ::/0                 ::/0

Chain WCFW-ICMP (1 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0                 ipv6-icmptype 1
    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0                 ipv6-icmptype 2
    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0                 ipv6-icmptype 3
    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0                 ipv6-icmptype 4
    4   224 ACCEPT     icmpv6    *      *       ::/0                 ::/0                 ipv6-icmptype 133
    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0                 ipv6-icmptype 134
    7   504 ACCEPT     icmpv6    *      *       ::/0                 ::/0                 ipv6-icmptype 135
    5   336 ACCEPT     icmpv6    *      *       ::/0                 ::/0                 ipv6-icmptype 136
    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0                 ipv6-icmptype 128 limit: avg 8/sec burst 5

Chain WCFW-Local (2 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all      lo     *       ::/0                 ::/0

Chain WCFW-Services (1 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     tcp      *      *       ::/0                 2a01:4f8:c2c:159e::1  tcp dpt:22

Chain WCFW-State (2 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DROP       all      *      *       ::/0                 ::/0                 ctstate INVALID
    3   288 ACCEPT     all      *      *       ::/0                 ::/0                 ctstate RELATED,ESTABLISHED

Шаг 7.7 - Удалить контейнер HTTPD

В качестве последнего шага мы удалим порожденный контейнер и загруженный образ:
sudo docker stop test-httpd
sudo docker rm test-httpd
sudo docker rmi httpd:latest

Заключение

Мы установили Docker Community Edition и IPTables Firewall на наш Debian 10 Buster и подготовили его к симметричной работе с двумя стеками IPv4 / IPv6. В дополнение к этому, мы установили очень простой набор правил брандмауэра, который должен быть скорректирован путем редактирования /etc/iptables/rules.v4и /etc/iptables/rules.v6.

Добавить комментарий

Автору будет очень приятно узнать обратную связь о своем руководстве.

Комментариев 0