iptables

 cat /etc/sysconfig/iptables

# Firewall configuration written by system-config-firewall

# Manual customization of this file is not recommended.

*nat

:PREROUTING ACCEPT [87:14062]

:POSTROUTING ACCEPT [24:1682]

:OUTPUT ACCEPT [37:2496]

-A POSTROUTING -o eth1 -j MASQUERADE

COMMIT

*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 -j ACCEPT

-A INPUT -s 192.168.1.0/24 -m state --state NEW -m tcp -p tcp --dport 3389 -j ACCEPT

-A INPUT -s 192.168.1.0/24 -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

-A INPUT -s 192.168.1.0/24 -m state --state NEW -m tcp -p tcp --dport 3128 -j ACCEPT

-A INPUT -s 192.168.1.0/24 -m state --state NEW  -p tcp --dport 53 -j ACCEPT

-A INPUT -s 192.168.1.0/24 -m state --state NEW  -p udp --dport 53 -j ACCEPT

-A INPUT -s 192.168.1.0/24 -m state --state NEW  -p tcp --dport 445 -j ACCEPT

-A INPUT -s 192.168.1.0/24 -m state --state NEW  -p udp --dport 445 -j ACCEPT

-A INPUT -s 192.168.1.0/24 -m state --state NEW  -p udp --dport 123 -j ACCEPT

-A INPUT -s 192.168.1.0/24 -m state --state NEW  -p tcp --dport 143 -j ACCEPT

-A INPUT -s 192.168.1.0/24 -m state --state NEW  -p tcp --dport 25 -j ACCEPT

-A INPUT -s 192.168.1.0/24 -m state --state NEW  -p tcp --dport 110 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited

#-A FORWARD -j REJECT --reject-with icmp-host-prohibited

-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

-A FORWARD -m state --state NEW -i eth0 -s 192.168.1.32/28 -j ACCEPT

-A FORWARD -m state --state NEW -i eth0 -s 192.168.1.112/28 -j ACCEPT   

-P FORWARD DROP

COMMIT

cat /etc/sysconfig/iptables

# Firewall configuration written by system-config-firewall

# Manual customization of this file is not recommended.

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-N HOSTS

-A HOSTS -s 200.100.35.243/32 -j ACCEPT

-A HOSTS  -s 70.107.200.131/32 -j ACCEPT

-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 -j HOSTS

-A INPUT  -p tcp --dport 53 -j ACCEPT

-A INPUT  -p udp --dport 53 -j ACCEPT

-P INPUT DROP

#-A FORWARD -j REJECT --reject-with icmp-host-prohibited

COMMIT

Фаерволы продолжение… Часть 2

Как и обещал продолжаю сагу о фаерволах. В предыдущей статье мы рассмотрели работу ufw и разобрали некоторые простые примеры. Сегодня речь пойдет об IPtables. Я не буду углублятся в принципы работы, это не википедия, зато покажу несколько реально полезных примером, которые помогут вам обезапасить сервер. Настройки которые будут предложены ниже используются в основном на серверах расположенных в зоне MZ или же на домашних машинах.

Я имею ввиду, что для серьезных продакшн серверов настройки фаерволов должны быть более тонкими и гибкими, чем я предложу вам, но это уже дело каждого. Например на крупных серверах есть защита против ддосов, брут форсов и прочего. Кстати опцию как защитить 22 порт от брут форса я привел в прошлой статье. Примеры будут отображать настройку на двух системах, на Ubuntu\Debian и на Fedora 17. Для других дистрибутивов могут быть отличия. Если интересно, то поехали, вся необходимая инфа в продолжении.

Настройка IPtables в Ubuntu 12.04\Debian

Мой домашний сервер управляется системой Ubuntu 12.04 и он же смотрит в мир (т.е. у него есть интерфейс к которому привязан внешний IP) так же многие серверы за которые я был ответсвенный в армии и на работе так же работают под управлением Ubuntu 10.04 or 10.12 Server.

Так как настроить IPtables, с чего наать? Начать надо с определения политик безопасности. Как было сказано ранее, в предыдущей статье, я придерживаю такой политики:

- Allow all outgoing connections (разрешить ВСЕ исходящие)

- Allow established connections (разрешить ВСЕ установленные)

- Deny all incoming connections (запретить ВСЕ входящие, т.е. все кроме того что мы откроем должно пресекаться на корню без суда и следствия)

- Deny all forward connections (запретить форвардинг)

Остальное уже настраивается по вкусу.

В Ubuntu\Debian по умолчанию фаервол отключен. Проверить статус и посмотреть активыне правила можно так:

1 2 3

$ sudo iptables -L $ sudo iptables -L -v $ sudo iptables -n -L -v --line-numbers

Сбросить все установленные прежде правила можно так:

1

$ sudo iptables -F

Создаем файл с правилами:

1

$ vi /etc/iptables.rules

Туда вносим следующие правила:

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

*filter   # Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0-A INPUT -i lo -j ACCEPT -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT   # Accepts all established inbound connections-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT   # Allows all outbound traffic# You could modify this to only allow certain traffic-A OUTPUT -j ACCEPT   # Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)-A INPUT -p tcp --dport 80 -j ACCEPT -A INPUT -p tcp --dport 443 -j ACCEPT   # Allows SSH connections # THE -dport NUMBER IS THE SAME ONE YOU SET UP IN THE SSHD_CONFIG FILE-A INPUT -p tcp -m state --state NEW --dport 30000 -j ACCEPT   # Now you should read up on iptables rules and consider whether ssh access # for everyone is really desired. Most likely you will only allow access from certain IPs.   # Allow ping-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT   # log iptables denied calls (access via 'dmesg' command)-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7   # Reject all other inbound - default deny unless explicitly allowed policy:-A INPUT -j REJECT -A FORWARD -j REJECT   COMMIT

Теперь активируем правила:

1

$ sudo iptables-restore < /etc/iptables.rules

Смотрим на результат:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

$ sudo iptables -L   Chain INPUT (policy ACCEPT) target     prot opt source               destination ACCEPT     all  --  anywhere             anywhere REJECT     all  --  anywhere             127.0.0.0/8          reject-with icmp-port-unreachable ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh ACCEPT     icmp --  192.168.0.0/16       anywhere             icmp echo-request LOG        all  --  anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: " REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable   Chain FORWARD (policy ACCEPT) target     prot opt source               destination ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED ACCEPT     all  --  anywhere             anywhere REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable   Chain OUTPUT (policy ACCEPT) target     prot opt source               destination ACCEPT     all  --  anywhere             anywhere

Cохраняем правила:

1

$ sudo iptables-save > /etc/iptables.up.rules

Что-бы правила активировались после перезагрузки, делаем такой скрипт:

1 2 3 4

$ sudo vi /etc/network/if-pre-up.d/iptables   #!/bin/bash/sbin/iptables-restore < /etc/iptables.up.rules

Даем скрипту права на выполнения:

1

$ sudo chmod +x /etc/network/if-pre-up.d/iptables

Пояснения некоторых правил:

Разрешить исходящие установленные соединения:

1

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Разрешить весь исходящий траффик:

1

-A OUTPUT -j ACCEPT

Разрешить соединения на порт 80,443:

1 2

-A INPUT -p tcp --dport 80 -j ACCEPT -A INPUT -p tcp --dport 443 -j ACCEPT

Запретить все входящие соединения и форвардинг:

1 2

-A INPUT -j REJECT -A FORWARD -j REJECT

Универсальное правило, на разрешение пинга:

1

-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

Разрешить SSH соединения на порту 30000 (протокол TCP):

1

-A INPUT -p tcp -m state --state NEW --dport 30000 -j ACCEPT

Это не полное объяснение, но по чуть-чуть картина сложится:

Настройка IPtables в Fedora 17

В Fedora 17 правила все теже, но их настройка и активация чуть иная. Тут все правила пачкой прописываются в файл: /etc/sysconfig/iptables

После чего делается стандартные рестарт на сервис:

1

# /etc/init.d/iptables restart

Или

1

# systemctl restart iptables.service

Или

1

# service iptables restart

Что-бы фаервол стартовал с системой делаем так:

1

# chkconfig iptables on

Некоторые примеры

Разрешить подключение к порту 22 только с определенной сети:

1

-A INPUT -m state --state NEW -m tcp -p tcp --source 192.168.98.0/24 --dport 22 -j ACCEPT

Закрыть пинг:

1

-I INPUT -i eth0 -p icmp -s 0/0 -d 0/0 -j DROP

Закрыть пинг на внешнем интерфейсе eth0:

1 2 3

-A INPUT -p icmp --icmp-type echo-reply -s 0/0 -i eth0 -j DROP -A INPUT -p icmp --icmp-type destination-unreachable -s 0/0 -i eth0 -j DROP -A INPUT -p icmp --icmp-type time-exceeded -s 0/0 -i eth0 -j DROP

Закрыть пинг на любом интерфейсе:

1

-A INPUT -p icmp -m icmp --icmp-type 8 -j DROP

Забанить IP адрес:

1

-A INPUT -s 65.55.44.100 -j DROP

Забанить доступ к 21 порту для определенного IP:

1

-A INPUT -s 65.55.44.100 -p tcp --destination-port 25 -j DROP

Забанить целую подсеть:

1

-A INPUT -s 192.168.98.0/24 -j DROP

Запретить все соединения на 80 порт (все интерфейсы, протокол TCP):

1

-A INPUT -p tcp --dport 80 -j DROP

Запретить все соединения на 80 порт внешнего интерфейса eth1, протокол TCP

1

-A INPUT -i eth1 -p tcp --dport 80 -j DROP

Закрыть весь исходящий трафик по направлению к неугодному IP:

1

-A OUTPUT -d <IP ADDRESS> -j DROP

К примеру я хочу забанить сайт www.facebook.com на шлюзе, что-бы с офиса не было к нему доступа:

1 2 3 4 5

# sudo nslookup facebook.com   Name:   facebook.com Address: 173.252.100.16 Name:   facebook.com

Добавляю правило:

1

-A OUTPUT -d 173.252.100.16 -j DROP

Но это забанит только один из серверов, а мы хитрые, так что чекаем подсеть:

1 2 3

# host -t a www.facebook.com www.facebook.com is an alias for star.facebook.com. star.facebook.com has address 66.220.158.20

# whois 69.171.228.40 | grep CIDR

CIDR: 69.171.224.0/19

Баним:

1

-A OUTPUT -p tcp -d 69.171.224.0/19 -j DROP

Но можно и проще:

1 2

-A OUTPUT -p tcp -d www.facebook.com -j DROP -A OUTPUT -p tcp -d facebook.com -j DROP

Забанить комп по MAC адресу (таблица ARP на шлюзе вам в помощь):

1

-A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP

Открыть диапазон портов:

1

-A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT

Список полезных правил, понятно что ACCEPT, DROP, REJECT по желанию

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

Replace ACCEPT with DROP to block port: ## open port ssh tcp port 22 ## iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT   ## open cups (printing service) udp/tcp port 631 for LAN users ## iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT   ## allow time sync via NTP for lan users (open udp port 123) ## iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT   ## open tcp port 25 (smtp) for all ## iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT   # open dns server ports for all ## iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT   ## open http/https (Apache) server port to all ## iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT   ## open tcp port 110 (pop3) for all ## iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT   ## open tcp port 143 (imap) for all ## iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT   ## open access to Samba file server for lan users only ## iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT   ## open access to proxy server for lan users only ## iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT   # Allow FTP connections @ port 21 iptables -A INPUT  -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT   # Allow Active FTP Connections iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT   # Allow Passive FTP Connections iptables -A INPUT -p tcp --sport 1024: --dport 1024:  -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 1024: --dport 1024:  -m state --state ESTABLISHED,RELATED -j ACCEPT   ## open access to mysql server for lan users only ## iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

Посмотреть что происходит с портом 22:

1

iptables -L INPUT -v -n | grep 22

И в заключении можно сказать, что я привел выше только самые общие, базисные примеры, на самом деле IPtables умеет делать много вещей.

- Инспекция пакетов

- Фильтрация траффика

- Транслирование адресов (NAT)

и т.д.

За помощь в примерах, спасибо cyberciti.biz