Как настроить постоянные параметры брандмауэра в Ubuntu 22.04 LTS — запутался в ufw, nfw и iptables (-nfw/-legacy)

TL;DR: как настроить постоянные правила брандмауэра? Я не использую UFW, кажется, я использую iptables-nft.

Во-первых, у меня есть

  • началось с довольно недавней установки vanilla Ubuntu 22.04LTS (добавлены некоторые другие инструменты)
  • установил Docker с помощью пакетов apt (репозиторий https://download.docker.com/linux/ubuntu)
  • установил LXD с помощью оснастки

Есть некоторые известные проблемы с брандмауэром при сосуществовании Docker и LXD, но я хочу использовать оба, и, насколько мне известно, оба должны быть достижимы, и это работало на моем предыдущем хосте (который был Ubuntu 18).

Из коробки сеть Docker работала, LXD — нет, а команды iptables показали такую ​​конфигурацию брандмауэра:

      sudo iptables -L
# Warning: iptables-legacy tables present, use iptables-legacy to see them
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
Chain FORWARD (policy DROP)
target     prot opt source               destination         
DOCKER-USER  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
Chain DOCKER (1 references)
target     prot opt source               destination         
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination         
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            
Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            
Chain DOCKER-USER (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere 

а также

      sudo iptables-legacy -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

«Предупреждение: присутствуют устаревшие таблицы iptables» немного беспокоило, но я не смог понять, является ли это проблемой, которую мне нужно исправить. На данный момент я не делал никаких настроек брандмауэра.

Я исправил LXD, добавив эти правила (последнее, чтобы сделать его менее открытым)

      sudo iptables -I DOCKER-USER -o lxdbr0 -j ACCEPT
sudo iptables -I DOCKER-USER -i lxdbr0 -j ACCEPT
sudo iptables -I DOCKER-USER -i ext_if ! -s 192.168.1.0/24 -j DROP

Но теперь я не знаю, как сделать их постоянными.

Есть файл /etc/nftables.conf, но он имеет только эту пустую конфигурацию.

      #!/usr/sbin/nft -f

flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0;
    }
    chain forward {
        type filter hook forward priority 0;
    }
    chain output {
        type filter hook output priority 0;
    }
}

и когда я выполняю nft list ruleset, существует множество конфигураций, связанных с Docker и LXD, которые, очевидно, исходят не от nftables.conf, и я не знаю, должен ли он быть динамическим и настроенным чем-то другим, кроме моего ручного редактирования файла nftables.conf.

Итак, я создал скрипт setup-lxd-networking.shэто делает те команды iptables -I, которые я запускаю вручную, но это не очень приятно.

      sudo nft list ruleset
...
table ip filter {
    chain DOCKER {
    }

    chain DOCKER-ISOLATION-STAGE-1 {
        iifname "docker0" oifname != "docker0" counter packets 18 bytes 1393 jump DOCKER-ISOLATION-STAGE-2
        counter packets 181 bytes 18684 return
    }

    chain DOCKER-ISOLATION-STAGE-2 {
        oifname "docker0" counter packets 0 bytes 0 drop
        counter packets 18 bytes 1393 return
    }

    chain FORWARD {
        type filter hook forward priority filter; policy drop;
        counter packets 209 bytes 35269 jump DOCKER-USER
        counter packets 181 bytes 18684 jump DOCKER-ISOLATION-STAGE-1
        oifname "docker0" ct state related,established counter packets 14 bytes 8351 accept
        oifname "docker0" counter packets 0 bytes 0 jump DOCKER
        iifname "docker0" oifname != "docker0" counter packets 18 bytes 1393 accept
        iifname "docker0" oifname "docker0" counter packets 0 bytes 0 accept
    }

    chain DOCKER-USER {
        iifname "ext_if" ip saddr != 192.168.1.0/24 counter packets 0 bytes 0 drop
        iifname "lxdbr0" counter packets 15 bytes 866 accept
        oifname "lxdbr0" counter packets 13 bytes 15719 accept
        counter packets 181 bytes 18684 return
    }
}
table inet lxd {
    chain pstrt.lxdbr0 {
        type nat hook postrouting priority srcnat; policy accept;
        ip saddr 10.5.62.0/24 ip daddr != 10.5.62.0/24 masquerade
        ip6 saddr fd42:dbed:893c:1f91::/64 ip6 daddr != fd42:dbed:893c:1f91::/64 masquerade
    }

    chain fwd.lxdbr0 {
        type filter hook forward priority filter; policy accept;
        ip version 4 oifname "lxdbr0" accept
        ip version 4 iifname "lxdbr0" accept
        ip6 version 6 oifname "lxdbr0" accept
        ip6 version 6 iifname "lxdbr0" accept
    }

    chain in.lxdbr0 {
        type filter hook input priority filter; policy accept;
        iifname "lxdbr0" tcp dport 53 accept
        iifname "lxdbr0" udp dport 53 accept
        iifname "lxdbr0" icmp type { destination-unreachable, time-exceeded, parameter-problem } accept
        iifname "lxdbr0" udp dport 67 accept
        iifname "lxdbr0" icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, parameter-problem, nd-router-solicit, nd-neighbor-solicit, nd-neighbor-advert, mld2-listener-report } accept
        iifname "lxdbr0" udp dport 547 accept
    }

    chain out.lxdbr0 {
        type filter hook output priority filter; policy accept;
        oifname "lxdbr0" tcp sport 53 accept
        oifname "lxdbr0" udp sport 53 accept
        oifname "lxdbr0" icmp type { destination-unreachable, time-exceeded, parameter-problem } accept
        oifname "lxdbr0" udp sport 67 accept
        oifname "lxdbr0" icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, parameter-problem, echo-request, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, mld2-listener-report } accept
        oifname "lxdbr0" udp sport 547 accept
    }
}

1 ответ

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

      # apt purge docker.io
# apt autoremove
# snap install docker
# reboot

Причина в том, что lxd хочет использовать nftables, а apt docker тоже хочет использовать nftables, но это плохо работает с lxd. Вы не можете заставить lxd использовать iptables-legacy. Но snap docker, похоже, использует iptables-legacy, поэтому они избегают друг друга.

Другие вопросы по тегам