Linux IPTables: ограничить количество HTTP запросов с одного IP в минуту

Недавно возникла необходимость в Linux средствами IPTables firewall ограничить количество запросов с одного IP в минуту так как веб вервер жестко атаковали несколько дней подряд. Выручило правило:

-A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset

Добавил его над правилом, которое разрешает 80-й порт.
Сохранил файл /etc/sysconfig/iptables

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

# /sbin/service iptables restart

После чего ситуация на сервере нормализовалась.

Linux chkconfig и service: управление автозапуском и состоянием сервисов

В Red Hat подобных Linux системах типа Red Hat Entrprise, CentOS, Fedora (до версии 15) и им подобных для управления сервисами используется команда /sbin/chkconfig.

Для того, чтобы посмотреть состояние сервиса nfs служит команда:

# /sbin/chkconfig --list nfs
nfs             0:off   1:off   2:off   3:off   4:off   5:off   6:off

Чтобы включить сервис nfs выполним команду:

# /sbin/chkconfig nfs on

Проверим состояние сервиса nfs командой:

# /sbin/chkconfig --list nfs
nfs             0:off   1:off   2:on    3:on    4:on    5:on    6:off

Выключить сервис nfs из автозагрузки можно командой:

# /sbin/chkconfig nfs off

Для того, чтобы еще раз проверить состояние сервиса nfs выполним:

# /sbin/chkconfig --list nfs
nfs             0:off   1:off   2:off   3:off   4:off   5:off   6:off
#

Чтобы посмотреть состояние автозагрузки всех сервисов в системе:

# /sbin/chkconfig --list |more

Все доступные опции команды можно посмотреть выполнив:

# /sbin/chkconfig --help

Так же смотрите вывод команды:

# /sbin/service nfs
Usage: nfs {start|stop|status|restart|reload|force-reload|condrestart|try-restart|condstop}

для управления состоянием сервиса.

Чаще всего используются опции:
start — запустить;
status — проверить текущее состояние;
restart — перезапустить;
reload — применить новую конфигурацию без перезапуска.

Linux bash: удалить последний символ со значения переменной

Недавно возникла задача в Linux bash скрипте удалить последний символ со значения переменной.
Это можно сделать так:

#!/bin/bash

str1="foo bar"
echo "String1: ${str1}"

str2="${str1%?}"
echo "String2: ${str2}"

Linux OpenSSL: сгенерировать самоподписной SSL сертификат и конфигурация веб сервера Apache

Не так давно, я писал о том, как можно создать csr и ключ для получения SSL сертификата.
Сегодня, мы сгенерируем самоподписной (self-signed) SSL сертификат.
Для этого, выполним команду:

# openssl x509 -req -days 365 -in www.shkodenko.com.csr -signkey www.shkodenko.com.key -out www.shkodenko.com.crt
Signature ok
subject=/C=UA/ST=Kievskaya/L=Kiev/O=Shkodenko/CN=www.shkodenko.com/emailAddress=webmaster@shkodenko.com
Getting Private key

Настроим веб сервер Apache для того, чтобы он работал с сертификатом.
Добавим конфигурацию для вирутал хоста:

<IfModule mod_ssl.c>

<VirtualHost 127.0.0.1:443>

ServerName shkodenko.com
ServerAlias www.shkodenko.com
DocumentRoot /home/shkodenko/public_html
ServerAdmin webmaster@shkodenko.com
UseCanonicalName Off
SSLEngine on
SSLVerifyClient none
SSLCertificateFile /etc/ssl/certs/shkodenko.com.crt
SSLCertificateKeyFile /etc/ssl/certs/shkodenko.com.key
CustomLog /usr/local/apache/domlogs/shkodenko.com-ssl_log combined
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown

<Directory>
SSLOptions +StdEnvVars
</Directory>

</VirtualHost>

</IfModule>

Проверим синтаксис командой:

# /usr/local/apache/bin/apachectl -t

или

# /sbin/service httpd configtest

в зависимости от версии Apache

Перезапустим веб сервер Apache c помощью команды:

# /usr/local/apache/bin/apachectl -k restart

или

# /sbin/service httpd restart

Linux whereis, find и locate как можно найти нужную программу

Когда нужно найти нужную программу чаще всего использую команду whereis, например так:

# whereis ls
ls: /bin/ls /usr/share/man/man1p/ls.1p.gz /usr/share/man/man1/ls.1.gz

Есть еще варианты:

# find / -type f -name "ls"
и
# locate ls

но они работают дольше. locate выводит все имена файлов, в имени пути файла или папки которых встретилось ls. Без просеивания с помощью grep или команды пейджера more или less читать вывод такой команды очень трудно.

Linux tail: вывести последнюю часть файла

При работе с Linux очень полезная утилита tail, которая позволяет вывести последнюю часть (хвост) файла.
Причем щаче всего я использую ее опциями -n и -f. Например, так:

# tail -n 55 -f /var/log/messages

Что позволяет просмотреть последние 55 строк файла /var/log/messages, а так же автоматически выводить новые стоки, которые появляются в файле (отслеживать изменения).
Так же можно использовать дополнительную утилиту пейджер more, если нужно просмотреть много строк, например так:

# tail -n 255 -f /var/log/messages |more

Можно фильтровать вывод лога, чтобы получить информацию только про интересующий нас сервис named так:

# tail -n 55 -f /var/log/messages |grep "named"

Linux useradd passwd: создание учетных записей с доступом в определенную папку

Иногда, необходимо создать дополнительный FTP аккаунт с возможностью доступа в определенную подпапку.
Это можно сделать командами:

# useradd -d /home/taras/public_html -g taras -o -s /bin/false -u 10001 ftp_taras_web
# passwd ftp_taras_web

Параметры команды useradd из man страницы useradd:
-d, —home HOME_DIR
The new user will be created using HOME_DIR as the value for the user’s login directory. The default is to append the LOGIN name to BASE_DIR and use that as the login directory
name. The directory HOME_DIR does not have to exist but will not be created if it is missing.

-g, —gid GROUP
The group name or number of the user’s initial login group. The group name must exist. A group number must refer to an already existing group. /etc/default/useradd.

-o, —non-unique
Allow the creation of a user account with a duplicate (non-unique) UID.

-s, —shell SHELL
The name of the user’s login shell. The default is to leave this field blank, which causes the system to select the default login shell.

-u, —uid UID
The numerical value of the user’s ID. This value must be unique, unless the -o option is used. The value must be non-negative. The default is to use ID value equal to or
greater than UID_MIN and smaller then UID_MAX. Values between 0 and UID_MIN are typically reserved for system accounts.

Можно использовать мой генератор паролей, чтобы получить хороший сложный пароль.

Данные о пользователе можно получить командами id и finger:

# id taras
uid=1001(taras) gid=1001(taras) groups=1001(taras)

# finger taras
Login: taras Name:
Directory: /home/taras Shell: /bin/bash
Last login Wed Dec 26 13:48 (EET) on pts/4 from 192.168.2.1
No mail.
No Plan.

Linux screen: несколько сессий терминала в одном окне

Какое-то время назад, я уже писал об screen в другом своем блоге: Установка и работа со screen (скринами) в Unix-подобных системах (FreeBSD, Linux и др.)

Что касается специфики установки в RPM-based Linux дистрибутивах: Fedora, CentOS, Red Hat Enterprise и других, то проще всего поставить скрины с помощью пакетного менеджера yum:

# yum install screen

Команды для работы со screen (скринами):
— начинаем работу с создания скрина: # screen -a
— создание окон screen_name: # screen -t screen_name
— создание нового окна: [ Ctrl + a + c ]
— удаление окна: [ Ctrl + d ]
— переключение между двумя последними открытыми окнами: [ Ctrl + a ]
— переключение на следующее открытое окно: [ Ctrl + a + n ]
— переключение на предыдующее открытое окно: [ Ctrl + a + p ]
— отключение от окон: [ Ctrl + a + d ]
— подключение к окнам: # screen -dr
— после выхода к сессии можно вернуться при помощи: # screen -r
— после аварийного выхода, отсоединение от скрина не всегда регистрируется, при попытке повторного подключения выдается сообщение о том, что скрин активен, подключиться невозможно. Подключение к такому скрину выполняется при помощи: # screen -x

Еще мне очень нравится функция получения списка всех окон, который можно вызвать нажав [ Ctrl + a + » ], в котором можно передвигаться стрелками вверх / вниз, выбирая нужное окно из списка.
Чтобы не запутаться в большом количестве окон, можно присвоить уникальную подпись каждому окну нажав комбинацию клавиш [ Ctrl + a + A ], в появившемся окне ввести что-то вместо текста по-умолчанию bash и нажаеть Enter.

Linux find: поиск файлов по имени

Часто, при работе в Linux с командой find, необходимо найти файлы разных типов по имени.
Например, необходимо найти и подготовить к архивации все *.php, *.js и *.css файлы в папке вне зависимости от регистра имени.
Для этого выполняем команды:

# cd /home/taras/public_html
# find . -type f \( -iname '*.php' -o '*.js' -o '*.css' \) -print &gt; /home/taras/list-to-archive.txt

В файле /home/taras/list-to-archive.txt будет искомый список файлов, который можно использовать для архивирования утилитой tar, например, так:

# tar -cpjf /home/taras/archive.tar.bz2 -T /home/taras/list-to-archive.txt

Если нужно вести зависимый от регистра поиск заменяем -iname на -name.

Linux ionice: установить приоритет ввода/вывода для команды

В Linux, работая с правами администратора root, можно установить приоритет ввода/вывода для какого-либо процесса с помощью команды ionice.
Например, если нужно выполнить что-либо с наиболее высоким приоритетом:

# ionice -c1 -n0 /bin/some-command

Или же:

# ionice -c1 -n0 -pPID

PID процесса можно получить с помощью команд: ps, top, htop.
Чтобы выполнить что-либо с наиболее низким приоритетом ввода/вывода изменяем параметры -c3 -n7

программирование и разработка сайтов от профессионала
 
Copyright © 2013 - 2024 Шкоденко Тарас. Програмування та розробка сайтів