Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2014-07-17

Safe way to setup firewall

В сети можно найти массу инструкций по правильной настройке файрволла (говоря «файрволл» я подразумеваю интерфейс 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

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Manager (15) web-browser (15) Никонов (15) Klaipeda (14) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) serialization (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)