LINUX.ORG.RU

docker и nftables

 , , ,


1

2

Приходиться изучать докер, а то этих докеров везде насовали, а просто приложений бинарных или хотя бы готовых виртуалок нет… Сразу скажу, я не эксперт в сетях.

Последний докер, все дела. Авто создание iptables правил для докера отключено в системд сервисе (у меня их нет, я ими не пользуюсь, у меня nftables). Создал свою пользовательскую сеть и присоединил к ней

NETWORK ID     NAME            DRIVER    SCOPE
46176c91bd13   bridge          bridge    local
e333dab226db   host            host      local
4baab8ccfc49   my-docker-net   bridge    local
d152559db207   none            null      local

docker network inspect my-docker-net

        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "2bddcafec9ceccfbcd487813182caeba9e3bd79bdc29da73d0f60c963f3aaeeb": {
                "Name": "alpine1",
                "EndpointID": "ceeaf90446fc59816a8c186a3017a3da4a7ef4d26a40eb3b4b562d3bd6aa1777",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

В итоге на хосте имею 3 новых интерфейса

5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:04:2e:d9:f6 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:4ff:fe2e:d9f6/64 scope link
       valid_lft forever preferred_lft forever
308: br-4baab8ccfc49: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:0e:ca:04:45 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-4baab8ccfc49
       valid_lft forever preferred_lft forever
    inet6 fe80::42:eff:feca:445/64 scope link
       valid_lft forever preferred_lft forever
370: vethb40c7f3@if369: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-4baab8ccfc49 state UP group default
    link/ether 4e:99:c7:eb:6a:c2 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::4c99:c7ff:feeb:6ac2/64 scope link
       valid_lft forever preferred_lft forever

ЕЯПП докер0 это дефолтный интерфейс, бр-4б… это интерфейс, который появился, когда я создал свою сеть, а последний не понятно, что это, но вроде появился, когда я приконнектил контейнер к своей сети. Внутри контейнера с алпайном ситуация такая:

/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    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
369: eth0@if370: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # ip route
default via 172.18.0.1 dev eth0
172.18.0.0/16 dev eth0 scope link  src 172.18.0.2

На хосте включен форвардинг, в нфтейблс конфиг добавлено

define DOCKERDEV = br-4baab8ccfc49
define DOCKERNET = 172.18.0.0/24

 chain my_forward {
     type filter hook forward priority filter; policy accept;
 }

table ip nat {
  chain postrouting {
    type nat hook postrouting priority 100;
    ip saddr $DOCKERNET oifname $ETHDEV masquerade
  }

  chain prerouting {
    type nat hook prerouting priority 0;
  }
}

Конфиг нфтейблс ессено применен. Однако доступа из контейнера в интернет нет. Пинги не проходят, резолвы тоже. Где я сделал что-то не так? Каким боком тут интерфейс vethb40c7f3@if369 ?



Последнее исправление: Entmatix (всего исправлений: 1)

Ответ на: комментарий от firkax

Я имел ввиду standalone бинарники. Это хорошо, если внутри только один бинарь и конфиги, а если там комбайны? Все это выковыривать и пытаться перенести такое себе удовольствие, тем более что обычно выкладывая докер авторы не особо многословны по поводу установки без докера, поэтому надо самому разбираться, что там и как.

Entmatix
() автор топика
Ответ на: комментарий от Pinkbyte

Благодарю за ссылку, подробно. Воспользуюсь мудростью еще немного.

  • В файле nftables-docker.conf у автора транзитная цепочка с дефолтным правилом accept, при этом ниже правила для докера с тем же accept, вроде
		iifname "docker0" oifname != "docker0" counter accept
		iifname "docker0" oifname "docker0" counter accept

Зачем? Уже же есть глобальное правило?

  • Зачем в двух таблицах filter и nat каждой своя цепочка INPUT? Как называешь сами таблицы не важно же, главное какие внутри цепочки. Получается у него ненужный повтор?

  • Что же все же по поводу моих интерфейсов? Если я хочу управлять своей подсетью, например, для каждого контейнера отдельной и создаю пользовательские сети, как я выше создал my-docker-net, на какой интерфейс мне ссылаться в правилах nftables? br-… или veth…?

Entmatix
() автор топика
Ответ на: комментарий от Entmatix

на какой интерфейс мне ссылаться в правилах nftables?

Ссылаться надо на интерфейс моста(br-*). Если парит тот факт, что docker выдает по умолчанию нечитаемые имена интерфейсам-мостам, гуглим как задать кастомное имя. К сожалению сделать это можно штатно только при создании сети.

Pinkbyte ★★★★★
()