Создайте свой собственный брандмауэр с 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.    БроудиДалле сказал

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

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

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

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

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

    Чистим NAT

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

    iptables -A INPUT -p tcp –dport 80 -j ПРИНЯТЬ

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

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

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

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

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

    1.    БроудиДалле сказал

      это правило вам нужно для http из apache
      iptables -A INPUT -p tcp –dport 80 -j ПРИНЯТЬ

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

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

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

  3.   jge сказал

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

    1.    БроудиДалле сказал

      Рекомендую другие варианты:
      1) Можно создать в днс поддельную зону ...
      2) Можно поставить прокси с acl
      греховое эмбарго
      Для iptables это может понравиться ... не всегда лучший вариант (есть другие способы)
      iptables -A INPUT -s блог.desdelinux.ne -j ПАДЕНИЕ
      iptables -A OUTPUT -d блог.desdelinux.net -j ПАДЕНИЕ

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

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

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

    Привет.

  5.   НИЦ сказал

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

    1.    БроудиДалле сказал
  6.   Чарли сказал

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

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

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

    # franes.iptables.airy
    # 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 в локальной сети ???