Простой firewall для сервера с web-сайтами

Иногда требуется сразу после поднятия веб-сервера на выделенном или виртуальном сервере linux (Debian, CentOs) с iptables быстренько написать несколько строк, чтобы закрыть файрволом ненужные для чужих порты.

Конечно же, нужно оставить открытыми 80 и 443 порты для веб-сервера, и разрешить администратору входить с проверенных адресов в ssh. Также должны работать DNS на сервере, почта должна отправляться с сервера, да и самому серверу необходим интернет для установки и обновления ПО.

У администраторов — профессионалов всегда есть длинные и подробные портянки с файрволами, но они не всегда удобны и работоспособны. Да и внесение корректив в такие портянки очень сложны.

Я предлагаю коротенькое решение, которое точно работает в минимальной конфигурации iptables, не использующее дополнительных модулей iptables, и успешно реализует описанное выше. Текст скрипта помещаю ниже, конечно же, он доступен для скачивания с этого сайта.

Все действия необходимо выполнять очень аккуратно на свой страх и риск от суперпользователя root. После загрузки необходимо исправить список публично открытых портов — записать их через пробел в переменной Ports.

Аналогично следует указать список IP адресов или подсетей администраторов в переменной Admin.

Кроме того, желающие могут закрыть пинг сервера, выставив в переменную AllowPing в 0

При этом Администраторам будут открыты все порты сервера.

#!/bin/bash
# EASY-fw.sh
# VPS-server.RU edition 
# ver 0.1 Beta :o) 07 Feb 2019
#-----------------------------------------------------------------------------
# Set variables :o)
#-----------------------------------------------------------------------------
# IP for admins
Admin="176.31.32.33 46.160.0.0/16"
# Open Ports
Ports="80 443 8083"
# To Disable Ping set 0
AllowPing=1
#-----------------------------------------------------------------------------
ipt=`which iptables`
if [ ! -n "$ipt"  ]; then
        echo "Error: Iptables not found!"; exit 0;
fi
 
implode() { A=($1); ret=$(IFS=", "; echo "${A[*]}"); echo $ret; }
 
myip=`ip addr | sed -En 's/127.0.0//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'| xargs`
 
dns=`cat /etc/resolv.conf | grep -v '^#|^$' | grep nameserver | awk '{print $2}' | xargs`
 
$ipt -F
$ipt -X
$ipt -P INPUT DROP
$ipt -P FORWARD ACCEPT
$ipt -P OUTPUT ACCEPT
 
$ipt -A INPUT -i lo -j ACCEPT
$ipt -A OUTPUT -o lo -j ACCEPT
$ipt -A INPUT -p tcp -s 127.0.0.1/8 -j ACCEPT
 
# Allow my IPs
$ipt -A INPUT -p tcp -s $(implode "$myip") -j ACCEPT
 
# PORTS
$ipt -A INPUT -p tcp -m multiport --dports $(implode "$Ports") -j ACCEPT
$ipt -A INPUT -p tcp --match multiport --dports 40000:65534 -j ACCEPT
 
# Admins allow
$ipt -A INPUT -p tcp -s $(implode "$Admin") -j ACCEPT
 
# DNS allow
$ipt -A INPUT -p all -s $(implode "$dns") -j ACCEPT
 
if [[ $AllowPing -ne 0 ]]; then
        # Allow ping
        $ipt -A INPUT -p icmp -j ACCEPT
fi
 
# Print result :o)
$ipt -L -n

После настройки необходимо добавить скрипт в автозагрузку. Удобно воспользоваться кроном. Отредактируйте его командой crontab -e

# Получить скрипт легкого файрвола:
wget chast.in/easy-fw.sh -O /etc/fw.sh
# сделать скрипт исполняемым:
chmod +x /etc/fw.sh
# Редактируем скрипт (Меняем порты и указываем IP админов:
nano /etc/fw.sh
# !!! ТОЛЬКО После всех проверок и настройки портов!!
# редактируем крон:
crontab -e
# следует добавить в крон следующую строчку:
@reboot /bin/bash /etc/fw.sh


В заключении на всякий случай напомню всем, что выделенные и виртуальные серверы надежнее покупать у компании vps-server.ru


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *