В сети можно
найти массу инструкций по правильной
настройке файрволла (говоря «файрволл»
я подразумеваю интерфейс iptables в Linux). Но
надо довольно долго искать, прежде чем
найдется практически полезное руководство.
В частности, как настроить файрволл на
удаленной машине и не потерять коннект?
Что будет, если вы подключились по SSH к
станции, до которой три года на оленях
и, настраивая файрволл, случайно зарубили
порт 22?
Ага, то-то.
Предлагаю
вашему вниманию инструкцию по безопасной
настройке файрволла.
Сначала описание
алгоритма действий:
1. create script for
disabling firewall
(disable_fw.sh)
2. add disable_fw.sh to
crontab for run every 5 minutes
3. check if it's
working
4. write iptables
rules, test
config
5. save rules to file
6. create startup
script (e.g. /etc/rc.local) for loading rules
7. remove disable_fw.sh
from crontab
Для дистров
на базе RedHat все несколько упрощается,
ибо старт/стоп файрволла там оформлен
в виде службы iptables и настроечных файлов
в /etc/sysconfig
Итак, скрипт
для отключения файрволла
#!/bin/bash # disable_fw.sh - Reset (disable) firewall # --------------------------------------------------------------------------------------------------------------- # Initially Written by Vivek Gite <vivek@nixcraft.com> # Rewrited by Valentin Fedulov <vasnake@gmail.com> # Source: http://www.cyberciti.biz/faq/turn-on-turn-off-firewall-in-linux/ # https://gist.github.com/vasnake/de19b6162ed97b0fd92b # --------------------------------------------------------------------------------------------------------------- # You can copy / paste / redistribute this script under GPL version 2.0 or above # ============================================================= # set to true if it is CentOS / RHEL / Fedora box RHEL=false ### no need to edit below ### IPT=/sbin/iptables IPT6=/sbin/ip6tables main() { if [ "$RHEL" == "true" ]; then # reset firewall using redhat script /etc/init.d/iptables stop /etc/init.d/ip6tables stop else # for all other Linux distro use following rules to reset firewall reset_iptables ${IPT} "/proc/net/ip_tables_names" reset_iptables ${IPT6} "/proc/net/ip6_tables_names" fi } reset_iptables() { local ipt_bin="${1}" local tables="${2}" $ipt_bin -P INPUT ACCEPT $ipt_bin -P OUTPUT ACCEPT $ipt_bin -P FORWARD ACCEPT $ipt_bin -F $ipt_bin -X $ipt_bin -Z for table in $(<$tables) do $ipt_bin -t $table -F $ipt_bin -t $table -X $ipt_bin -t $table -Z done } main |
Теперь добавить
скрипт в кронтаб для срабатывания каждые
5 минут
chmod +x /root/disable_fw.sh nano /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ */5 * * * * root /root/disable_fw.sh |
Проверить, как
работает предохранитель. Для этого
создать какое-нибудь разрешительное
правило
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
и посмотреть, как оно исчезнет меньше
чем через 5 минут
watch -d "iptables -L --line-numbers -nv"
Кстати, для IPv6 все почти также, только
команда «ip6tables».
Теперь, когда
мы убедились в работоспособности
предохранителя, можно заняться
составлением правил для файрволла и не
бояться накосячить при этом. Правила
лучше сразу писать в виде скрипта или
файла в формате iptables-save/iptables-restore.
Если вдруг
случится косяк, надо просто подождать
5 минут и все порты опять будут открыты.
После отладки
лично у меня получился такой файл
/etc/sysconfig/iptables *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -m recent --update --seconds 15 -j DROP -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -m recent --set -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT |
Сравните с
версией для IPv6
/etc/sysconfig/ip6tables *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p ipv6-icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -m recent --update --seconds 15 -j DROP -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -m recent --set -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT -A INPUT -j REJECT --reject-with icmp6-adm-prohibited -A FORWARD -j REJECT --reject-with icmp6-adm-prohibited COMMIT |
В случае с
CentOS или другим РедХатовским дистром,
имея показанные файлы, делать больше
ничего и не надо, эти правила загружаются
при старте служб
iptables, ip6tables.
В других дистрах
надо любым доступным способом (хоть в
/etc/rc.local) прописать загрузку правил, типа
iptables-restore < /root/working.iptables.rules
предварительно сохранив рабочий набор
правил
iptables-save > /root/working.iptables.rules
Последним
шагом, когда все работает, надо
закомментировать в crontab спасительный
скрипт отключения файрволла.
Дополнительная
информация:
выключить/включить
службу файрволла в РедХатских дистрах
chkconfig iptables off chkconfig iptables on
Нечто вроде визарда/мастера по первичной
настройке правил
system-config-firewall-tui
Полезные сцылки
original post http://vasnake.blogspot.com/2014/07/safe-way-to-setup-firewall.html
Комментариев нет:
Отправить комментарий