FireJail - это система изоляции в Linux. Обычно она применяется для того, чтобы безопасно запускать программы (бинарники) от недоверенного производителя, жестко ограничив доступные ресурсы операционки.
Как говорят авторы, FireJail - утилита для создания песочницы произвольных приложений. Она использует встроенные механизмы ядра для изоляции процессов и контроля системных вызовов. Утилита может:
- Изолировать сеть
- Изолировать звук
- Изолировать графику
- Ограничивать доступ к файловой системе по заданным правилам
- Создавать приватный самоуничтожающийся домашний каталог
- Ограничивать процессорное время и доступ к ядрам
- и другое
Таким образом, FireJail можно использовать для разных вещей. Например, можно организовать отладку какого-нибудь сетевого ПО, для которого надо запустить несколько различных серверов, клиентов, агентов, нод и их копий на машине разработчика. И сделать это можно без использования тажеловесной виртуализации. Идея в том, что для каждого инстанса (экземпляра) программы, через FireJail создается среда, в которой создан специально настроенный сетевой интерфейс со своим IP и подсетью. А чтобы эти экземпляры видели друг друга в пределах одного компьютера, на нем создается интерфейс-мост, и настраивается соответствующая маршрутизация через iptables.
В этой статье рассказывается, как это можно сделать.
* * *
На AstraLinux SE 1.6, AstraLinux SE 1.7 и AstraLinux SE 1.8 утилита FireJail установлена по умолчанию. Проверить наличие можно вызовом:
sudo firejail --version
Если запускаемая в изоляции программа имеет графический интерфейс, то нужна специальная настройка. Для вывода графики X11 требуется однократно после загрузки основной (хостовой) системы выполнить команду:
sudo xhost +local:root
В общем виде запуск программы из каталога программы выглядит так:
sudo firejail --noprofile ./runOurProgram.sh
То есть, программа как-бы запускается из-под FireJail.
Для запуска программы в другой подсети команда запуска использует дополнительные опции:
sudo firejail --noprofile --net=eth0 --ip=192.168.0.x ./runOurProgram.sh
Это пример того, как создать инстанс в текущей сети, в которой находится хостовый компьютер. В этой команде eth0 - существующий сетевой адаптер основной системы а 192.168.0.x - желаемый IP-адрес сети (текущая сеть - 192.168.0.0/24).
Непонятно почему, но данный инстанс не будет доступен по сети с локального компьютера. Видимо, это влияние системы изоляции. Надо разбираться дальше.
Для решения этой проблемы надо однократно после загрузки системы выполнить скрипт создания моста на создаваемом для этой цели интерфейсе br0:
#!/bin/bash
#
# Routed network configuration script
#
# bridge setup
brctl addbr br0
ifconfig br0 10.10.20.1/24 up
# enable ipv4 forwarding
echo "1" > /proc/sys/net/ipv4/ip_forward
# netfilter cleanup
iptables --flush
iptables -t nat -F
iptables -X
iptables -Z
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
# netfilter network address translation
iptables -t nat -A POSTROUTING -o eth0 -s 10.10.20.0/24 -j MASQUERADE
Далее вызов экземпляра программы в подсети 10.10.20.0/24 с IP 10.10.20.1 с использованием моста br0 происходит через команду:
sudo firejail --noprofile --net=br0 --ip=10.10.20.1 ./runOurProgram.sh
где br0 - сетевой адаптер моста а 10.10.20.1 - желаемый IP-адрес сети.