*Sasha* писал(а): ↑30.04.2010 19:03
А так?
Код: Выделить всё
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j REJECT
так работает, а какая разница?
Вот мой набор правил
Код: Выделить всё
/sbin/iptables -F INPUT # Очищаем цепочку INPUT
/sbin/iptables -F OUTPUT # Очищаем цепочку OUTPUT
/sbin/iptables -F FORWARD # Очищаем цепочку FORWARD
/sbin/iptables -F lim1
/sbin/iptables -F ssh_brute_check
/sbin/iptables -F ssh_knock
/sbin/iptables -P INPUT DROP #Что не разрешено — то запрещено
/sbin/iptables -P OUTPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.248 -j ACCEPT
/sbin/iptables -A OUTPUT -d 192.168.1.0/24 -s 192.168.1.248 -j ACCEPT
/sbin/iptables -A INPUT -p icmp -j ACCEPT
/sbin/iptables -A OUTPUT -p icmp -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 80 -m string --string "GET /setting." --algo kmp -j DROP
#Далее можно поставить ограничение по количеству одновременных соединений
#Лимит на 20 запросов в секунду для интерфейса eth0
/sbin/iptables --new-chain lim1
/sbin/iptables --insert OUTPUT 1 -p tcp --destination-port 80 -o eth0 --jump lim1
/sbin/iptables --append lim1 -m limit --limit 20/sec --jump RETURN
/sbin/iptables --append lim1 --jump DROP
#Максимум 10 одновременных соединений с одного IP
/sbin/iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j REJECT
#Блокировка более 10 SYN
/sbin/iptables -I INPUT -p tcp --syn --dport 80 -j DROP -m connlimit --connlimit-above 10
#20 соединений на сеть класса С
/sbin/iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT
#Правило будет препятствовать спуфингу от нашего имени. Ведь если мы получаем пакет с установленными флагами SYN #и ACK (такой комбинацией флагов обладает только ответ на SYN-пакет) по еще не открытому соединению, это #означает, что кто-то послал другому хосту SYN-пакет от нашего имени, и ответ пришел к нам. Конечно, #злоумышленнику предстоит еще угадать номер последовательности, но лучше не предоставлять ему такого шанса. Согласно приведенному правилу, наш хост ответит RST-пакетом, после получения которого атакуемый хост закроет #соединение. Добавление такого правила в конфигурацию фаервола настоятельно рекомендуется, потому что если #злоумышленнику удастся осуществить спуфинг-атаку от вашего имени, при расследовании этого эпизода следы приведут к вам
/sbin/iptables -I INPUT -m conntrack --ctstate NEW,INVALID -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT --reject-with tcp-reset
#Блокирование bruteforce-атак (подбор пароля вслепую) на SSH и аналогичные сервисы. Все попытки открыть новое SSH-соединение проверяются, и с одного IP-адреса можно открывать не более 2 соединений за 10 минут. Обратите внимание, что за одно соединение злоумышленник может проверить несколько #паролей — число попыток аутентификации до обрыва соединения задает параметр MaxAuthTries в файле /etc/ssh/sshd_config. По умолчанию это число #равно 6, так что в нашем примере злоумышленник сможет проверять не более 12 паролей за 10 минут.
/sbin/iptables -N ssh_brute_check # Создаем цепочку для проверки попыток соединений на защищаемый порт
# Если за последние 10 минут (600 секунд) с одного адреса было 3 или более новых соединений — блокируем этот адрес
/sbin/iptables -A ssh_brute_check -m recent --update --seconds 300 --hitcount 3 -j DROP
# В противном случае — разрешаем, и при этом заносим в список
/sbin/iptables -A ssh_brute_check -m recent --set -j ACCEPT
/sbin/iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Разрешаем пакеты по установленным соединениям
#Все попытки открыть новое соединение по SSH направляем на проверку
/sbin/iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 22 -j ssh_brute_check
# Здесь можно разрешать те порты, для которых такая проверка не нужна. Например, HTTP
/sbin/iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 80 -j ACCEPT
#Защита от сканирования портов (заметим, что кроме критерия recent для этой задачи можно также использовать критерии psd и lscan из комплекта
#xtables-addons). Все пакеты, попадающие на нерабочие порты сервера, регистрируются. После нескольких таких попыток за заданный интервал времени #адрес их источника блокируется. Проверка TTL добавлена для защиты от блокировки легитимных клиентов после спуфинга злоумышленником от их #имени. Хотя, с другой стороны, эта мера позволяет ему обойти защиту от сканирования, выставляя своим пакетам различный TTL. Так что вопрос о #нужности этой проверки в вашем конкретном случае вам придется решать самостоятельно. # Если за последний час было 10 или более запросов на нерабочие порты — блокируем
/sbin/iptables -A INPUT -m recent --rcheck --seconds 3600 --hitcount 10 --rttl -j RETURN
# Если за последнюю минуту было 2 или более запросов на нерабочие порты — блокируем
/sbin/iptables -A INPUT -m recent --rcheck --seconds 60 --hitcount 2 --rttl -j RETURN
# Разрешаем рабочие порты
/sbin/iptables -A INPUT -m conntrack --ctstate NEW -p tcp -m multiport --dport 22,80,3000,3001 -j ACCEPT
/sbin/iptables -A INPUT -m conntrack --ctstate NEW -p udp -m multiport --dport 53 -j ACCEPT
# Всех, кто ломится в нерабочие порты — регистрируем
/sbin/iptables -A INPUT -m recent --set
# Port knocking — метод защиты портов, при котором доступ к определенному порту с отдельно взятого IP-адреса открывается после серии пакетов на
#заданную последовательность портов с заданными интервалами. Обычно эта задача решается при помощи демона knockd либо критерия pknock из комплекта #xtables-addons. Несколько самых простых вариантов такой защиты можно организовать и средствами критерия recent. Самое простое — открывать порт ssh (22) после стука в заданный высокий порт:
/sbin/iptables -N ssh_knock # Создаем цепочку для проверки попыток соединений на защищаемый порт
# Если за последние 60 секунд было 2 и более стука — блокируем, на всякий случай
/sbin/iptables -A ssh_knock -m recent --rcheck --seconds 60 --hitcount 2 -j RETURN
# Если за последние 10 секунд стук в нужный порт был — разрешить соединение
/sbin/iptables -A ssh_knock -m recent --rcheck --seconds 10 -j ACCEPT
/sbin/iptables -F INPUT # Очищаем цепочку INPUT
/sbin/iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Разрешаем пакеты по установленным соединениям
# Все попытки открыть новое соединение по SSH направляем на проверку
/sbin/iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 22 -j ssh_knock
# Здесь мы добавляем правило для регистрации стука
/sbin/iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 27520 -m recent --set
# Опять же на всякий случай — при стуке в соседние порты закрываем SSH
/sbin/iptables -A INPUT -m conntrack --ctstate NEW -p tcp -m multiport --dport 27519,27521 -m recent --remove
#Даже в таком простом примере присутствуют жесткие меры защиты: защищаемый порт (22) открывается на 10 секунд после стука в заданный порт (27520), при #этом более одного стука в этот порт в течение минуты считается ошибкой. Также стук в соседние с заданным порты сразу закрывает защищаемый порт. Это #делается в целях защиты от подбора стука.
# Silently Drop Stealth Scans
# All of the bits are cleared
/sbin/iptables -A INPUT -p icmp --icmp-type timestamp-request -j DROP
/sbin/iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# SYN and FIN are both set
/sbin/iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# SYN and RST are both set
/sbin/iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# FIN and RST are both set
/sbin/iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
# FIN is the only bit set, without the expected accompanying ACK
/sbin/iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
# PSH is the only bit set, without the expected accompanying ACK
/sbin/iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP
# URG is the only bit set, without the expected accompanying ACK
/sbin/iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP
где я накосячил, что web server - apache2, выдает такое сообщение, когда пробую достучатся к нему с наружи
Код: Выделить всё
Network Error (tcp_error)
A communication error occurred: "Operation timed out"
The Web Server may be down, too busy, or experiencing other problems preventing it from responding to requests. You may wish to try again at a later time.
For assistance, contact your network support team.