Вопрос: Советы и подсказки iptables


Я уверен, что системные администраторы Linux хорошо знакомы с iptables, пользовательский интерфейс к netfilter пакетная фильтрация.

Теперь этот «вопрос» должен быть Сообщество для сбора различных бит-n-частей iptables мудрость. Ничто не слишком распространено или слишком неясное. Опубликуйте все, что вы знаете, что поможет другим максимально использовать iptables,


57
2018-03-10 14:15


Источник




Ответы:


Использование белого списка и черного списка с iptables

#!/bin/bash

WHITELIST=/whitelist.txt
BLACKLIST=/blacklist.txt

#THIS WILL CLEAR ALL EXISTING RULES!
echo 'Clearing all rules'
iptables -F

#
## Whitelist
#

for x in `grep -v ^# $WHITELIST | awk '{print $1}'`; do
        echo "Permitting $x..."
        $IPTABLES -A INPUT -t filter -s $x -j ACCEPT
done

#
## Blacklist
#

for x in `grep -v ^# $BLACKLIST | awk '{print $1}'`; do
        echo "Denying $x..."
        $IPTABLES -A INPUT -t filter -s $x -j DROP
done

Скрипт для открытия портов

#!/bin/bash
ALLOWEDTCP="80 3128 3784"
ALLOWEDUDP="3128 3784"

#
## Permitted Ports
#

for port in $ALLOWEDTCP; do
       echo "Accepting port TCP $port..."
       $IPTABLES -A INPUT -t filter -p tcp --dport $port -j ACCEPT
done

for port in $ALLOWEDUDP; do
        echo "Accepting port UDP $port..."
        $IPTABLES -A INPUT -t filter -p udp --dport $port -j ACCEPT
done

Блокировка порта

# Attempt to block portscans
# Anyone who tried to portscan us is locked out for an entire day.
iptables -A INPUT   -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP

# Once the day has passed, remove them from the portscan list
iptables -A INPUT   -m recent --name portscan --remove
iptables -A FORWARD -m recent --name portscan --remove

# These rules add scanners to the portscan list, and log the attempt.
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

Поддельные / Недействительные пакеты

# Reject spoofed packets
# These adresses are mostly used for LAN's, so if these would come to a WAN-only server, drop them.
iptables -A INPUT -s 10.0.0.0/8 -j DROP
iptables -A INPUT -s 169.254.0.0/16 -j DROP
iptables -A INPUT -s 172.16.0.0/12 -j DROP
iptables -A INPUT -s 127.0.0.0/8 -j DROP

#Multicast-adresses.
iptables -A INPUT -s 224.0.0.0/4 -j DROP
iptables -A INPUT -d 224.0.0.0/4 -j DROP
iptables -A INPUT -s 240.0.0.0/5 -j DROP
iptables -A INPUT -d 240.0.0.0/5 -j DROP
iptables -A INPUT -s 0.0.0.0/8 -j DROP
iptables -A INPUT -d 0.0.0.0/8 -j DROP
iptables -A INPUT -d 239.255.255.0/24 -j DROP
iptables -A INPUT -d 255.255.255.255 -j DROP

# Drop all invalid packets
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP

Блокировать атаки Smurf

# Stop smurf attacks
iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p icmp -m icmp -j DROP

# Drop excessive RST packets to avoid smurf attacks
iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT

Блок ICMP (иначе ping)

# Don't allow pings through
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j DROP

25



Подумайте о добавлении комментария к «поддельным» комментариям, чтобы менее опытные пользователи знали, почему исходные адреса считаются поддельными (... при поступлении на wan-интерфейс). - 3molo
Хороший звонок :-). Готово. - Bart De Vos
Подождите. Не изолирована ли линия ICMP (aka ping) для блокировки атаки smurf: iptables -A INPUT -p icmp -m icmp -j DROP? - Stann
также - вот объяснение для многих пунктов, описанных здесь: newartisans.com/2007/09/neat-tricks-with-iptables.html - Stann
Переименуйте белый список: Theres iptables в строке 8, а затем $IPTABLES позже. Достаточно ли просто использовать iptables везде? В противном случае, я полагаю, вам нужно присвоить что-то вроде IPTABLES=/sbin/iptables правильно? - UpTheCreek


Оптимизация производительности netfilter с использованием ipset

Если вы напишете много аналогичных правил, основанных на простом IP, порту или и том и другом, рассмотрите возможность использования ipset для оптимизации производительности netfilter.

Например:

iptables -s 192.168.1.11 -j ACCEPT
iptables -s 192.168.1.27 -j ACCEPT
iptables -s 192.168.1.44 -j ACCEPT
... hundreds of similar rules ...
iptables -s 192.168.251.177 -j ACCEPT

Это означает, что пакет с исходным адресом 192.168.251.177 должен сначала пройти сотни правил, прежде чем он сможет получить свой вердикт ACCEPT.

Конечно, опытные системные администраторы будут разделять правила по подсети. Но затем все еще означает сотни правил.

ipset в помощь!

Сначала определите набор IP-адресов ipmap тип:

ipset -N Allowed_Hosts ipmap --network 192.168.0.0/16

Затем запишите его по адресам:

for ip in $LIST_OF_ALLOWED_IP; do ipset -A Allowed_Hosts $ip; done

Наконец, замените сотни правил iptables выше один правило:

iptables -m set --match-set Allowed_Hosts src -j ACCEPT

Когда пакет поступит, netfilter выполнит очень быстрый растровый поиск IP-адреса источника пакета (src) Allowed_Hosts IP. Все пакеты, исходящие от 192.168.0.0/16, будут один править. И поверьте мне, что поиск растрового изображения по меньшей мере на два порядка величин быстрее, чем выполнение сотен правил проверки iptables.

ipset не ограничивается IP-адресами. Он также может соответствовать на основе портов, кортежей IP-портов, адресов сети / подсети, кортежа IP-MAC и т. Д. И т. Д. И он может соответствовать этим критериям как источник или пункт назначения, либо сочетание обоих (в случае кортежей).

И, наконец, с ipset вы можете автоматически помещать IP-адреса в черные списки / белые списки. Эти черные списки / «белые списки» также могут «стареть», таким образом автоматически удаляя IP-адрес после того, как пройденное время будет выполнено.

Пожалуйста, обратитесь к ipsetсправочная страница Больше подробностей.

ОЧЕНЬ ВАЖНОЕ ПРИМЕЧАНИЕ:

Некоторые дистрибутивы Linux могут не иметь «вне коробки» поддержку для ipset (например, Ubuntu 10.04 имел эту проблему). В этих системах одним из способов является установка ipset из исходного кода.

Вместо этого загрузите ipsetисточник с веб-сайта: http://ipset.netfilter.org/install.html

Кроме того, если вы используете xtables-addons, ipset является включен в его источник: http://xtables-addons.sourceforge.net/


23



Очень жаль, что он не поддерживается по умолчанию на Debian и Ubuntu. Я думал, ты собираешься перечислить некоторые захватывающие дистрибутивы: / - UpTheCreek
@UpTheCreek Я отредактировал свой ответ ... «специальное примечание» было применимо во время публикации ответа, но теперь оно больше не применимо. - pepoluan


Добавьте комментарии к своим правилам:

-m comment --comment "Comments help to read output of iptables -nvL"

21





Блокировка хорошо известных TCP-атак

Добавьте следующие правила, предпочтительно в -t raw -A PREROUTING

-p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
-p tcp --tcp-flags SYN,RST SYN,RST -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP

Блокируются атаки:

  • Атака SYN-FIN
  • Атака SYN-RST
  • Атака X-Mas
  • nmap FIN scan
  • Атака NULLflags
  • Атака ALLflags

(не стесняйтесь редактировать имена атак выше)


16



-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP могут быть удалены, поскольку -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP поймает каждый пакет, который он может заблокировать. - Ael Ombreglace
В соответствии с security.stackexchange.com/questions/4603/..., «Нет необходимости отбрасывать недействительные или некорректные пакеты, все эти атаки - десятилетие. Разработчики ядра Linux намного более современны, чем вы, касающиеся того, какие типы пакетов действительны, а какие нет.« Что относительно будущих недостатков », , некоторые могут спорить. Ну, как вы знаете, что будущий недостаток будет в обработчике TCP, а не в парсере TCP iptables? " - Matt
Это все еще применимо? - Vlastimil
@VlastimilBurian теоретически они больше не нужны. Но добавление этих правил не замедляет работу сети и не увеличивает нагрузку на ЦП, поэтому я не вижу причин не добавлять их и забывать о них - pepoluan


Включение NAT

  1. echo 1 > /proc/sys/net/ipv4/ip_forward 
  2. /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Шаг 1 задает параметр ядра, позволяющий переадресацию ip, шаг 2 устанавливает правило iptables, которое позволяет NAT на интерфейсе eth0.


7



Это не будет продолжаться через перезагрузку, не так ли? Вы должны отредактировать /etc/sysctl.conf  net.ipv4.ip_forward = 1, (Предполагая, что Red Hat или производная.) - Aaron Copley


Блокировать атаки ICMP

Добавьте следующие правила, предпочтительно в -t raw -A PREROUTING

-p icmp -m u32 ! --u32 "4&0x3FFF=0"   -j DROP
-p icmp -m length --length 1492:65535 -j DROP

Первое правило блокирует все ICMP-пакеты, чей «флаг фрагментации» не равен 0. (ICMP должен никогда быть фрагментированным; они должны нести небольшую полезную нагрузку)

Второе правило блокирует негабаритные неразмещенные ICMP-пакеты.


6



Разве это не остановит MTU Discovery? - Matt
@Matt no, потому что обнаружение пути MTU использует пакеты размером не более, чем размер полезной нагрузки Ethernet, т. Е. 1500 байт, из которых 8 байтов используются заголовком IP и заголовком ICMP. - pepoluan
Спасибо за разъяснение, но 1492-64k? почему это не 1500-65k. Я могу понять 1492 для PPPoE, но прямой ethernet. - Matt
Это все еще применимо? - Vlastimil
@VlastimilBurian Я бы сказал, да. По-прежнему нет необходимости в больших пакетах ICMP. - pepoluan


с помощью FireHOL - удобная обертка iptables

Я нашел его более интуитивным, чем прямые команды iptables. Специально для людей с прошлым опытом работы с другими брандмауэрами:

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


4



Я предпочитаю Shorewall, который активно развивается, поддерживает IPv4 и IPv6, и может создавать брандмауэры для других систем iptables. - BillThor
@BillThor звучит как хороший инструмент - спасибо - Ophir Yoktan


(из моего файла iptables_tricks.txt, перекомпилированного из множества мест: P)

Заставляет iptables ждать 15 секунд между новыми соединениями с одного и того же IP-порта на порту 22 (SSH):

 iptables -A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --update --seconds 15 -j DROP
 iptables -A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --set -j ACCEPT

4



То же, но с подсчетом попыток: -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH  -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH -j DROP - alexm


Видеоуроки IPTABLES

Серия 1 http://www.youtube.com/watch?v=ldB8kDEtTZA&feature=player_embedded

Эпизод 2 http://www.youtube.com/watch?v=aDaEXxRHeXY&feature=related

Заключительный эпизод

http://www.youtube.com/watch?v=JojqHKcSxpo&feature=player_embedded

Будет хорошим началом для любого новичка.


3



очень хороший учебник - Stann


Повторный набор IP-адресов

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

Обозначения, используемые ниже

Для ipset Я буду использовать обозначение, прочитанное ipset restore и написано ipset save,

Соответственно для iptables (а также ip6tables) правила Я буду использовать обозначение, как прочитанное iptables-restore и написано iptables-save, Это дает более короткую нотацию, и это позволяет мне выделить потенциальный IPv4-only (префикс -4) или только IPv6 (с префиксом -6).

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

Расширенный набор IP-адресов

Наборы IP могут делать намного больше, чем упоминалось в другой ответ и вам обязательно нужно прочитать документацию по IP-настройке (ipset(8)) вместе с iptables-extensions(8) в дополнение к этой краткой записи здесь.

Например, в основном я сосредоточусь на трех типах: hash:ip, hash:net а также list:set, но их больше, чем у всех, и все они имеют допустимые варианты использования.

Вы можете, например, также совместить номера портов, а не только IP-адреса,

Сохранение и восстановление IP-наборов, как с iptables-save а также iptables-restore

Вы можете создавать объявления набора IP-пакетов в массовом порядке и импортировать их, ipset restore, Если вы хотите сделать свою команду более устойчивой к уже существующим записям, используйте ipset -exist restore,

Если ваши правила находятся в файле с именем default.set вы должны использовать:

ipset -exist restore < default.set

Такой файл может содержать записи для create множеств и add записи в них. Но обычно большинство команд из командной строки, похоже, имеют соответствующую версию в файлах. Пример (создание набора DNS-серверов):

create dns4 hash:ip family inet
create dns6 hash:ip family inet6
# Google DNS servers
add dns4 8.8.8.8
add dns4 8.8.4.4
add dns6 2001:4860:4860::8888
add dns6 2001:4860:4860::8844

Здесь один набор создан для IPv4 (dns4) и один для IPv6 (dns6).

Таймауты на IP-сетях

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

Способ, которым это работает, выглядит следующим образом (по умолчанию при создании наборов IP):

create ssh_loggedon4 hash:ip  family inet  timeout 5400
create ssh_loggedon6 hash:ip  family inet6 timeout 5400
create ssh_dynblock4 hash:ip  family inet  timeout 1800
create ssh_dynblock6 hash:ip  family inet6 timeout 1800

Мы вернемся к этим конкретным наборам ниже и объясним, почему они настроены так, как они есть.

Если вы хотите установить тайм-аут для определенного IP-адреса, вы можете просто сказать:

add ssh_dynblock4 1.2.3.4 timeout 7200

Для блокировки IP 1.2.3.4 в течение двух часов вместо (заданного) значения по умолчанию полчаса.

Если вы посмотрите на это с помощью ipset save ssh_dynblock4 через некоторое время вы увидите что-то вроде:

create ssh_dynblock4 hash:ip family inet hashsize 1024 maxelem 65536 timeout 1800
add ssh_dynblock4 1.2.3.4 timeout 6954

Предостережения по тайм-ауту

  • таймауты - это функция на любом заданном наборе. Если набор не был созданный с поддержкой тайм-аута вы получите сообщение об ошибке (например, Kernel error received: Unknown error -1).
  • таймауты даются в секундах. Например, используйте арифметические выражения Bash, чтобы получить от нескольких минут до нескольких секунд. Например.: sudo ipset add ssh_dynblock4 1.2.3.4 timeout $((120*60))

Проверка наличия записи в заданном наборе IP-адресов

Внутри ваших скриптов может быть полезно увидеть, существует ли запись. Этого можно достичь с помощью ipset test который возвращает ноль, если запись существует и не равна нулю в противном случае. Поэтому обычные скрипты могут применяться в скрипте:

if ipset test dns4 8.8.8.8; then
  echo "Google DNS is in the set"
fi

Однако во многих случаях вы предпочитаете использовать -exist переключить на ipset чтобы он не жаловался на существующие записи.

Заполнение IP-наборов из iptables правила

Это, на мой взгляд, является одной из особенностей набора IP-адресов. Вы не только можете сопоставлять записи IP-набора, но также можете добавлять новые записи в существующий набор IP-адресов.

Например, в этот ответ на этот вопрос у вас есть:

-A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --update --seconds 15 -j DROP
-A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --set -j ACCEPT

... с намерением ограничить скорость подключения к SSH (TCP-порт 22). Используемый модуль recent отслеживает недавние попытки подключения. Вместо state модуль, я предпочитаю conntrack модуль.

# Say on your input chain of the filter table you have
   -A INPUT -i eth+ -p tcp --dport ssh -j SSH
# Then inside the SSH chain you can
# 1. create an entry in the recent list on new connections
   -A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
# 2. check whether 3 connection attempts were made within 2 minutes
#    and if so add or update an entry in the ssh_dynblock4 IP set
-4 -A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock4 src --exist
-6 -A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock6 src --exist
# 3. last but not least reject the packets if the source IP is in our
#    IP set
-4 -A SSH -m set --match-set ssh_dynblock4 src -j REJECT
-6 -A SSH -m set --match-set ssh_dynblock6 src -j REJECT

В этом случае я перенаправляю поток на SSH такой, что мне не нужно повторять -p tcp --dport ssh для каждого отдельного правила.

Повторить:

  • -m set марки iptables осознавая, что мы используем переключатели из set модуль (который обрабатывает IP-наборы)
  • --match-set ssh_dynblock4 src говорит iptablesсоответствовать источник (src) адрес против именованного набора (ssh_dynblock4)
    • это соответствует sudo ipset test ssh_dynblock4 $IP (где $IP содержит исходный IP-адрес для пакета)
  • -j SET --add-set ssh_dynblock4 src --exist добавляет или обновляет источник (src) адрес из пакета в набор IP ssh_dynblock4, Если существует запись (--exist), он будет просто обновлен.
    • это соответствует sudo ipset -exist add ssh_dynblock4 $IP (где $IP содержит исходный IP-адрес для пакета)

Если вы хотите совместить целевой / целевой адрес, вы должны использовать dst вместо src, Подробнее см. В руководстве.

Наборы множеств

Наборы IP могут содержать другие наборы. Теперь, если вы последовали за этой статьей, вы спросите, возможно ли комбинировать наборы. И, конечно же, это так. Для наборов IP сверху мы можем создать два совместных набора ssh_dynblock а также ssh_loggedon соответственно, чтобы содержать только IPv4-only и IPv6-only:

create ssh_loggedon4 hash:ip  family inet  timeout 5400
create ssh_loggedon6 hash:ip  family inet6 timeout 5400
create ssh_dynblock4 hash:ip  family inet  timeout 1800
create ssh_dynblock6 hash:ip  family inet6 timeout 1800
# Sets of sets
create ssh_loggedon  list:set
create ssh_dynblock  list:set
# Populate the sets of sets
add ssh_loggedon ssh_loggedon4
add ssh_loggedon ssh_loggedon6
add ssh_dynblock ssh_dynblock4
add ssh_dynblock ssh_dynblock6

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

И ответ на это звучит: ДА! (увы, это не было зафиксировано явно в прошлый раз, когда я проверил)

Следовательно, правила из предыдущего раздела можно переписать следующим образом:

-A INPUT -i eth+ -p tcp --dport ssh -j SSH
-A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
-A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock src --exist
-A SSH -m set --match-set ssh_dynblock src -j REJECT

что намного более кратким. И да, это проверено и проверено и работает как шарм.

Объединяя все это: защита SSH от грубой силы

На моих серверах у меня есть сценарий, выполняемый как cron работа, которая берет кучу имен узлов и решает их по IP-адресам, а затем подает их в набор IP для «доверенных хостов». Идея состоит в том, что доверенные хосты получают больше попыток входа на сервер и не обязательно блокируются до тех пор, пока кто-либо еще.

И наоборот, у меня есть целые страны, заблокированные от подключения к моему SSH-серверу, с (потенциальным) исключением доверенных хостов (т. Е. Порядок правил).

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

Важно помнить, что тайм-ауты по умолчанию составляют 90 минут для ssh_loggedon и 30 минут для ssh_dynblock при рассмотрении следующих iptables правила:

-A INPUT -i eth+ -p tcp --dport ssh -j SSH
-A SSH -m set --match-set ssh_loggedon src -j ACCEPT
-A SSH -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
-A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock src --exist
-A SSH -m set --match-set ssh_dynblock src -j REJECT

К настоящему моменту вы должны спросить себя, как соединительный IP-адрес попадает в ssh_loggedon подмножества. Так что читайте дальше ...

Бонус: добавление IP-адреса, с которым вы входите в систему во время входа в систему SSH

Если вы экспериментировали с sshrc и друзья, вы узнаете о его недостатках. Но PAM приходит на помощь. Модуль, названный pam_exec.so позволяет нам вызывать скрипт во время входа в систему SSH в тот момент, когда мы знаем, что пользователь допущен.

В /etc/pam.d/sshd ниже pam_env а также pam_selinux записи добавляют следующую строку:

session    optional     pam_exec.so stdout /path/to/your/script

и убедитесь, что ваша версия скрипта (/path/to/your/script выше) существует и является исполняемым.

PAM использует переменные среды для обмена информацией о том, что происходит, поэтому вы можете использовать простой скрипт, подобный этому:

#!/bin/bash
# When called via pam_exec.so ...
SETNAME=ssh_loggedon
if [[ "$PAM_TYPE" == "open_session" ]] && [[ -n "$PAM_RHOST" ]]; then
    [[ "x$PAM_RHOST" != "x${PAM_RHOST//:/}" ]] && SETNAME="${SETNAME}6" || SETNAME="${SETNAME}4"
    ipset -exist add $SETNAME "$PAM_RHOST"
fi

К сожалению, ipset У утилиты нет встроенных интеллектуальных фильтров. Поэтому при добавлении нашей записи нам нужно различать IPv4 и IPv6 IP. В противном случае ipset предположим, что мы хотим добавить еще один задавать к набору множеств, а не к IP. И, конечно, маловероятно, что будет набор, названный в честь IP :)

Поэтому мы проверяем : в IP-адрес и добавить 6 к указанному имени в таком случае и 4 в противном случае.

Конец.


3





Другим графическим интерфейсом, который можно использовать для настройки iptables, является Firewall Builder, Он позволяет пользователям создавать элементы правил как объекты в базе данных, а затем перетаскивать эти объекты в редактор правил для создания необходимой политики брандмауэра. Затем приложение генерирует файл сценария со всеми командами iptables, необходимыми для реализации правил.

В отличие от некоторых других графических решений iptables, где вы можете управлять только одной конфигурацией iptables за один раз, с помощью Firewall Builder вы можете управлять большим количеством конфигураций iptables из одного приложения. Firewall Builder работает на Linux, Windows и Mac OS X, существует уже более 10 лет и имеет тысячи активных пользователей по всему миру.

Полное раскрытие информации - я являюсь соучредителем NetCitadel, который является компанией, которая разрабатывает Firewall Builder.


2