По поводу выбора дистрибутива для сервера, холивары ходят по всему интернету. И тут общая масса “воинов” разбиваются на два лагеря: DEB и RPM, приверженцы Debiad-подобных и Red-Hat-подобных систем. Поработав с системами обоих типов, я остановился на Red-Hat-подобных системах (Fedora, OpenSUSE, Red Hat, CentOS). Почему?
Я думаю это тема для отдельного разговора. Сегодня же мы займемся первоначальной настройкой сервера на безе CentOS 7.
Первым делом обновим систему до актуального состояния:
1 |
yum -y update |
Установим might commander (консольный файловый менеджер наподобие norton commander в dos):
1 |
yum -y install mc |
Установим консольный текстовый редактор nano:
1 |
yum -y install nano |
Отключаем встроенный SELinux, принудительный контроль доступа нам в этой статье не очень нежен:
1 |
nano /etc/sysconfig/selinux |
Меняем значение SELINUX на disabled (SELINUX=disabled) и отправляем сервер на перезагрузку.
1 |
reboot |
Приступаем к настройке фаервола iptables. Первым делом можем посмотреть актуальную таблицу правил командой:
1 |
iptables -L -v -n |
В CentOS между пользователем и iptables существует прослойка в виде настройщика – firewalld. Такой же настройщик существует и в других дистрибутивах, к примеру в Ubuntu есть ufw. Естественно это ПО облегчает ручную настройку фаервола, но мы будем обращаться к нему напрямую(чз скрипт), посему удаляем firewalld.
1 2 3 4 |
systemctl stop firewalld systemctl disable firewalld rm '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service' rm '/etc/systemd/system/basic.target.wants/firewalld.service' |
Установим сервисы iptables, cоздим симлинк для автозапуска и запустим фаервол
1 2 3 |
# yum install iptables-services systemctl enable iptables systemctl start iptables |
Создадим скрипт с правилами для iptables
1 |
nano /etc/iptables_rules.sh |
И добавим в него сами правила
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
#!/bin/bash # # Объявление переменных export IPT="iptables" # Интерфейс который смотрит в интернет export WAN=eth0 export WAN_IP=192.168.0.1 # Очистка всех цепочек iptables $IPT -F $IPT -F -t nat $IPT -F -t mangle $IPT -X $IPT -t nat -X $IPT -t mangle -X # Установим политики по умолчанию для трафика, не соответствующего ни одному из правил $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP # разрешаем локальный траффик для loopback $IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT # Разрешаем исходящие соединения самого сервера $IPT -A OUTPUT -o $WAN -j ACCEPT # Состояние ESTABLISHED говорит о том, что это не первый пакет в соединении. # Пропускать все уже инициированные соединения, а также дочерние от них $IPT -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT # Пропускать новые, а так же уже инициированные и их дочерние соединения $IPT -A OUTPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT # Разрешить форвардинг для уже инициированных и их дочерних соединений $IPT -A FORWARD -p all -m state --state ESTABLISHED,RELATED -j ACCEPT # Включаем фрагментацию пакетов. Необходимо из за разных значений MTU $IPT -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu # Отбрасывать все пакеты, которые не могут быть идентифицированы # и поэтому не могут иметь определенного статуса. $IPT -A INPUT -m state --state INVALID -j DROP $IPT -A FORWARD -m state --state INVALID -j DROP #Блок нулевых пакетов $IPT -A INPUT -p tcp --tcp-flags ALL NONE -j DROP # Приводит к связыванию системных ресурсов, так что реальный # обмен данными становится не возможным, обрубаем $IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP $IPT -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP # Открываем порт для ssh $IPT -A INPUT -i $WAN -p tcp --dport 22 -j ACCEPT # Открываем порт для DNS $IPT -A INPUT -i $WAN -p udp --dport 53 -j ACCEPT # Открываем порт для NTP $IPT -A INPUT -i $WAN -p udp --dport 123 -j ACCEPT # Открываем порт для HTTP $IPT -A INPUT -i $WAN -p tcp --dport 80 -j ACCEPT # Открываем порт для HTTPS/SSL $IPT -A INPUT -i $WAN -p tcp --dport 443 -j ACCEPT # Логирование # Все что не разрешено, но ломится отправим в цепочку undef #$IPT -N undef_in #$IPT -N undef_out #$IPT -N undef_fw #$IPT -A INPUT -j undef_in #$IPT -A OUTPUT -j undef_out #$IPT -A FORWARD -j undef_fw # Логируем все из undef #$IPT -A undef_in -j LOG --log-level info --log-prefix "-- IN -- DROP " #$IPT -A undef_in -j DROP #$IPT -A undef_out -j LOG --log-level info --log-prefix "-- OUT -- DROP " #$IPT -A undef_out -j DROP #$IPT -A undef_fw -j LOG --log-level info --log-prefix "-- FW -- DROP " #$IPT -A undef_fw -j DROP # Записываем правила /sbin/iptables-save > /etc/sysconfig/iptables |
В принципе все достаточно доходчиво описано в комментариях. Добавлю лишь то, что при включении логирования логи будут писаться в /var/log/messages. В конце скрипта указываем что все наши правила нужно записать в основной файл настроек iptables, который будет применяться каждый раз при запуске фаервола.
Теперь сделаем наш файл исполняемым, запустим его и проверим применялись ли наши правила
1 2 3 |
chmod 0740 /etc/iptables_rules.sh /etc/iptables_rules.sh iptables -L -v -n |
Ну и на последок меняем стандартный порт ssh, чтобы в него лишний раз не стучались боты:
1 |
# nano /etc/ssh/sshd_config |
Находим строку Port 22, раскомментируем ее и указываем любой другой порт. К примеру 22345
После этого действия обязательно измените правила фаервола
1 2 |
# Открываем порт для ssh $IPT -A INPUT -i $WAN -p tcp --dport 22 -j ACCEPT |
на это
1 2 |
# Открываем свой порт для ssh $IPT -A INPUT -i $WAN -p tcp --dport 22345 -j ACCEPT |
и перезапустите sshd
1 |
systemctl restart sshd |
На этом, я думаю, завершим первую часть…
Грамматическая ошибка:
“Отключаем встроенный SELinux, принудительный контроль доступа нам в этой статье не очень нежен:”