Ограничить количество одновременных подключений в iptables

Дата: 26.04.2017Метки:

Допустим у вас есть обычный VPS, где крутится популярный среди группы людей сайт и вы хотите защитить его от примитивных атак недоброжелателей. Основная задача которых состоит в том, что бы вызвать исчерпание вычислительных ресурсов VPS с помощью искусственно спровоцированной нагрузки на сервер. В следствие которой, память уйдет в swap и подключится к серверу станет проблематично.

В таком случае для ограничения потребления ресурсов сервера наиболее эффективно использовать cgroups — механизм ядра, который ограничивает вычислительные ресурсы для групп процессов. Используя cgroups мы можем предотвратить полную утилизацию вычислительных ресурсов процессора и памяти сервера, которые могут вызваны нагрузкой на веб-сервер и PHP. Таким образом мы всегда можем сохранить контроль над сервером и обеспечить доступ к серверу по SSH.

О использовании cgroups я постараюсь рассказать позже. Но даже если правильно настроить cgroups, в случае всплеска нагрузки, работа сайта будет нарушена. Как вариант решения проблемы предлагаю с помощью iptables ограничить количество одновременных подключений к серверу. Таким образом можно попытаться отсечь основной источник нагрузки, сохранив доступность ресурса для других посетителей.

Ситуацию я привел в качестве примера, но думаю, что ее можно адаптировать для других задач. Теперь переходим непосредственно к примеру, для начала добавьте следующие правила в iptables:

iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -I INPUT -p tcp --dport 80 -m state --state RELATED,ESTABLISHED -j ACCEPT

Здесь мы разрешаем все входящие соединения на порт 80 нашего сервера. Чтобы ограничить количество одновременных подключений к серверу с одного ip-адреса, необходимо добавить следующие правила:

iptables -t filter -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 --connlimit-mask 32 -j DROP

Это правило устанавливает ограничение на 30 одновременных подключений с одного ip-адреса.

Если вам необходимо ограничить количество одновременных подключений со всех ip, тогда необходимо использовать следующую команду:

iptables -t filter -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 500 -j DROP

VirtualBox: cannot register the hard disk

Случается, что необходимо перенести файл образа виртуального диска в другое расположение в пределах одного локального компьютера. Если переместить файл образа VirtualBox и попытаться снова подключить его к виртуальной машине, вы получите следующую ошибку:

Не удалось открыть файл виртуального жёсткого диска /home/disck.vdi
Cannot register the hard disk '/home/disck.vdi' with UUID {UUID} because a hard disk '/home/old.vdi' with UUID {UUID} already exists.

В отличии от VMware в VirtualBox процесс переноса образа диска немного отличается. Для решения проблемы открываем VirtuaBox — меню File — Virtual Media Manager и удаляем перемещенный образ из реестра. Затем переходим в настройки виртуальном машины, в меню Storage снова подключаем образ виртуального диска.

Установка Deluge в Ubuntu Gnome

Из множества BitTorrent-клиентов мне больше всего приглянулся Deluge. Программа состоит из двух независимых компонентов: демона и клиента. Их можно установит сразу на один компьютер, в таком случае Deluge будет работать как большинство обычных BitTorrent-клиентов. Или если у вас NAS, можно установить демон отдельно на сервер, а клиент Deluge на домашний компьютер. После чего удаленно управлять загрузками.

В плане оформления Deluge имеет простой и лаконичный GUI, который использует библиотеку GTK+, а значит не будет выделятся на фоне общего оформления Gnome. За обмен данными по протоколу BitTorrent отвечает библиотека libtorrent, которая поддерживает большинство функций протокола.

По сути нет ничего сложного в установке Deluge в Ubuntu Gnome, но есть некоторые нюансы, которые можно забыть со временем.

Для начала устанавливаем демон и клиент Deluge:

sudo apt-get install deluged
sudo apt-get install deluge

Далее настроим автозапуск Deluge, для этого идем в Gnome Tweak Tool — Startup Applications — жмем ‘+’ и выбираем из списка Deluge. Теперь каждый раз при входе в систему Deluge будет запускаться автоматически.

Было бы удобно, если бы при автозапуске и закрытии программа сворачивалась в трей: открываем Deluge — Edit — Preferences — Interface — и ставим галочки напротив Enable system icon tray, Minimize to tray on close, Start in tray.

И напоследок хочу отметить, что лично мне не нравится расположение и вид трея в Gnome. Я предпочитаю перенести его в верхнюю часть экрана. Установим дополнение TopIcons из каталога дополнений Gnome. Переходим в Gnome Tweak Tool — Extension и включаем дополнение TopIcons. На этом установка и настройка Deluge в Ubuntu Gnome закончена.

Переключение раскладки GNOME

В отличии от Fedora в процессе установки Ubuntu GNOME нельзя выбрать сочетания клавиш для переключения раскладки клавиатуры. Установил я систему, но Alt-Shift ни Ctrl-Shift тут не работают. По умолчанию для переключения раскладки используются Super + Space. Стандартным способом изменить раскладку можно через Settings — Keyboard — Typing — Switch to next input source.

Вот только назначить Ctrl-Shift тут нельзя, возможность выбора сочетаний ограничена до невозможности. Что подтолкнуло разработчиков к такому решению остается только догадываться. Я уж думал плюнуть на это дело и забыть. Но как оказалось, я не тот человек, который быстро меняет свои привычки. Как не пытался, а рука сама нажимает привычные мне клавиши.

Случайно в процессе работы наткнулся на необходимые мне настройки. Изменить переключения раскладки клавиатуры на привычные сочетания можно через Gnome Tweak Tool переходим в Typing — Switch to another layout. Выбираем привычные Alt-Shift или Ctrl-Shift и продолжаем радоваться жизни.

Установка Chrome и Chromium в Ubuntu

Многие уже слышали про прекращение дальнейшей разработки Unity в Ubuntu. Это решение было настолько неожиданно, что многие приняли эту новость за очередную утку. Теперь по умолчанию место Unity в Ubuntu будет занимать Gnome 3. Лично для меня это отличный повод перейти на Ubuntu, а вместе с тем я начинаю цикл записей о том как довести ее до рабочего состояния.

И так сегодня я установил на свой домашний компьютер последнюю версию Ubuntu GNOME 17.04 (Zesty Zapus). Первые впечатления сложились положительные. Система ведет себя достаточно стабильно. И первое, что я сделаю на новой системе выполню установку Chrome. Дополнительно в этой записи я расскажу об установке Chromium. Какой из браузеров устанавливать зависит от ваших личных предпочтений.

Установить Google Chromium в Ubuntu

Начну я пожалуй с установки Chromium в Ubuntu. Если я не ошибаюсь, Chromium полностью соответствует версии браузера после установки пакета google-chrome-unstable. Для установки Chromium в Ubuntu достаточно просто выполнить команду:

sudo apt-get install chromium-browser

В Gnome после установки Chromium по аналогии с Firefox отображается заголовок окна. Не смотря на то, что он добавлен для соответствия концепции интерфейса Gnome, я предпочитаю его отключить. Для этого в настройках Chromium нужно убрать галочку возле опции Use system title bar and borders.

Установить Flash для Chromium в Ubuntu

Если на этапе установки Ubuntu вы выбрали установку программного обеспечения от сторонних производителей, то дополнительно устанавливать Flash не потребуется. В противном случае необходимо включить дополнительный репозиторий. Я использую английскую локализацию поэтому описание приложений и элементов меню будет на английском.

Что бы установить Flash для Chromium в Ubuntu включаем репозиторий Canonical partners. Для этого переходим в Software and Updates — Other Software — установить галочку напротив Canonical partners.

Далее в терминале выполнить:

sudo apt update
sudo apt install adobe-flashplugin

Проверить поддержку HTML5, H.264 и Flash можно на странице youtube.com.

Установить Chrome в Ubuntu

Чтобы установить браузер Chrome из репозитория, откройте терминал и выполните следующие команды:

wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -

Если у вас установлена Ubuntu 64-Bit:

sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'

Или для Ubuntu 32-Bit:

sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'

Обновляем локальный кэш пакетов и запускаем установку:

sudo apt-get update
sudo apt-get install google-chrome-stable

Для установки бета или нестабильно версии браузера выполним в терминале одну из команд:

sudo apt-get install google-chrome-beta
sudo apt-get install google-chrome-unstable

Не удалось запустить службу Microsoft Office Software Protection Platform

Было выполнено некорректное прерывание установки Microsoft Office 2010, после чего повторная установка заканчивалась следующей ошибкой:

Ошибка 1920. Не удалось запустить службу Office Software Protection Platform (oppsvc)

Перепробовал множество советов, но проблему удалось решить только следующий образом. Для начала необходимо удалить каталог и все его содержимое:

C:\Program Files\Common Files\Microsoft Shared\OfficeSoftwareProtectionPlatform

Запускаем редактор реестра, и переходим в раздел:

HKEY_CLASSES_ROOT\AppID

Необходимо дать полные права на раздел AppID для пользователя NETWORK SERVICE.

Запускаем повторно установку Microsoft Office 2010, ждем когда появится ошибка:

Ошибка 1920. Не удалось запустить службу Office Software Protection Platform

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

C:\Program Files\Common Files\Microsoft Shared\

И устанавливаем для пользователя NETWORK SERVICE полные права на каталог OfficeSoftwareProtectionPlatform.

Для этого в меню Свойства — переходим во вкладку Безопасность — Дополнительно — Добавить — необходимо указать им пользователя NETWORK SERVICE и нажать кнопку ОК — затем поставить галочку Заменить разрешения для дочерних всех объектов заданными здесь разрешениями, применимыми к дочерним объектам.

Теперь заходим переходим в панель управления, службы. Необходимо в ручную запустить службу Office Software Protection Platform. Если в процессе не было ошибок, значит вы все сделали правильно. Далее переходим к установке Microsoft Office 2010 и жмем кнопку Повторить.

Оптимизация Windows в виртуальной среде

Дата: 12.04.2017Метки:

В этой заметке речь пойдет о вопросе оптимизации Windows под условия работы в виртуальной среде. Начнем с того, что многие работающие по умолчанию функции и компоненты Windows в условиях виртуализации абсолютно бесполезны и несут только дополнительную нагрузку. Сами по себе они достаточно скромно используют ресурсы. Если отключить их на одном физическом сервере, то кроме незначительной экономии оперативной памяти вы не почувствуете существенных изменений.

Есть такая поговорка: «Курочка по зернышку клюет». Теперь давайте представим ситуацию, когда под нашим гипервизором одновременно крутится несколько десятков, в идеале больше сотни виртуальных машин. После оптимизации каждой виртуальной машины с Windows, в глобальном масштабе мы получим существенную экономию вычеслительных ресурсов гипервизора.

Следует отметить, что такая оптимизация будет полезна и для отдельно взятой виртуальной машины. Естественно после оптимизации Windows производительность так и останется в рамках выделенных ей ресурсов. Но зато система становится более отзывчивая за счет за счет уменьшения количества фоновых операций, которые могли приводить к снижению скорости работы.

Для оптимизации Windows в виртуальной среде я предлагаю использовать специально предназначенную для этого утилиту — VMware OS Optimization Tool. Бесплатно скачать программу можно по следующей ссылке. Изначально утилита разрабатывалась для оптимизации настольных ОС под работу в среде VMware Horizon View. Но ее можно использовать для виртуальных машин с Windows, которые работают на любом другом гипервизоре.

На данный момент VMware OS Optimization Tool поддерживает операционные системы Windows 7-10 и Windows Server 2008-2016. По умолчанию программа автоматически выполнит оптимизацию на основе встроенного шаблона. Я использовал настройки по умолчанию, но вы можете самостоятельно выбрать необходимые для вас опции. Для оптимизации виртуальной машины с Windows рекомендую использовать стандартный шаблон VMware.

Для создания собственного шаблона откройте раздел My Templates, выберите шаблон, который вы желаете взять за основу и нажмите Copy and Edit.

Пользовательские шаблоны автоматически сохраняются в директорию:

%ProgramData%\VMware\OSOT\My Templates

Если возникнут нежелательные последствия, все изменения можно быстро откатить до предыдущего состояния. Для этого перейдите на вкладку History и нажмите кнопку Rollback.

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

И напоследок хочу сказать про результаты оптимизации. На виртуальной машине с Windows 10 снизилось потребление оперативно памяти примерно на 200mb. После загрузки Windows уменьшилось количество фоновых процессов с высоким потреблением ресурсов процессора, значительно снизилась дисковая активность.

Зомби процессы в Linux

Дата: 10.04.2017Метки:

Если в вашей системе завелись зомби процессы, не расстраивайтесь. Не смотря на страшное название зомби процесс не может нанести серьезный вред вашей системе. Для начала давайте разберемся как обычный процесс превращается в зомби.

Когда дочерний процесс получает команду на завершение, он освобождает все используемые ресурсы и продолжает как зомби существовать в системе с ранее присвоенным ему PID. Далее с помощью сигнала SIGCHLD система уведомляет родительский процесс о завершении зомби процесса. Если по какой-либо причине родительский процесс игнорирует этот сигнал, то зомби процесс так и продолжает отображаться в системе.

Как вы уже поняли, зомби процессы не используют системные ресурсы, поэтому их можно просто игнорировать. Убить зомби процесс на прямую командой kill у вас не получиться. В данном случае единственный вариант полностью убрать зомби процесс — убить или перезапустить его родительский процесс.

Что бы убить зомби процесс, для начала нужно получить его PID:

# ps aux | grep -w Z
root      2037  0.0  0.0      0     0 ?        Z    09:44   0:00 [httpd] 
root      8470  0.0  0.0 112652   984 pts/10   S+   10:43   0:00 grep --color=auto -w Z

В моем примере PID зомби процесса 2037. Теперь получим PID родительского процесса:

# ps o ppid 2037
 PPID
 2033

Когда мы знаем PID, правильнее всего определить что это за процесс командой top, а затем перезапустить его.

В крайнем случае можно убить родительский процесс:

# kill -9 2033

Добавить сервис в systemd

В этой заметке я расскажу о том, как настроить сервис Linux для автоматического запуска демона после сбоя или перезагрузки. В качестве примера я буду использовать Nginx и PHP но вы можете этот способ для любых приложений.

Уже прошло достаточно много времени с того момента, как большинство популярных дистрибутивов Linux перешли на системный менеджер systemd. Тем не менее, до сих пор старая система инициализации SysV продолжает параллельно функционировать на ряду с systemd. И как и раньше, большинство пакетов после установки добавляют стартовый скрипт в каталог init.d.

Не буду вдаваться в подробности про механизмы параллелизации systemd и скорость загрузку системы. Это все хорошо и прекрасно. Но для меня главный аргумент в ползу перехода на systemd — это наличие встроенных функций отслеживания и контроля состояния сервисов. Что бы было понятнее, давайте представим следующую ситуацию.

Для примера мы установили OpenVPN, для которого по умолчанию используется механизм запуска System V. Во время установки пакета в каталог /etc/init.d будет скопирован скрипт инициализации, который будет отвечать за автоматический запуск приложения после перезагрузки. Если в один прекрасный день OpenVPN упадет, без дополнительных настроек, нужно будет каждый раз запускать этот процесс вручную.

Теперь возьмем ситуацию, когда для запуск сервиса выполнен через systemd. Если произойдет крэш или даже если вы захотите специально убить процесс, то systemd автоматически это обнаружит и повторно запустит процесс. При этом systemd обратно совместим с командами System V и сценариями инициализации.

А теперь давайте рассмотрим, как быстро добавить сервис в systemd. Демон systemd запускает сервисы описанные в его конфигурации. Конфигурация состоит из файлов, которые называют юнитами. Для юнитов созданных вручную используется каталог:

/etc/systemd/system/

В простом варианте юнит состоит из трех секции: [Unit], [Service], [Install].

Секция [Unit]

Описание юнита:

Description=MyUnit

Далее указываем порядок загрузки, после какого сервиса systemd запустить наш юнит:

After=syslog.target
After=network.target

Секция [Service]

Задаем тип сервиса:

Type=simple

Используется по умолчанию. Служба будет запущена незамедлительно. Процесс при этом не должен разветвляться. Не используйте этот тип, если другие службы зависят от очередности при запуске данной службы.

Type=forking

Указывают если служба запускается однократно и процесс разветвляется с завершением родительского процесса.

Расположение pid-файла:

PIDFile=/run/service.pid

Рабочий каталог приложения:

WorkingDirectory=/usr/local/service

Пользователь и группа, под которым будет запускаться сервис:

User=unit
Group=unit

Задаем приоритет убийства процесса при нехватке памяти:

OOMScoreAdjust=-100

Минимальное значение -1000 — полный запрет.

Команды запуска, остановки и перезапуска сервиса:

ExecStart=/usr/sbin/service
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID

Таймаут запуска или остановки сервиса:

TimeoutSec=300

Контроль запуска сервиса и автоматический запуск в случае крєша:

Restart=always

Секция [Install]

Уровень запуска сервиса:

WantedBy=multi-user.target

В итоге мы получили следующий юнит:

[Unit]
Description=MyUnit
After=syslog.target
After=network.target

[Service]
Type=forking
PIDFile=/run/service.pid
WorkingDirectory=/usr/local/service
User=munit
Group=unit
OOMScoreAdjust=-100

ExecStart=/usr/sbin/service
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
TimeoutSec=300

[Install]
WantedBy=multi-user.target

Добавляем юнит в каталог:

nano /etc/systemd/system/unit_name

Включаем, запускаем и смотрим статус юнита:

systemctl enable unit_name
systemctl start unit_name
systemctl -l status unit_name

А теперь привожу примеры работающих юнитов.

Юнит systemd для запуска Nginx:

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Юнит systemd для запуска php-fpm:

[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target

[Service]
Type=simple
PIDFile=/usr/local/php-fpm/var/run/php-fpm.pid
ExecStart=/usr/local/php-fpm/sbin/php-fpm --nodaemonize --fpm-config /usr/local$
ExecReload=/bin/kill -USR2 $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

chroot: failed to run command /bin/zsh

Дата: 04.02.2017

Для авторизации по ssh привык использовать ключи. И вот в один прекрасный день пришлось сбросить пароль root. Доступа по ssh к серверу не было, а под рукой был только загрузочный образ SystemRescueCd. После команды монтирования получил следующую ошибку:

chroot /mnt
chroot: failed to run command '/bin/zsh'  no such file or directory

В данном случае проблема связана с тем, что chroot пытается использовать zch качестве командной оболочки. На установленной у меня системе zch не используется. Поэтому необходимо указать расположение bash. Для решения проблемы достаточно просто выполнить:

chroot /mnt /bin/bash