А так же о всякой фигне
Создаём новый виртуальный сервер, обязательно с private networking, в датацентре с максимально быстрым коннектом, назовём этот сервер "шлюз" (gateway):
В моём случае это датацентр AMS2. OS - unbuntu 16.04.2LTS.
Коннектимся к ней:
ssh root@82.196.14.47
Нас попросят установить новый пароль - соглашаемся. После чего первым делом всё обновляем:
apt update apt upgrade
И перезагружаемся:
shutdown -r 0
Пока она перезагружается, у себя на компьютере генерируем 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
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 портам, а разрешить его только с нашего шлюза.