Защита от DDoS Своими силами. Часть 2, создаём виртуальные машины

15.04.2017 07:05

Создаём новый виртуальный сервер, обязательно с private networking, в датацентре с максимально быстрым коннектом, назовём этот сервер "шлюз" (gateway):

Создаём виртуальный сервер

В моём случае это датацентр AMS2. OS - unbuntu 16.04.2LTS.

Коннектимся к ней:

ssh root@82.196.14.47

Нас попросят установить новый пароль - соглашаемся. После чего первым делом всё обновляем:

apt update
apt upgrade

И перезагружаемся:

shutdown -r 0

Настройка ssh доступа

Пока она перезагружается, у себя на компьютере генерируем ssh ключ (если у Вас его ещё нет):

ssh-keygen -t rsa

Возвращаемся к нашей виртуалке, нам нужно добавить наш новый ключ пользователю root в authorized_keys:

nano ~/.ssh/authorized_keys

Копируем сюда содержимое нашего .pub ключа. Закрываем, дизконнектимся от виртуалки и пробуем подключиться без пароля, с помощью ssh ключа:

ssh -i ~/.ssh/myNewKey root@82.196.14.47

Затем, на своём компьютере открываем файл: ~/.ssh/config и добавляем туда следующий конфиг:

Host ssh 82.196.14.47
  HostName 82.196.14.47
  IdentityFile ~/.ssh/myWebservices
  User root

Теперь мы сможем подключиться через файловый менеджер к sftp, а ftp нам будет не нужен.

Далее, нам нужно отключить возможность авторизоваться по логину/паролю на сервере, открываем ssh конфиг:

nano /etc/ssh/sshd_config

Находим строчку "PasswordAuthentication yes" и меняем её на "PasswordAuthentication no"

Включаем фаервол

ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw limit 22/tcp
ufw enable

Проверяем влючены ли syn cookie

cat /proc/sys/net/ipv4/tcp_syncookies

В большинстве современных дистрибутивов эта опция уже включена, но если Вы используете какую-то особенную версию линюксов, то обязательно погуглите как решить эту проблему. В простейшем случае поддержка syncookie уже интегрирована в ядро, просто её нужно включить:

sysctl -w net.ipv4.tcp_syncookies=1

А ещё нужно ручками зайти в настройки ufw, и дописать конфиг, спасибо lepepe.github.io. Открываем: /etc/ufw/before.rules, сразу после строчек:

# Don't delete these required lines, otherwise there will be errors
*filter

Добавляем:

:ufw-http - [0:0]
:ufw-http-logdrop - [0:0]

И в конце файла перед:

# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT

Добавляем:

-A ufw-before-input -m state --state INVALID -j DROP

-A ufw-before-input -p tcp --dport 80 -j ufw-http
-A ufw-before-input -p tcp --dport 443 -j ufw-http

# Limit connections per Class C
-A ufw-http -p tcp --syn -m connlimit --connlimit-above 50 --connlimit-mask 24 -j ufw-http-logdrop

# Limit connections per IP
-A ufw-http -m state --state NEW -m recent --name conn_per_ip --set
-A ufw-http -m state --state NEW -m recent --name conn_per_ip --update --seconds 10 --hitcount 20 -j ufw-http-logdrop

# Limit packets per IP
-A ufw-http -m recent --name pack_per_ip --set
-A ufw-http -m recent --name pack_per_ip --update --seconds 1 --hitcount 20 -j ufw-http-logdrop

# Finally accept
-A ufw-http -j ACCEPT

# Log
-A ufw-http-logdrop -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW HTTP DROP] "
-A ufw-http-logdrop -j DROP

Затем открываем: /etc/ufw/sysctl.conf и добавляем строчку:

net/netfilter/nf_conntrack_tcp_loose=0

В этом же файле ищем строчку:

net/ipv4/tcp_syncookies=

В моём случае параметр, внезапно, был выставлен в 0, если так, переставляем его в 1.

Поднимаем веб-сервер

Теперь создаём второй сервер, в том же датацентре, так же с private networking, и проделываем всё то же самое что мы сделали со шлюзом выше по тексту.

После этого базовая настройка серверов закончена, приступаем к настройке веб-сервера.



Защита от DDoS Своими силами. Часть 1, вводная

Защита от DDoS это совсем нетривиальная задача. Если Ваш веб-сайт - это бизнес, то лучше сразу воспользуйтесь услугами специализированных анти- ДДоС сервисов (cloudflare, qrator идр.), либо как минимум услугами опытного специалиста.

Защита от DDoS Своими силами. Часть 3, настраиваем веб-сервер

На этом этапе нам нужно установить стандартный набор приложений: php, mysql, nginx. Но при этом нужно заблокировать для всех коннект к серверу по http/https портам, а разрешить его только с нашего шлюза.


(0) Комментариев