dadv: (Default)
В продолжение темы. Заметка о настройке VPN-доступа для клиентских устройств, с тем чтобы давать им удалённый доступ в локальную сеть. В качестве агента IKEv2 используем strongswan-5.9.11_3, плюс для клиенских подключений создаем интерфейсы ipsecX ради удобства настройки MTU, роутинга, диагностики при помощи bpf (tcpdump/tshark/wireshark/etc.), SNMP-статистики и прочего. Авторизация клиентов методом IKEv2 IPSEC MS-CHAPv2. Условное имя VPN-сервера для клиентов vpn.domain.net. Read more... )
dadv: (Default)
В современных версиях FreeBSD команда tar это оболочка над libarchive и умеет работать далеко не только с tar-файлами разных видов. Например, можно использовать tar для создания переносимых ZIP-архивов:

# tar --format zip --one-file-system --options compression-level=0,encryption,hdrcharset=UTF-8 -C / -cvf /var/tmp/archive.zip /

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

Не нашел аналога --one-file-system в документации к Info-ZIP, который устанавливается в качестве /usr/local/bin/zip из порта/пакета archivers/zip.

Страница системной документации tar(1) ссылается на libarchive-formats(5), на archive_write_set_options(3) и на archive_read_set_options(3), где всё это документировано.
dadv: (Default)
Попробовал тут понастраивать bhyve и заодно взглянуть на Windows 11, взятую с первого попавшегося торрента на рутрекере.

bhyve завёл на домашнем роутере (FreeBSD 12.3/amd64), мелкая железка на чипсете Intel Q270 с питанием от 12 вольт.

Read more... )

Процессор Intel i5-7200U @ 2.50GHz с двумя ядрами без гипертрединга, 32GB памяти.

Оказалось довольно просто (сразу скажу: никаких SecureBoot и TPM 2.0 не потребовалось). Первым делом включаем в /etc/rc.conf подгрузку ядерных модулей для работы bhyve: kld_list="nmdm vmm" (и подгружаем их через kldload).

Добавляем в систему портами или пакетами sysutils/bhyve-firmware и sysutils/vm-bhyve, в моём случае получились bhyve-firmware-1.0_1 и vm-bhyve-1.4.2.

В /etc/rc.conf добавляем на время создания виртуалки:
vm_enable="YES"
vm_dir="/usr/local/etc/vm" # или vm_dir="zfs:poolname/vm"


Создаём конфигурацию гипервизора для виртуалки командой vm create -t windows -s 120G win11, где "windows" имя шаблона, а "win11" имя новой виртуалки. Эта команда создала win11.conf, в который я немедленно залез редактором.

Поменял memory=2G на memory=8G; закомментировал network0_type и network0_switch, чтобы во время установки у виртуалки не было сети.

Там же была строчка disk0_name="disk0.img", указывающая на 120-гигабайтный файл-образ disk0.img, который создала команда vm create выше. Это мне не подходит, так как нужна возможность создавать снапшоты, так что поменял этот блок настроек на следующее:

disk0_type="ahci-hd"
disk0_dev="custom"
disk0_name="/dev/zvol/z/win11"


Удалил disk0.img и создал zvol с "секторами" 4K:
zfs create -o compression=lz4 -V 120g -b 4096 z/win11

Положил инсталляционный ISO в vm/.iso/win11.iso и запустил установку:
vm install win11 win11.iso

После начала установки подключился к системе VNC-клиентом, получил экран с предложением запустить инсталляцию с CD/DVD. Установка прошла совершенно гладко, с тремя ребутами (VNC каждый раз приходилось переподключать). После появления десктопа выбрал завершение работы системы и поглядел показания ZFS:
z/win11  referenced            3.96G                  -
z/win11  compressratio         1.10x                  -
z/win11  volsize               120G                   local
z/win11  volblocksize          4K                     -
z/win11  compression           lz4                    local
z/win11  written               3.96G                  -
z/win11  logicalused           4.32G                  -

Настало время дать виртуалке сеть. Мне не нравится идея бриджевать виртуалки по умолчанию, я предпочитаю роутить гостевой трафик средствами хоста, а заодно фильтровать и делать NAT. Поэтому не стал раскомментировать настройки network0_*, а вместо этого добавил в конфиг виртуалки:
bhyve_options="-s 2,e1000,tap0"

То есть, посадил эмулируемую сетевую карту Intel на PCI-шину 2 с подключением к системному интерфейсу tap0, который создается через /etc/rc.conf:

cloned_interfaces="tap0"
ifconfig_tap0="inet 192.168.100.1/30 link0"
ifconfig_tap0_descr="Windows 11"


Флаг link0 запрещает отключать (down) сетевой интерфейс при гашении виртуалки, вместо этого у него просто будет статус no carrier.

Ещё полезно в конфиг виртуалки добавить graphics_res="1856x960", чтобы увеличить размер рабочего стола Windows до указанного размера с дефолтных 1024x768. Циферки подбирайте под себя, я выбрал такие, чтобы в VNC не было скроллинга и окно VNC вместе с декорациями влазило в разрешение FullHD.

dadv: (Default)

Довелось попробовать настроить IPSec в туннельном режиме под FreeBSD в «новом стиле», с созданием системного интерфейса ipsec0 со всеми причиндалами, включая MTU, чего раньше очень не хватало при настройке туннеля в «традиционном» стиле одними политиками IPSec, без туннельного интерфейса.

Удалённый пир нам не подконтролен (головная контора), требует согласования туннеля через IKEv2, не выдаёт дополнительных адресов на туннель.

Сначала поставил strongswan-5.8.2_1 из портов и настроил его через новомодный vici-интерфейс. Создал файл с произвольным именем и расширением .conf:

# cat /usr/local/etc/swanctl/conf.d/hq.conf
connections {
  hq {
    version             = 2
    pull                = no
    mobike              = no
    send_certreq        = no
    dpd_delay           = 5
    keyingtries         = 0

    local_addrs         = 1.1.1.1
    local_port          = 500
    remote_addrs        = 2.2.2.2
    remote_port         = 500

    proposals           = aes256-sha256-modp2048
    reauth_time         = 28800

    local {
      auth              = psk
      id                = 1.1.1.1
    }

    remote {
    }

    children {
      net-net {
        mode            = tunnel
        dpd_action      = restart
        ipcomp          = yes
        copy_df         = no
        start_action    = start
        stop_action     = start
        reqid           = 100
        # policies        = no

        local_ts        = 192.168.18.0/24
        remote_ts       = 10.0.0.0/8,192.168.21.0/24

        esp_proposals   = aes256-sha256-modp2048
      }
    }
  }
}

secrets {
  ike-hq {
    id-hq       = 1.1.1.1
    secret      = XXX
  }
}
#EOF

В этом виде после запуска strongswan согласует IPSec в туннельном режиме, но системный интерфейс ipsec0 не используется и strongswan сам инсталлирует в ядро и политики SPD, и маршруты до удалённых сетей в таблицу маршрутизации. Туннель, тем не менее, работает.

Чтобы теперь добавить в картинку p2p-интерфейс ipsec0, добавляем в /usr/local/etc/strongswan.d/charon.conf команду "install_routes = no" внутрь блока charon {}, так что strongswan перестаёт сам добавлять маршруты до сетей 10.0.0.0/8,192.168.21.0/24 через внешний интерфейс (WAN) и раскомментируем "policies = no" в hq.conf (см. выше), чтобы strongswan не добавлял SPD в ядро, их ядро само создаёт при использовании route-based IPSec-туннеля.

Остальные настройки в /etc/rc.conf по такому типу:

cloned_interfaces="ipsec0"
ifconfig_ipsec0="tunnel 1.1.1.1 2.2.2.2 reqid 100 mtu 1460 up"
static_routes="hq1 hq2"
route_hq1="10.0.0.0/8 -iface ipsec0"
route_hq2="192.168.21.0/24 -iface ipsec0"

strongswan_enable="YES"
strongswan_interface="vici"

Индекс 100 после слова reqid должен быть одинаковым в настройках одного и того же туннеля в rc.conf и в конфигурации strongswan, а если есть ещё туннели, то отличаться для разных туннелей.

Update: Добавил keyingtries = 0 (см. выше), так как оказалось, что без этого при запуске strongswan делает 5 переповторов при попытке подключиться к пиру и если он в это время недоступен, прекращает дальшейшие попытки. Нулевое значение заставляет его делать бесконечное число повторов (каждый с 5 переповторами). Кроме того, в /usr/local/etc/strongswan.d/charon.conf полезно прописать make_before_break = yes и retransmit_base = 1 - последнее для того, чтобы сильно ускорить восстановление туннеля после временных обрывов из-за перезагрузки пира или просто аварии по трассе до него.

Update 2: добавил close_action = start, без этого strongswan может бросить попытки восстановить работу туннеля при обрыве.

dadv: (chuck)

Отметил свой сороковой день рождения подарком $100 фонду FreeBSD через PayPal. Курс банка 63.29, что немного меньше прошлогоднего. URL прежний: https://www.freebsdfoundation.org/donate/ (биткойны принимают по-прежнему :-)

dadv: (chuck)

Довелось поэкспериментировать с компрессией и шифрованием данных на системном уровне в FreeBSD 9/i386. Шифрование делал через GELI, компрессию через ZFS. Обнаружил забавное. В моём случае контейнер для GELI расположен на медленной сетевой шаре (CIFS over 100Mbit/s & mtu=1500) и для уменьшения дополнительных тормозов от "read-modify-write" поигрался с размерами блоков.

И geli init позволяет задать "размер сектора" в создаваемом GEOM, и ZFS позволяет задать размер блока (recordsize). Оказалось, что даже при отлично сжимаемых данных и включенной компрессии ZFS реально ничего не жмет, если размер сектора и recordsize одинаково равны 4096: zfs get compressratio всегда показывает 1.00 и всё работает довольно медленно, упираясь в сеть.

При том же размере сектора в 4k увеличение recordsize до 8k позволяет ZFS достичь compressratio до 2.0 и операции на хорошо жмущихся данных заметно ускоряются. Если при recordsize=8k уменьшить размер сектора до 512 байт, то на тех же данных степень компрессии взлетает до 16.0 и скорость обработки хорошо жмущихся данных, соответственно, взлетает в разы. Например, показания benchmarks/bonnie, который оперирует как раз такими данными, хорошо демонстрируют эффект.

Маленький "размер сектора" контейнера GELI не слишком хорош по разным причинам: и относительные накладные расходы на собственно шифрование возрастают, и совсем мелкие обмены шифрованными данными по сети через CIFS генерируют относительно высокие накладные расходы в TCP. Поэтому "размер сектора" GELI-контейнера увеличил обратно до размера страницы памяти 4k и выставил ZFS recordsize в 8k - при этом на моих характерных данных коэффициент сжатия получается около 1.85.

Это лишь первая серия тестов и, может быть, в итоге - и для других наборов данных - параметры придется поменять.

dir="/mnt/cifs"
size="100g"
poolopts="-O recordsize=8k -O atime=off -O compression=gzip-9 -o failmode=continue"
truncate -s $size $dir/backend
md=$(mdconfig -af $dir/backend)
geli init -s 4096 /dev/$md
geli attach /dev/$md
zpool create $poolopts es /dev/$md.eli

dadv: (chuck)

Нарастил память у сервера, увеличив с 6G до 6+32=38G. Старый BIOS ругался на неподдерживаемые DIMM, но после обновления заработало всё, кроме одного 32-битного процесса.

Этот сервер работает под управлением FreeBSD 9.3-STABLE/amd64, но внутри себя, кроме всего прочего, крутит jail со спасенной со старой работы системой FreeBSD 4.11, в которой крутится фидонода 2:5006/1 с NNTP-гейтом и innd. И вот нормально работавший при 6G физической памяти innd после расширения стал падать при старте с руганью в лог news.err:

innd: SERVER cant malloc 909626760 bytes at line 146 of chan.c: Cannot allocate memory

Дело в том, что по умолчанию в FreeBSD9/amd64 предел datasize для 32-битных процессов составляет 512M (для 64-битных - 32G), а в innd, очевидно, слишком жадная автонастройка. Поднял системный предел для 32-битных процессов до 2G через sysctl compat.ia32.maxdsiz=2147483648 и проблема ушла.

dadv: (chuck)

Открыл для себя, что named читает ключ rndc.key (нужен, в частности, чтобы работала команда rndc) только из каталога, заданного при компиляции пакета и не имеет опции командной строки для переопределения пути к ключу.

Например, пакет bind910 для FreeBSD 10 нынче собирается с путем конфигурационных файлов /usr/local/etc/namedb и это неудобно, если хочется запускать named в chroot, где иерархия /usr/local вообще не нужна. Средствами /etc/rc.conf можно переопределить путь к named.conf внутри chroot, но нельзя к rndc.conf. Можно это сделать настройками самого named.conf, хотя и неочевидным образом. Перед стандартной секцией options добавляем команды:


include "/etc/namedb/rndc.key";
controls { inet 127.0.0.1 port 953 allow { any; } keys { rndc-key; }; };


Первая команда подключает rndc.key по указанному пути, а вторая команда отменяет поиск его по вкомпилированному пути, включая использование только что подключенного ключа для rndc.

В итоге для того, чтобы установленный из портов/пакетов named в FreeBSD 10 работал в chroot так же, как до этого он работал в составе базовой системы FreeBSD 9 и ранее, в /etc/rc.conf остаётся прописать:

named_enable="YES"
named_conf="/etc/namedb/named.conf"
named_chrootdir="/var/named"
named_symlink_enable="YES"

dadv: (chuck)
В этом году пожертвования можно делать ещё и в биткойнах :-)
Но чего нет, того нет, так что $100 через PayPal ушло традиционно с рублевого счета с конвертацией по банковскому курсу 66.11

Адрес странички всё тот же: https://www.freebsdfoundation.org/donate

Profile

dadv: (Default)
Choose your future

July 2024

M T W T F S S
12 34567
891011121314
15161718192021
22232425262728
293031    

Syndicate

RSS Atom

Tags

Style Credit

Powered by Dreamwidth Studios