хуйу нас не матерятся
Создаём новый виртуальный сервер, обязательно с 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
Проверяем влючены ли 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, и проделываем всё то же самое что мы сделали со шлюзом выше по тексту.
После этого базовая настройка серверов закончена, приступаем к настройке веб-сервера.