Установка Calculate в Debian LXC

Обновлено 7 марта 2019

Введение

Далеко не каждый хостинг-провайдер, предоставляющий услуги размещения VPS/VDS-серверов, позволяет установить свой дистрибутив из ISO-образа, дав возможность на выбор установить одну из самых распространённых систем. Несмотря на это, у вас всегда остаётся возможность работать с Calculate Linux в контейнере. У подобного решения целый ряд плюсов, вот только основные из них:

  • Ваша система не привязана к провайдеру и может быть легко перенесена;
  • Вы можете поднимать неограниченное количество контейнейров с Calculate Linux для решения разного рода задач.

Для примера приведены настройки хост-системы под управлением Debian 9.

Настройка сетевого моста

Установите необходимые программы:

apt-get install bridge-utils

Выполните настройку сетевого моста, дописав в конец файла:

/etc/network/interfaces

auto br0
iface br0 inet static
bridge_ports none
bridge_fd 0
address 192.168.0.1
netmask 255.255.255.0

Перезапустите сеть:

systemctl restart networking

Убедитесь, что заработал сетевой интерфейс br0:

ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.1  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::418:f4ff:fe48:10e9  prefixlen 64  scopeid 0x20<link>
        ether 06:18:f4:48:10:e9  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5  bytes 438 (438.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Установка контейнера с Calculate Linux

Выполните установку необходимых программ. Для распаковки образа системы нам понадобится пакет app-arch/xz-utils:

apt-get install lxc xz-utils

Установите свежую версию дистрибутива Calculate Container Scratch. В качестве имени контейнера используется calculate. Программа попросит ввести номер версии дистрибутива из списка доступных 17.12.2:

lxc-create -n calculate -t download -- --server mirror.calculate-linux.org --no-validate -d CCS --arch x86_64
Downloading the image index
WARNING: Running without gpg validation!
---
DIST    RELEASE ARCH    VARIANT BUILD
---
CCS 17.12.2 x86_64  default 20180221
---

Release: 17.12.2

Downloading the image index
Downloading the rootfs
Downloading the metadata
The image cache is now ready
Unpacking the rootfs

---
You just created a Gentoo container (release=17.12.2, arch=amd64, variant=default)

To enable sshd, run: rc-update add sshd

For security reason, container images ship without user accounts
and without a root password.

Use lxc-attach or chroot directly into the rootfs to set a root password
or create user accounts.

Отредактируйте настройки контейнера:

/var/lib/lxc/calculate/config

# Network configuration
lxc.network.type = veth
lxc.network.flags = up
lxc.network.name = eth0
lxc.network.link = br0
lxc.network.ipv4.address = 192.168.0.2/24
lxc.network.ipv4.gateway = 192.168.0.1
lxc.start.auto = 1

Запустите контейнер и добавьте службу в автозагрузку:

systemctl start lxc

systemctl enable lxc
Synchronizing state of lxc.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable lxc

Чтобы убедиться, что контейнер поднят, выполните:

lxc-info -n calculate
Name:           calculate
State:          RUNNING
PID:            20111
IP:             192.168.0.2
CPU use:        8.16 seconds
BlkIO use:      50.00 MiB
Memory use:     58.30 MiB
KMem use:       6.67 MiB
Link:           veth0
 TX bytes:      858 bytes
 RX bytes:      438 bytes
 Total bytes:   1.27 KiB

Настройка Calculate Linux

Подключитесь к системе в контейнере и выполните базовые настройки: установите пароль root, поднимите службу sshd и выполните локализацию системы:

lxc-attach -n calculate

passwd

/etc/init.d/sshd start

rc-update add sshd default

cl-setup-locale -l ru_RU

exit

Настройка межсетевого экрана

Настройку файрвола и маршрутизации будем выполнять при помощи Shorewall. Установите эту программу:

apt-get install shorewall

Перенесём шаблоны настроек:

cp /usr/share/shorewall/configfiles/{interfaces,policy,rules,snat,zones} /etc/shorewall/

Измените основные настройки Shorewall, разрешив пробрасывать пакеты:

/etc/shorewall/shorewall.conf

IP_FORWARDING=On

Нам понадобится узнать имя сетевого интерфейса для использования в настройках. Для этого выполните:

ifconfig

...
ens3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

Важно

В последующих настройках указан сетевой интерфейс ens3. Используйте своё значение!

/etc/shorewall/conf.d/zones

#ZONE       TYPE
fw          firewall
loc         ipv4
net         ipv4

Привяжите сетевые интерфейсы к зонам, добавив настройки фильтрации:

/etc/shorewall/conf.d/interfaces

?FORMAT 2
#ZONE       INTERFACE       OPTIONS
net         ens3            tcpflags,nosmurfs,routefilter
loc         br0             tcpflags,nosmurfs,routefilter,routeback

Настройте трансляцию сетевых адресов (маскарадинг) для доступа к интернету из контейнера:

Важно

Адрес 12.34.56.78 замените на свой внешний IP.

/etc/shorewall/conf.d/snat

#ACTION             SOURCE              DEST
SNAT(12.34.56.78)   192.168.0.0/24      ens3

Настройте политику взаимодействия между зонами: разрешены соединения внутри локальной зоны, запрещены все входящие соединения из интернета:

/etc/shorewall/conf.d/policy

#SOURCE     DEST        POLICY      LOGLEVEL
fw          all         ACCEPT
loc         all         ACCEPT
net         all         DROP
all         all         REJECT      INFO

Настройте правила доступа к хост-системе, разрешив ping и ssh, и правило проброса по 222 порту к ssh контейнера:

/etc/shorewall/conf.d/rules

?SECTION NEW
#ACTION             SOURCE          DEST                    PROTO       DPORT
Ping(ACCEPT)        all             $FW
SSH(ACCEPT)         net             $FW
DNAT                net             loc:192.168.0.2:22      tcp         222

Запустите(@debian) Shorewall:

shorewall start

Для проверки соединения попробуйте зайти в контейнер по ssh, используя порт 222:

ssh -p 222 server.example.org

где server.example.org - адрес сервера.

Если всё работает, добавьте Shorewall в автозагрузку:

systemctl enable shorewall
Synchronizing state of shorewall.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable shorewall