Иногда требуется сразу после поднятия веб-сервера на выделенном или виртуальном сервере 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