• Как в iptables блокировать все соединения SYN_RECV?

    DerBlogger
    @DerBlogger

    SYN_RECV - это состояние tcp-соединения во время three-handshake, означающее что сервер принял пакет с установленным флагом SYN (запрос на соединение), отправил SYN/SYN-ACK клиенту и ожидает от клиента пакет с флагом ACK.

    Поскольку ACK от клиента (в нашем случае, от атакующего хоста) не приходит, то соединение висит до момента, пока оно не будет убито по таймауту. Пока такое соединение существует в системе - оно потребляет ресурсы, что может создать прецедент для замедления работы системы.

    Таким образом, чтобы таких соединений не создавалось нужно отсеивать из них неугодные до того, как система выделит для них ресурсы. В Вашем случае, нужно фильтровать все входящие пакеты с установленным флагом SYN и дропать те из них, которые нас не устраивают. Легитимный пользователь не будет создавать по десятку соединений каждую секунду, а атакующий - будет.

    Соответственно, Вам нужно выяснить закономерность (периодичность, количество запросов и т. п.), позволяющую отличить легитимный хост от атакующего конкретно в Вашем случае, и в соответствии с ней создать правила.

    Если говорить обобщенно, то в Вашем случае, я думаю, проблему можно решить с помощью модуля recent в iptables. Уверен, его функционала Вам будет достаточно. Сможете обойтись несколькими правилами. Алгоритм следует применить примерно такой:

    1. Сначала разрешаете входящий tcp-трафик по соединениям в состояниях ESTABLISHED и RELATED (модуль conntrack).

    iptables -I INPUT 1 -p tcp -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

    2. Открываете нужные порты, разрешая пропуск пакетов по этим правилам только в случаях если:
    - установлен флаг SYN (опция --syn);
    - соединение находится в состоянии NEW (модуль conntrack);
    - не превышен лимит соединений с одного ip-адреса (модуль recent).
    Примерно так:
    iptables -A INPUT -p tcp -m multiport --dports 80,443 --syn -m conntrack --ctstate NEW -m recent --name webtraffic --update --seconds 5 --hitcount 16 -j DROP
    
    iptables -A INPUT -p tcp -m multiport --dports 80,443 --syn -m conntrack --ctstate NEW -j ACCEPT


    Первое правило будет применено только к пакетам с установленным флагом SYN, которые приходят с отдельно взятого IP-адреса со скоростью более 16 пакетов в течение 5 секунд. Этим правилом будет отброшен флуд.

    Второе правило пропустит пакеты, не подошедшие под предыдущее правило (легитимный трафик).

    Разумеется, все нужно адаптировать под Ваши условия и нагрузку. Подробности по модулям смотрите в man iptables-extensions. Настоятельно рекомендую ознакомиться с описанием модуля recent для лучшего понимания.

    3. Дропаете весь остальной tcp-трафик либо отдельным правилом, либо политикой по-умолчанию.

    Также, дабы легитимных пользователей не откидывало при попытке подключения, Вы можете увеличить очередь SYN-пакетов в sysctl, в соответствии с имеющимися системными ресурсами. За это отвечает параметр net.ipv4.tcp_max_syn_backlog, и уменьшить таймаут для соединений в состоянии SYN_RECV, за что отвечает параметр net.netfilter.nf_conntrack_tcp_timeout_syn_recv.
    Рекомендуемые параметры индивидуальны для каждой системы. У меня используются такие:
    net.ipv4.tcp_max_syn_backlog = 262144
    net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 20

    Ответ написан
    1 комментарий
  • Что за странные сообщения в ленте между постами на хабре?

    Boomburum
    @Boomburum Куратор тега Хабр
    Местный

    Это так называемый голос - отдельный тип записи, которой с некоторой периодичностью могут пользоваться (помимо НЛО) два пользователя - обладатель самой большой кармы и обладатель самого большого рейтинга.

    Ответ написан
    1 комментарий
  • Как начать программировать на C/C++/C#?

    AxisPod
    @AxisPod

    Ну вы уж определитесь, что вы хотите, C, С++, C#, это 3 разных языка программирования, если C++ поддерживает библиотеки C, то C# это совсем другой язык программирования, C++/Cli в данном случае так же другой язык, который не имеет ничего общего с C# и позволяет генерировать управляемый код в C++.

    Вообще я когда-то поставил Visual C++ 6.0, открыл сайт http://firststeps.ru и понеслось. Начал с туториалов, потом начал читать книги по C++. Страуструпа, Элджера, потом и до Александреску добрался.

    А Керниган это C.

    Ставьте Visual Studio 2013 Express и не мучайтесь (если под Win). К C++ Builder лучше вообще не прикасайтесь. CodeLite вообще IDE, а не компилятор. Предыдущие 2 идут со своими компиляторами. Ну и создавайте проекты консольных приложений.

    Ответ написан
    4 комментария
  • Движок сайта sbets.ru

    Комментировать
  • Движок сайта sbets.ru

    NikMelnikov
    @NikMelnikov

    Часто ответ можно найти здесь - http://builtwith.com/sbets.ru

    В нашем случае вот что сервис выдал dYAr1FG.png

    Ответ написан
    Комментировать
  • Непонятный глюк в Chrome

    hell0w0rd
    @hell0w0rd
    Просто разработчик
    Chrome вне зависимости от наличия информации в теле страницы о фавиконке пытается ее запросить. А вообще чтобы такие вопросы возникали реже — сразу включайте логирование, вам тут же будет все ясно
    Ответ написан
    Комментировать
  • Непонятный глюк в Chrome

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ну, почему так происходит — как раз ничего удивительного, если точка входа настраивается как обработчик 404.
    А почему на втором… Ну, видимо, там не забыли favicon положить.

    Hint: вкладка «Network» должна открываться при «двойных запросах» в первую очередь.
    Ответ написан
    6 комментариев
  • Тестирование сайта в старых браузерах

    @Barmunk
    все ие в одном
    my-debugbar.com/wiki/IETester/HomePage
    Ответ написан
    Комментировать
  • Что пишет front-end разработчик в трудовой, что бы не быть верстаком?

    Да всем срать, что написано в трудовой книжке.
    Ответ написан
    Комментировать
  • Угон паролей

    int03e
    @int03e Автор вопроса
    Решено — действительно дыра.
    Ответ написан
    Комментировать
  • Что случилось с официальной страницей habrahabr в facebook?

    avalak
    @avalak
    > у кого лучше спросить
    Служба поддержки?
    Ответ написан
    Комментировать
  • GPS навигация онлайн?

    Laroy
    @Laroy
    Думаю, что вы пытались нагуглить что-то вроде livegpstracks.com/ или www.gdemoi.ru/gps-treker.php, но случайно по-привычке написали на Хабр.
    Ответ написан
    Комментировать
  • Free-lance.Ru совсем охренели что ли со своей монетизацией? =\

    Sterhel
    @Sterhel
    Делайте свои выводы господа и внимательней работайте с этой биржей.

    Тот, кто сделал правильные выводы, работает теперь с другими биржами.
    Ответ написан
    2 комментария
  • Какую локаль правильно указывать в атрибуте lang тега html?

    MTonly
    @MTonly
    Веб-разработчик с 2002 года
    Правильный, минимально достаточный вариант:
    <html lang="ru">

    Суффикс -RU означает «тот русский, на котором говорят именно в России» и конкретно для русского языка является избыточным.
    Ответ написан
    2 комментария
  • Лучший HTML/CSS редактор?

    Я работают в vim'е (верстаю, программирую). Сейчас набегут вражеские силы и начнут советовать emacs, что тоже неплохо, но для меня это вражеский лагерь. Оба редактора настраиваемые, можно менять цветовую тему, можно создавать шаблоны для файлов (есть и готовые), есть куча снипетов, управление деревом каталогов и т.д.
    Ответ написан
    2 комментария
  • Когда в PHP использовать интерфейсы, а когда абстрактные классы?

    try4tune
    @try4tune
    С точки зрения архитектуры:

    Интерфейс описывает свойства. Обратите внимание на классические названия интерфейсов: Throwable, Countable, Comparable, Iterable и т.д. Возьмем, к примеру, интерфейс Rollable (катящийся), и Foldable (складывающийся).

    Абстрактный класс же описывает сущность. Например, стол: Table_Abstract. Стол может быть деревянным, тогда будет Table_Wood extends Table_Abstract. Также стол может быть хирургическим: Table_Surgical extends Table_Abstract. В таком случае Table_Abstract объединяет общий свойства всех столов (скажем, площадь поверхности, наличие ножек и т.п.). А конкретный класс описывает сущность определенного типа столов.

    Связью же интерфейсов и классов Вы описываете свойства. Например, стол можно катить: Table_Abstract implements Rollable. Деревянный стол, например, можно сложить: Table_Wood implements Foldable.
    Ответ написан
    5 комментариев
  • JQuery parents().get(2) против parent().parent().parent()?

    Smileek
    @Smileek
    Спасибо, веселенькая задачка получилась.:)
    Тестим вот на этом:
    <div id="i1"><div id="i2"><div id="i3"><div id="i4"></div></div></div></div>
    <div id="info"></div>

    Вот так:
    var x, dt, dt2;
    var iter = 100000;
    dt = new Date();
    for (var i = 0; i < iter; i++)
    {
        x = $("#i4").parent().parent();
    }
    dt2 = new Date();
    $("#info").text(dt2 - dt);
    				
    dt = new Date();
    for (var i = 0; i < iter; i++)
    {
        x = $("#i4").parents().get(2);
    }
    dt2 = new Date();
    $("#info").text($("#info").text() + ":" + (dt2 - dt));
    

    На заданном примере выигрывает parents().get(2). 3398:2910
    Далее делаем 12 вложенных элементов и прогоняем пример из комментария — пять parent()-ов против parents().get(5): с огромным перевесом выигрывает get(5) — 5374:3954.
    А вот get(3) проигрывает parent().parent().parent() — 3406:3880.

    Получается, что выбрать все 12 элементов и в них найти третий, дольше, чем три раза прыгнуть вверх по дереву.

    Наконец, вернемся к первому варианту с четырьмя элементами, и попробуем воспользоваться полученным родителем.
    var x, dt, dt2;
    var iter = 10000; /* <-- В 10 раз уменьшим, а то зависнем */
    dt = new Date();
    for (var i = 0; i < iter; i++)
    {
       $("#i4").text($("#i4").parent().parent().attr("id")); /* <-- Запишем id родителя в текст потомка */
    }
    dt2 = new Date();
    $("#info").text(dt2 - dt);
    				
    dt = new Date();
    for (var i = 0; i < iter; i++)
    {
       $("#i4").text($("#i4").parents().get(2).attr("id"));  /* <-- Попробуем сделать то же самое */
    }
    dt2 = new Date();
    $("#info").text($("#info").text() + " " + (dt2 - dt));
    

    И вот тут нас ждет сюрприз: $("#i4").parents().get(2).attr is not a function
    arr.get(i), по сути, то же, что и arr[i], то есть мы получим просто Object.
    Для того, чтобы воспользоваться jQuery-функциями, придется обернуть его в денежный знак:
    $("#i4").text( $( $("#i4").parents().get(2) ).attr(«id»));
    От этого мы и потеряем в производительности: 2665:2973.

    Мораль:
    1) Всегда найдутся варианты использования, которые лучше для одного варианта и хуже для другого.
    2) Эффект от производительности или ее потери будет только на больших числах — в самом первом примере мы выиграли 0,4 секунды за 100000 (!) итераций.
    3) Поэтому поступайте, как велит эстет внутри Вас: мне, скорее всего, в реальном примере было бы удобнее получить jQuery-объект и дважды воспользоваться parent()-ом. С другой стороны, восемь раз я бы писать parent() не стал: религия не позволяет.
    Ответ написан
    2 комментария
  • Посоветуйте книгу/статью Debian/Ubuntu

    tapko
    @tapko
    Мне понравилась книга «Ubuntu и Debian Linux для продвинутых» (авторы: Кристофер Негус, Франсуа Казн). Книга написана простым, доступным языком, и при этом не теряет свой смысл.
    Ответ написан
    1 комментарий