Полное шифрование диска Ubuntu в Hetzner Cloud с добавлением добавления статического маршрута в initramfs

Я пытаюсь настроить Ubuntu с полным шифрованием диска поверх Hetzner Cloud. У меня все работает, кроме сетевого подключения в initramfs. Благодаря UI-консоли его можно разблокировать, но мне нужен SSH (dropbear) в init. Я успешно использую ту же конфигурацию на своих корневых серверах без проблем.

Если я установлю dropbear, чтобы получить IP по dhcp, всегда приводя к NETWORK IS UNREACHABLE, Но он получает правильные параметры с сервера DHCP. Я попросил поддержки Хецнера. Они сказали мне, что думают, что клиент dhcp не поддерживает RFC 3442 Classless Static Routes Option, и порекомендовали добавить статический маршрут с ip r a 172.31.1.1 dev ens3, Как и в этом вопросе я добавил маршрут, но всегда получал одну и ту же ошибку: NETWORK IS UNREACHABLE, Я проверил, чтобы установить маршрут в разных скриптах, но ничего не изменилось. Я тестировал Ubuntu 16.04 и 18.04.

Я рад любым рекомендациям по этому поводу. Спасибо!

1 ответ

Решение

Была такая же проблема / небольшая дискуссия с техподдержкой, что не может быть, что initramfs дает сбой только в таких экземплярах облака Гетцнера, как этот.

Но служба поддержки Hetzner повторяет только то, что их DHCP-сервер совместим с RFC3442, который объявляет маршрут хоста по умолчанию к внутреннему облачному GW. Так что это должно быть проблемой клиента initramfs dhcp, и они не могли (не так ли) попытаться настроить возможный ответ BootP, например, с правильным параметром IP=....

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

Hetzner_OL 6 месяцев назад [-]

Спасибо за предложение о Docker/dbaas. Я передал это нашей команде разработчиков. Обычно мы не публикуем, какие новые продукты и функции мы разрабатываем, пока они не будут готовы, но мы будем продолжать публиковать информацию об обновлениях по мере их разработки.

Относительно DSGVO: Поддерживаете ли вы шифрование файловой системы? ->

Облачные серверы Hetzner полностью виртуализированы. Таким образом, клиент может даже полностью зашифровать весь сервер. --Кати, Маркетинг, Hetzner Online

Я пытался найти вопросы / решения для этой проблемы, но единственное совпадение, которое я нашел сегодня, это ваш вопрос;)

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

Мое быстрое решение проблемы состоит в том, чтобы вручную "динамически" исправить нужную функцию, например, эту: вы можете проверить все свои переменные в /run/net-ens3.conf:

root@image-debian-jessie-94 ~ # diff -p /usr/share/initramfs-tools/scripts/functions{.orig,}
*** /usr/share/initramfs-tools/scripts/functions.orig   2018-07-31 12:46:40.911167456 +0200
--- /usr/share/initramfs-tools/scripts/functions        2018-07-31 12:50:30.736742035 +0200
*************** configure_networking()
*** 274,279 ****
--- 274,284 ----
                # ipconfig should have quit after first response
                . /run/net-*.conf
        fi
+
+       # Hack for Hetzner vServer static route enhanced like shown partly in this answer:
+       # https://faultserver.ru/questions/909040/static-route-in-initramfs
+       ip route add ${IPV4GATEWAY}/${IPV4NETMASK} dev ${DEVICE}
+       ip route add default via ${IPV4GATEWAY} dev ${DEVICE}
  }

  # Wait for queued kernel/udev events

Проверено и работало нормально для меня. Я мог бы настроить / снимок самого маленького изображения.

Зашифрованный моментальный снимок составляет ~18 ГБ по сравнению с 0,5 ГБ в незашифрованном виде, но цена моментального снимка остается хорошей по сравнению с улучшенной безопасностью (обычно системы на основе Openstack могут / должны иметь службу менеджера ключей, которая может это прозрачно.;)

Ответ Хаджо начинается с правильного пути, но он пропускает несколько ключевых вещей. Вот как я получил это для работы на Ubuntu Bionic без необходимости исправления каких-либо файлов (то есть этот метод не подвержен сбоям при обновлении):

  1. initramfs-tools сценарии должны начинаться с некоторого шаблона, который подключается к его системе; в противном случае скрипт будет запускаться во время генерации initramfs, а это не то, что нам нужно:

    #!/bin/sh
    PREREQ=""
    prereqs()
    {
        echo "$PREREQ"
    }
    
    case $1 in
    prereqs)
        prereqs
        exit 0
        ;;
    esac
    
    . /scripts/functions
    # Begin real processing below this line
    
  2. Вызвать configure_networking функционировать прямо перед добавлением маршрута. Это приводит к тому, что конфигурация сети по умолчанию происходит первой, что в противном случае может привести к сбою любых настроек, созданных сценарием, если он будет запущен позже. Функция создает несколько файлов в /run/, которые заставляют второй вызов (из хука busybox-initramfs) ничего не делать.

    configure_networking
    
  3. Добавьте статические маршруты, как в ответе jajo. Если вы не настраиваете IP-адрес, используя, например, параметр командной строки ядра, добавьте его и здесь.

    ip route add 1.2.3.4 dev ens3
    ip route add default via 1.2.3.4 dev ens3
    
    exit 0                   
    

Как и в ответе Jojo, файл выше должен быть помещен в /etc/initramfs-tools/scripts/init-premount/static-routesи сделал исполняемым.

Еще одна вещь, на которую стоит обратить внимание, это то, что klibc недавно внедрила поддержку RFC3442 (бесклассовые статические маршруты в DHCP); поэтому, если ваш поставщик услуг объявляет необходимость этих маршрутов в своей конфигурации DHCP, возможно, вам не понадобится этот скрипт в последних версиях Debian/Ubuntu.

Для тех кто сталкивался с этой веткой:

По крайней мере, в Debian Stretch работает более общая конфигурация (которая не будет нарушаться при обновлении пакета). Мы просто статически настраиваем сеть с помощью скрипта в init-premount:

vi / etc / initramfs-tools / scripts / init-premount / static-маршруты

#!/bin/sh 
# /etc/initramfs-tools/scripts/init-premount/static-routes

# to avoid race condition
# we have to wait until the automatic network configuration via dhcp
# is finished
sleep 15

ip a add 192.168.0.18/32 dev eth0
ip route add 192.168.178.1 dev eth0
ip route add default via 192.168.178.1 dev eth0

exit 0

chmod 755 /etc/initramfs-tools/scripts/init-premount/static-маршруты

Основываясь на других ответах, следующий скрипт, помещенный в качестве исполняемого файла в / etc / initramfs-tools / scripts / init-premount /, наконец, заставил его работать с Hetzner Cloud Server Ubuntu 20.04:

#!/bin/sh
PREREQ=""
prereqs()
{
    echo "$PREREQ"
}

case $1 in
prereqs)
    prereqs
    exit 0
    ;;
esac

. /scripts/functions
# Begin real processing below this line
# /etc/initramfs-tools/scripts/init-premount/static-routes

configure_networking

ip route add 172.31.1.1/32 dev ens3 
ip route add default via 172.31.1.1 dev ens3 

exit 0

Помните, что необходимо вручную установить ISO-образ устаревшего сервера Ubuntu 20.04 и выполнить команду update-initramfs -u -k all после размещения скрипта.

Действительно важная строка - это "configure_networking", которая действительно изменила мою настройку.

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