Создайте свой собственный брандмауэр с iptables, используя этот простой скрипт

Я потратил некоторое время на размышления о двух вещах об этом iptables: большинство тех, кто ищет эти руководства, являются новичками, а во-вторых, многие уже ищут что-то довольно простое и уже разработанное.

Этот пример для веб-сервера, но вы можете легко добавить больше правил и адаптировать их к своим потребностям.

Когда вы видите изменение «x» для вашего IP-адреса


#!/bin/bash

# Очищаем таблицы iptables -F iptables -X # Очищаем NAT iptables -t nat -F iptables -t nat -X # таблица mangle для таких вещей, как PPPoE, PPP и ATM iptables -t mangle -F iptables -t mangle -X # Политики Я думаю, что это лучший способ для новичков и # все же неплохо, я объясню вывод (вывод) все потому, что это исходящие соединения #, ввод мы отбрасываем все, и сервер не должен пересылать. iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP # Intranet LAN intranet = eth0 #Extranet wan extranet = eth1 # Сохранять состояние. Все, что уже подключено (установлено), остается так: iptables -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT # Loop device. iptables -A INPUT -i lo -j ACCEPT # http, https, мы не указываем интерфейс, потому что # мы хотим, чтобы он был для всех iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp - dport 443 -j ACCEPT # ssh только внутренне и из этого диапазона iptables -A INPUT -p tcp -s 192.168.xx / 24 -i $ intranet --dport 7659 -j ACCEPT # мониторинг, например, если у них есть zabbix или какой-либо другой сервис snmp iptables -A INPUT -p tcp -s 192.168.xx / 24 -i $ intranet --dport 10050 -j ACCEPT # icmp, пинг хорошо зависит от вас iptables -A INPUT -p icmp -s 192.168. xx / 24 - i $ intranet -j ACCEPT #mysql with postgres is port 5432 iptables -A INPUT -p tcp -s 192.168.xx --sport 3306 -i $ intranet -j ACCEPT #sendmail bueeeh, если вы хотите отправить почту #iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT # Anti-SPOOFING 09 # SERVER_IP = "07.xxx" # IP server IP - реальный WAN IP вашего сервера LAN_RANGE = "2014.xx / 190 "# Диапазон LAN вашей сети или vlan # IP, которые никогда не должны входить в экстранет,состоит в том, чтобы использовать небольшую # логику, если у нас чисто WAN-интерфейс, он никогда не должен вводить # трафик типа LAN через этот интерфейс SPOOF_IPS = "192.168/21 0.0.0.0/8 127.0.0.0/8 10.0.0.0/8 172.16.0.0 .12 / 192.168.0.0 "# Действие по умолчанию - выполняется, когда какое-либо правило соответствует ACTION =" DROP "# Пакеты с тем же ip моего сервера через wan iptables -A INPUT -i $ extranet -s $ SERVER_IP -j $ ACTION # iptables -A OUTPUT -o $ extranet -s $ SERVER_IP -j $ ACTION # Пакеты с диапазоном LAN для WAN, я сказал это так, если у вас # какая-то конкретная сеть, но это избыточно со следующим # правилом внутри цикл "for" iptables -A INPUT -i $ extranet -s $ LAN_RANGE -j $ ACTION iptables -A OUTPUT -o $ extranet -s $ LAN_RANGE -j $ ACTION ## Все сети SPOOF, не разрешенные wan для ip в $ SPOOF_IPS do iptables -A INPUT -i $ extranet -s $ ip -j $ ACTION iptables -A OUTPUT -o $ extranet -s $ ip -j $ ACTION done

Как всегда жду ваших комментариев, следите за новостями в этом блоге, спасибо


Содержание статьи соответствует нашим принципам редакционная этика. Чтобы сообщить об ошибке, нажмите здесь.

12 комментариев, оставьте свой

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

Ваш электронный адрес не будет опубликован. Обязательные для заполнения поля помечены *

*

*

  1. Ответственный за данные: Мигель Анхель Гатон
  2. Назначение данных: контроль спама, управление комментариями.
  3. Легитимация: ваше согласие
  4. Передача данных: данные не будут переданы третьим лицам, кроме как по закону.
  5. Хранение данных: база данных, размещенная в Occentus Networks (ЕС)
  6. Права: в любое время вы можете ограничить, восстановить и удалить свою информацию.

  1.   HO2Gi сказал

    Это помогает мне продолжить обучение, спасибо скопировано.

    1.    BrodyDalle сказал

      пожалуйста, рад помочь

  2.   Ксавье сказал

    Мне очень жаль, но у меня два вопроса (и один в подарок 😉):

    Пришли бы вы с этой конфигурацией, чтобы Apache работал, а все остальное, кроме SSH, закрыли?

    # Убираем столы
    Iptables -F
    Iptables -X

    Чистим NAT

    iptables -t нат -F
    iptables -t нат -X

    iptables -A INPUT -p tcp –dport 80 -j ACCEPT

    ssh только внутри и из этого диапазона ip

    iptables -A INPUT -p tcp -s 192.168.xx / 24 -i $ intranet –dport 7659 -j ACCEPT

    Второй вопрос: 7659 - это порт, используемый в SSH в этом примере?

    И третье и последнее: в каком файле сохранять эту конфигурацию?

    Большое спасибо за руководство, жаль, что вы такой новичок и не можете хорошо им воспользоваться.

    1.    BrodyDalle сказал

      это правило вам нужно для http из apache
      iptables -A INPUT -p tcp –dport 80 -j ACCEPT

      но вам также необходимо объявить политики отбрасывания по умолчанию (это в скрипте)
      iptables -P ПАДЕНИЕ ВВОДА
      iptables -P OUTPUT ACCEPT
      iptables -P FORWARD DROP

      и это потому, что, если вы находитесь вдали, он вас отбросит.
      iptables -A INPUT -m state –state ESTABLISHED, RELATED -j ACCEPT

      если 7659 - это порт этого ssh в примере, по умолчанию это 22, хотя я рекомендую изменить порт на "не очень известный"
      человек, я не знаю, как вы хотите ... firewall.sh, и вы помещаете его в rc.local (sh firewall.sh), чтобы он запускался автоматически, это зависит от того, какая у вас операционная система, есть файлы, где вы можете разместить правила напрямую.

  3.   Jge сказал

    Эй, ваш скрипт очень хорош, анализирует его… Вы знаете, как я мог отклонять все запросы от моих пользователей к конкретному сайту?… но у этого веб-сайта много серверов….

    1.    BrodyDalle сказал

      Рекомендую другие варианты:
      1) Можно создать в днс поддельную зону ...
      2) Можно поставить прокси с acl
      греховое эмбарго
      Для iptables это может понравиться ... не всегда лучший вариант (есть другие способы)
      iptables -A INPUT -s blog.desdelinux.ne -j DROP
      iptables -A ВЫХОД -d blog.fromlinux.net -j DROP

      Скажите, сработало ли это

  4.   Ксавье сказал

    Спасибо за ответ, все прояснилось. Я спрашивал о порте, потому что был удивлен использованием 7659, поскольку частные порты начинаются с 49152, и это могло мешать работе некоторых служб или чего-то еще.
    Еще раз спасибо за все, приятно!

    Привет.

  5.   НИЦ сказал

    БродиДалле, как я могу с тобой связаться? Очень интересен твой сценарий.

    1.    BrodyDalle сказал
  6.   Carlos сказал

    Предпоследняя строка «iptables -A OUTPUT -o $ extranet -s $ ip -j $ ACTION» предназначена для предотвращения спуфинга вашей машины? Или возможно, что какой-то отравленный пакет входит и может уйти с этим отравленным источником, и поэтому правило также включается в OUTPUT?
    Большое спасибо за разъяснения !!!

  7.   Фран сказал

    это мой собственный скрипт iptables, он очень полный:

    # franes.iptables.airoso
    # doc.iptables.airoso: iptables для устаревших версий и для nft
    #
    # порта брандмауэра
    ##########################
    #! / Bin / Баш
    #
    # очистить экран
    ############################# начало /etc/f-iptables/default.cfg |||||
    Очистить
    # оставить пустую строку
    эхо
    экспорт да = »» нет = »эхо выключено»
    # переменные, которые вы можете изменить, чтобы разрешить доступ
    ##################### переменные для изменения с помощью $ yes или $ no
    export hayexcepciones = »$ нет»
    # есть исключения: $ yes, чтобы разрешить исключительные хосты, и $ no, чтобы отключить
    экспорт hayping = »$ нет»
    # hayping: $ yes, чтобы разрешить сторонние эхо-запросы и $ no, чтобы запретить
    экспорт haylogserver = »$ нет»
    # haylogeosserver: $ yes, чтобы иметь возможность регистрировать tcp; $ no, чтобы не иметь возможности регистрировать tcp
    ######
    ##################### переменные для изменения, добавляя "," или с диапазонами ":"
    экспорт исключения = »baldras.wesnoth.org»
    # исключения позволяют одному или нескольким хостам от брандмауэра или без значения
    экспорт logserver = discard, ipp, dict, ssh
    # порты tcp сервера, которые регистрируются при поступлении пакетов
    экспорт redserver = 0/0
    # redserver: сеть для портов сервера предпочтительнее локальная сеть или несколько ips
    экспорт клиента красный = 0/0
    #clientnet: сеть для клиентских портов предпочтительнее всех сетей
    экспорт servidortcp = discard, ipp, dict, 6771
    # servidortcp: указанные порты TCP-сервера
    экспорт serverudp = отбросить
    #udpserver: указанные порты сервера udp
    экспорт clientudp = домен, bootpc, bootps, ntp, 20000: 45000
    #udp client: указанные клиентские порты udp
    экспорт clienttcp = домен, http, https, ipp, git, dict, 14999: 15002
    # tcp client: указанные клиентские порты tcp
    ############################ конец /etc/f-iptables/default.cfg |||||
    ############################## конец переменных для изменения
    экспорт брандмауэра = 1 $ переменные = 2 $
    если ["$ переменные" = "$ NULL"]; затем источник /etc/f-iptables/default.cfg;
    иначе источник / etc / f-iptables / $ 2; фи
    ############################## или перезапишет переменные файлом .cfg
    ############################################### #########################################
    брандмауэр экспорта = 1 $ переменные экспорта = 2 $
    ######################################## автоматические системные переменные
    если ["$ firewall" = "отключен"]; затем эхо ФЕЙЕРВАЛ ОТКЛЮЧЕН;
    экспорт activateserver = »$ no» activateclient = »$ no» wet = »$ no»;
    elif ["$ firewall" = "client"]; затем echo FIREWALL CLIENT;
    экспорт activateserver = »$ no» activateclient = »» wet = »$ no»;
    elif ["$ firewall" = "сервер"]; затем эхо FIREWALL SERVER;
    экспорт activateserver = »» activateclient = »$ no» wet = »$ no»;
    elif ["$ firewall" = "клиент и сервер"]; затем выполните эхо ФЕЙЕРВАЛ КЛИЕНТ И СЕРВЕР;
    экспорт активировать сервер = »»; экспорт activateclient = »»; экспорт мокрый = »$ нет»;
    elif ["$ firewall" = "разрешающий"]; затем эхо РАЗРЕШИТЕЛЬНЫЙ БРАНДВОЙНИК;
    экспорт activateserver = »$ no» activateclient = »$ no» wet = »»;
    еще
    $ check sudo echo iptables-legacy:
    $ check sudo iptables-legacy -v -L ВВОД
    $ проверить sudo iptables-legacy -v -L ВЫХОД
    $ проверить sudo echo iptables-nft:
    $ check sudo iptables-nft -v -L ВВОД
    $ check sudo iptables-nft -v -L ВЫХОД
    эхо _____ параметры ____ $ 0 $ 1 $ 2
    echo "приведение без параметров - это список iptables."
    echo "Первый параметр (включить iptables): отключен или клиент, или сервер, или клиент и сервер, или разрешающий."
    echo "Второй параметр: (необязательно): файл default.cfg выбирает /etc/f-iptables/default.cfg"
    echo "Параметры переменной:" $ (ls / etc / f-iptables /)
    выход 0; фи
    #################
    эхо
    echo Выбрасывает $ 0 отключено или клиент, или сервер, или клиент и сервер, или разрешающий, или переменные, или без использования параметра для вывода списка iptables.
    echo Файл $ 0 содержит внутри несколько редактируемых переменных.
    ############################### указанные выше переменные активированы
    ###############################
    echo установка переменных iptables
    эхо-активированные переменные
    эхо
    ########################## правила iptables
    echo Настройка iptables-legacy
    sudo / usr / sbin / iptables-legacy -t фильтр -F
    sudo / usr / sbin / iptables-legacy -t нат -F
    sudo / usr / sbin / iptables-legacy -t mangle -F
    sudo / usr / sbin / ip6tables-legacy -t фильтр -F
    sudo / usr / sbin / ip6tables-legacy -t нат -F
    sudo / usr / sbin / ip6tables-legacy -t mangle -F
    sudo / usr / sbin / ip6tables-legacy -A INPUT -j DROP
    sudo / usr / sbin / ip6tables-legacy -A OUTPUT -j DROP
    sudo / usr / sbin / ip6tables-legacy -A FORWARD -j DROP
    sudo / usr / sbin / iptables-legacy -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT> / dev / null
    $ haylogserver sudo / usr / sbin / iptables-legacy -A INPUT -p tcp -m multiport –dports $ logserver -j LOG> / dev / null
    $ есть исключения sudo / usr / sbin / iptables-legacy -A INPUT -s $ exceptions -j ACCEPT> / dev / null
    $ активировать sudo server / usr / sbin / iptables-legacy -A INPUT -p udp -m multiport –dports $ serverudp -s $ redserver -d $ redserver -j ACCEPT> / dev / null
    $ активировать сервер sudo / usr / sbin / iptables-legacy -A INPUT -p tcp -m multiport –dports $ serverrtcp -s $ redserver -d $ redserver -j ACCEPT> / dev / null
    $ activateclient sudo / usr / sbin / iptables-legacy -A INPUT -p udp -m multiport –sports $ clientudp -m state –state installed -s $ clientnet -d $ clientnet -j ACCEPT> / dev / null
    $ activateclient sudo / usr / sbin / iptables-legacy -A INPUT -p tcp -m multiport –sports $ clienttcp -m state –state installed -s $ clientnet -d $ clientnet -j ACCEPT> / dev / null
    $ hayping sudo / usr / sbin / iptables-legacy -A INPUT -p icmp –icmp-type echo-reply -j ACCEPT> / dev / null
    sudo / usr / sbin / iptables-legacy -A INPUT -j DROP> / dev / null
    sudo / usr / sbin / iptables-legacy -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT> / dev / null
    $ hayeexceptions sudo / usr / sbin / iptables-legacy -A OUTPUT -d $ exceptions -j ACCEPT> / dev / null
    $ активировать sudo server / usr / sbin / iptables-legacy -A OUTPUT -p udp -m multiport –sports $ serverudp -s $ redserver -d $ redserver -j ACCEPT> / dev / null
    $ активировать сервер sudo / usr / sbin / iptables-legacy -A OUTPUT -p tcp -m multiport –sports $ serverrtcp -s $ redserver -d $ redserver -j ACCEPT> / dev / null
    $ activateclient sudo / usr / sbin / iptables-legacy -A OUTPUT -p udp -m multiport –dports $ clientudp -s $ clientnet -d $ clientnet -j ACCEPT> / dev / null
    $ activateclient sudo / usr / sbin / iptables-legacy -A OUTPUT -p tcp -m multiport –dports $ clienttcp -s $ clientnet -d $ clientnet -j ACCEPT> / dev / null
    $ hayping sudo / usr / sbin / iptables-legacy -A OUTPUT -p icmp –icmp-type echo-request -j ACCEPT> / dev / null
    sudo / usr / sbin / iptables-legacy -A ВЫХОД -j DROP
    sudo / usr / sbin / iptables-legacy -A FORWARD -j DROP
    echo iptables-legacy включен
    эхо
    echo Настройка iptables-nft
    sudo / usr / sbin / iptables-nft -t фильтр -F
    sudo / usr / sbin / iptables-nft -t нат -F
    sudo / usr / sbin / iptables-nft -t mangle -F
    sudo / usr / sbin / ip6tables-nft -t фильтр -F
    sudo / usr / sbin / ip6tables-nft -t нат -F
    sudo / usr / sbin / ip6tables-nft -t mangle -F
    sudo / usr / sbin / ip6tables-nft -A INPUT -j DROP
    sudo / usr / sbin / ip6tables-nft -A OUTPUT -j DROP
    sudo / usr / sbin / ip6tables-nft -A FORWARD -j DROP
    sudo / usr / sbin / iptables-nft -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT> / dev / null
    $ haylogserver sudo / usr / sbin / iptables-nft -A INPUT -p tcp -m multiport –dports $ logserver -j LOG> / dev / null
    $ hayeexceptions sudo / usr / sbin / iptables-nft -A INPUT -s $ exceptions -j ACCEPT> / dev / null
    $ активировать сервер sudo / usr / sbin / iptables-nft -A INPUT -p udp -m multiport –dports $ serverudp -s $ redserver -d $ redserver -j ACCEPT> / dev / null
    $ активировать сервер sudo / usr / sbin / iptables-nft -A INPUT -p tcp -m multiport –dports $ serverrtcp -s $ redserver -d $ redserver -j ACCEPT> / dev / null
    $ activateclient sudo / usr / sbin / iptables-nft -A INPUT -p udp -m multiport –sports $ clientudp -m state –state installed -s $ clientnet -d $ clientnet -j ACCEPT> / dev / null
    $ activateclient sudo / usr / sbin / iptables-nft -A INPUT -p tcp -m multiport –sports $ clienttcp -m state –state installed -s $ clientnet -d $ clientnet -j ACCEPT> / dev / null
    $ hayping sudo / usr / sbin / iptables-nft -A INPUT -p icmp –icmp-type echo-reply -j ACCEPT> / dev / null
    sudo / usr / sbin / iptables-nft -A INPUT -j DROP> / dev / null
    sudo / usr / sbin / iptables-nft -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT> / dev / null
    $ hayeexceptions sudo / usr / sbin / iptables-nft -A OUTPUT -d $ exceptions -j ACCEPT> / dev / null
    $ активировать сервер sudo / usr / sbin / iptables-nft -A OUTPUT -p udp -m multiport –sports $ serverudp -s $ redserver -d $ redserver -j ACCEPT> / dev / null
    $ активировать сервер sudo / usr / sbin / iptables-nft -A OUTPUT -p tcp -m multiport –sports $ serverrtcp -s $ redserver -d $ redserver -j ACCEPT> / dev / null
    $ activateclient sudo / usr / sbin / iptables-nft -A OUTPUT -p udp -m multiport –dports $ clientudp -s $ clientnet -d $ clientnet -j ACCEPT> / dev / null
    $ activateclient sudo / usr / sbin / iptables-nft -A OUTPUT -p tcp -m multiport –dports $ clienttcp -s $ clientnet -d $ clientnet -j ACCEPT> / dev / null
    $ hayping sudo / usr / sbin / iptables-nft -A OUTPUT -p icmp –icmp-type echo-request -j ACCEPT> / dev / null
    sudo / usr / sbin / iptables-nft -A ВЫХОД -j DROP
    sudo / usr / sbin / iptables-nft -A FORWARD -j DROP
    echo iptables-nft включен
    эхо
    $ мокрый sudo / usr / sbin / iptables-legacy -F> / dev / null
    $ wet sudo / usr / sbin / iptables-legacy -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT> / dev / null
    $ wet sudo / usr / sbin / iptables-legacy -A INPUT -m state –state installed -j ACCEPT> / dev / null
    $ мокрый sudo / usr / sbin / iptables-legacy -A INPUT -j DROP> / dev / null
    $ мокрый sudo / usr / sbin / iptables-legacy -A OUTPUT -j ACCEPT> / dev / null
    $ мокрый sudo / usr / sbin / iptables-legacy -A FORWARD -j DROP> / dev / null
    $ мокрый sudo / usr / sbin / iptables-nft -F> / dev / null
    $ wet sudo / usr / sbin / iptables-nft -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT> / dev / null
    $ wet sudo / usr / sbin / iptables-nft -A INPUT -m state –state installed -j ACCEPT> / dev / null
    $ мокрый sudo / usr / sbin / iptables-nft -A INPUT -j DROP> / dev / null
    $ wet sudo / usr / sbin / iptables-nft -A ВЫХОД -j ПРИНЯТЬ> / dev / null
    $ мокрый sudo / usr / sbin / iptables-nft -A FORWARD -j DROP> / dev / null
    ###########################
    эхо вы выбросили $ 0 $ 1 $ 2
    # выходит из скрипта
    выйти из 0

  8.   Луис Дюран сказал

    Как бы мне установить правило, если бы этот брандмауэр использовал его для моего шлюза и имел бы squid в локальной сети ???