Рубрики
iptables \ Fail2ban

ipset / systemd / Centos 7

Ссылки:

https://bozza.ru/art-297.html
https://github.com/BroHui/systemd-ipset-service
https://wiki.fysik.dtu.dk/it/Linux_firewall_configuration

Создаем файл vim /usr/lib/systemd/system/ipset.service

[Unit]
Description=IP sets for iptables
Before=iptables.service
Before=ip6tables.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/libexec/ipset/ipset.start-stop start
ExecStop=/usr/libexec/ipset/ipset.start-stop stop
ExecReload=/usr/libexec/ipset/ipset.start-stop reload
# Save current ipset entries on stop/restart.
#   Value: yes|no,  default: no
# Saves all ipsets to /etc/sysconfig/ipset if ipset gets stopped
Environment=IPSET_SAVE_ON_STOP=no IPSET_SAVE_ON_RESTART=no

[Install]
WantedBy=basic.target

Создаем каталоги для ipset

mkdir /usr/libexec/ipset /etc/ipset

Создаем файл vim /usr/libexec/ipset/ipset.start-stop

#!/bin/bash
#
# ipset      Start and stop ipset firewall sets
#
# config: /etc/ipset/ipset
#

IPSET=ipset
IPSET_BIN=/usr/sbin/${IPSET}
IPSET_DATA=/etc/${IPSET}/${IPSET}

IPTABLES_CONFIG=/etc/sysconfig/iptables-config
IP6TABLES_CONFIG=${IPTABLES_CONFIG/iptables/ip6tables}

TMP_FIFO=/tmp/${IPSET}.$$

if [[ ! -x ${IPSET_BIN} ]]; then
	echo "${IPSET_BIN} does not exist."
	exit 5
fi

CLEAN_FILES=TMP_FIFO
trap "rm -f \$CLEAN_FILES" EXIT

# Default ipset configuration:
[[ -z $IPSET_SAVE_ON_STOP ]] && IPSET_SAVE_ON_STOP=no		# Overridden by ip(6)tables IP(6)TABLES_SAVE_ON_STOP
[[ -z $IPSET_SAVE_ON_RESTART ]] && IPSET_SAVE_ON_RESTART=no	# Overridden by ip(6)tables IP(6)TABLES_SAVE_ON_RESTART

# Load iptables configuration(s)
[[ -f "$IPTABLES_CONFIG" ]] && . "$IPTABLES_CONFIG"
[[ -f "$IP6TABLES_CONFIG" ]] && . "$IP6TABLES_CONFIG"

# It doesn't make sense to save iptables config and not our config
[[ ${IPTABLES_SAVE_ON_STOP} = yes || ${IP6TABLES_SAVE_ON_STOP} = yes ]] && IPSET_SAVE_ON_STOP=yes
[[ ${IPTABLES_SAVE_ON_RESTART} = yes || ${IP6TABLES_SAVE_ON_RESTART} = yes ]] && IPSET_SAVE_ON_RESTART=yes

check_can_unload() {
    # If the xt_set module is loaded and can't be unloaded, then iptables is
    # using ipsets, so refuse to stop the service.
    if [[ -n $(lsmod | grep "^xt_set ") ]]; then
	rmmod xt_set 2>/dev/null
	[[ $? -ne 0 ]] && echo Current iptables configuration requires ipsets && return 1
    fi

    return 0
}

flush_n_delete() {
    local ret=0 set

    # Flush sets
    ${IPSET_BIN} flush
    let ret+=$?

    # Delete ipset sets. If we don't do them individually, then none
    # will be deleted unless they all can be.
    for set in $(${IPSET_BIN} list -name); do
	    ${IPSET_BIN} destroy 2>/dev/null
	    [[ $? -ne 0 ]] && ret=1
    done

    return $ret
}

start_clean()
{
    mkfifo -m go= "${TMP_FIFO}"
    [[ $? -ne 0 ]] && return 1

    # Get the lists of sets in current(old) config and new config
    old_sets="$(${IPSET_BIN} list -name | sort -u)"
    new_sets="$(grep ^create "${IPSET_DATA}" | cut -d " " -f 2 | sort -u)"

    # List of sets no longer wanted
    drop_sets="$( printf "%s\n" "${old_sets}" > "${TMP_FIFO}"  &
		  printf "%s\n" "${new_sets}" | comm -23 "${TMP_FIFO}" -
		)"

    # Get rid of sets no longer needed
    # Unfortunately -! doesn't work for destroy, so we have to do it a command at a time
    for dset in $drop_sets; do
	ipset destroy $dset 2>/dev/null
	# If it won't go - ? in use by iptables, just clear it
	[[ $? -ne 0 ]] && ipset flush $dset
    done

    # Now delete the set members no longer required
    ${IPSET_BIN} save | grep "^add " | sort >${TMP_FIFO} &
      grep "^add " ${IPSET_DATA} | sort | comm -23 ${TMP_FIFO} - | sed -e "s/^add /del /" \
      | ${IPSET_BIN} restore -!

    # At last we can add the set members we haven't got
    ipset restore -! <${IPSET_DATA}

    rm ${TMP_FIFO}

    return 0
}

start() {
    # Do not start if there is no config file.
    [[ ! -f "$IPSET_DATA" ]] && echo "Loaded with no configuration" && return 0

    # We can skip the first bit and do a simple load if
    # there is no current ipset configuration
    res=1
    if [[ -n $(${IPSET_BIN} list -name) ]]; then
	# The following may fail for some bizarre reason
	start_clean
	res=$?

	[[ $res -ne 0 ]] && echo "Some old configuration may remain"
    fi

    # res -ne 0 => either start_clean failed, or we didn't need to run it
    if [[ $res -ne 0 ]]; then
	# This is the easy way to start but would leave any old
	# entries still configured. Still, better than nothing -
	# but fine if we had no config
	${IPSET_BIN} restore -! <${IPSET_DATA}
	res=$?
    fi

    if [[ $res -ne 0 ]]; then
	return 1
    fi

    return 0
}

stop() {
    # Nothing to stop if ip_set module is not loaded.
    lsmod | grep -q "^ip_set "
    [[ $? -ne 0 ]] && return 6

    flush_n_delete
    [[ $? -ne 0 ]] && echo Warning: Not all sets were flushed/deleted

    return 0
}

save() {
    # Do not save if ip_set module is not loaded.
    lsmod | grep -q "^ip_set "
    [[ $? -ne 0 ]] && return 6

    [[ -z $(${IPSET_BIN} list -name) ]] && return 0

    ret=0
    TMP_FILE=$(/bin/mktemp -q /tmp/$IPSET.XXXXXX) \
	&& CLEAN_FILES+=" $TMP_FILE" \
	&& chmod 600 "$TMP_FILE" \
	&& ${IPSET_BIN} save > $TMP_FILE 2>/dev/null \
	&& [[ -s $TMP_FILE ]] \
	|| ret=1

    if [[ $ret -eq 0 ]]; then
	# No need to do anything if the files are the same
	if [[ ! -f $IPSET_DATA ]]; then
	    mv $TMP_FILE $IPSET_DATA && chmod 600 $IPSET_DATA || ret=1
	else
	    diff -q $TMP_FILE $IPSET_DATA >/dev/null
	
	    if [[ $? -ne 0 ]]; then
		if [[ -f $IPSET_DATA ]]; then
		    cp -f --preserve=timestamps $IPSET_DATA $IPSET_DATA.save \
			&& chmod 600 $IPSET_DATA.save \
			|| ret=1
		fi
		if [[ $ret -eq 0 ]]; then
		    cp -f --preserve=timestamps $TMP_FILE $IPSET_DATA \
			&& chmod 600 $IPSET_DATA \
			|| ret=1
		fi
	    fi
	fi
    fi

    rm -f $TMP_FILE
    return $ret
}


case "$1" in
    start)
	start
	RETVAL=$?
	;;
    stop)
	check_can_unload || exit 1
	[[ $IPSET_SAVE_ON_STOP = yes ]] && save
	stop
	RETVAL=$?
	[[ $RETVAL -eq 6 ]] && echo "${IPSET}: not running" && exit 0
	;;
    reload)
	[[ $IPSET_SAVE_ON_RESTART = yes ]] && save
	stop
	RETVAL=$?
	[[ $RETVAL -eq 6 ]] && echo "${IPSET}: not running" && exit 0
	start
	RETVAL=$?
	;;
    *)
	echo "Usage: $IPSET {start|stop|reload}" >&2
	exit 1
esac

exit $RETVAL

Готовим каталоги и выдаем права на файлы:

chmod 755 /usr/lib/systemd/system/ipset.service /usr/libexec/ipset/ipset.start-stop

Первое использование:

Добавляем в автозапуск:
systemctl enable ipset

Сохраняем текущие состояние ipset:
ipset save > /etc/ipset/ipset

Очищаем:
ipset flush

Запускаем демон ipset:
systemctl start ipset

Проверяем что получилось:
ipset list
Рубрики
iptables \ Fail2ban Конспект

iptables: конспект / iptables / conntrack / NAT / sysctl

Ссылки:

https://ru.wikibooks.org/wiki/Iptables

https://old.calculate-linux.org/main/ru/iptables

https://wiki.dieg.info/iptables
https://wiki.dieg.info/nat

http://dragonflybsd.blogspot.com/2016/04/conntrack.html
http://conntrack-tools.netfilter.org/manual.html

http://sysadminblog.ru/linux/2012/05/22/primery-ispolzovaniya-iptables.html

https://habr.com/ru/company/ruvds/blog/580648/

Linux: IPTABLES – руководство: часть 4 – цели для правил


трафик_микротик трафик_mikrotik трафик_две_сетевушки chains netfilter

Таблицы и цепочки:

По умолчанию мы имеем три таблицы: FILTER, NAT, MANGLE
По умолчанию мы имеем пять цепочек: PREROUTING, FORWARD, POSTROUTING, INPUT, OUTPUT 
 
filter: (DROP, LOG, ACCEPT, REJECT)
-FORWARD - цепочка используется для фильтрацию пакетов, идущих транзитом через брандмауэр.
-INPUT - через эту цепочку проходят пакеты, которые предназначены локальным приложениям(брандмауэр).
-OUTPUT - используются для фильтрации исходящих пакетов, сгенерированных приложениями на самом брандмауэре.
 
nat: (DNAT,SNAT)
-PREROUTING - используется для внесения изменений на ходе брандмауэра. (dnat)
-OUTPUT - предназначена для преобразования пакетов, созданных приложениями внутри брандмауэра, перед принятием решения о маршрутизации.
-POSTROUTING - применяется для преобразования пакетов перед выдачей их во вне. (snat)
 
mangle: (MARK,TOS,TTL)
-PREROUTING - используется для внесения изменений в  пакеты на входе брандмауэра.
-POSTROUTING - применяется для изменения в пакеты перед выдачей их во вне.
-INPUT - через эту цепочку проходят пакеты, которые предназначены локальным приложениям(брандмауэру).
-FORWARD - используется для модификации заголовков пакетов, идущих транзитом через брандмауэр.
-OUTPUT - для внесения изменений в заголовок пакетов, поступающих от приложений внутри брандмауэра.

Порядок прохождения транзитных пакетов:
mangle PREROUTING
nat PREEOUTING
mangle FORWARD
filter FORWARD
mangle POSTROUTING
nat POSTROUTING
 
Порядок прохождения пакетов предназначенных для приложения компьютера:
mangle PREPOUTING
nat PREROUTING
mangle INPUT
filter INPUT
 
Порядок прохождения пакетов  отправленные приложениями компьютера:
mangle OUTPUT
nat OUTPUT
filter OUTPUT
mangle POSTROUTING
nat POSTROUTING

NAT - NETWORK ADDRESS TRANSLATION
RFC-1918 - документ по не маршрутизированным адресам
SNAT - замена IP-адреса или порта источника (Например настройка доступа к интернету для ПК из локальной сети через маршрутизатор)
DNAT - замена IP-адреса или порта назначения (Например доступ из интернета на ПК в локальной сети)
MASQUERADE - разбирается сам что куда подменять (используется когда у вас нет постоянного внешнего IP, или получаете его по DHCP)
REDIRECT - выполняет перенаправление пакетов и потоков на другой порт той же самой машины

Настройка политики

!!! По умолчанию политика ACCEPT
Отбрасываем все входящие подключения:
!!! Рекомендуется для построения firewall, запрещено все кроме разрешённого
iptables -P INPUT DROP

Отбрасываем идущий трафик через нас:
iptables -P FORWARD DROP

Отбрасываем исходящий трафик:
!!! обычно не используется
iptables -P OUTPUT DROP

IPTABLES основное:

!!! если не указывать таблицу по умолчанию таблица FILTER.
!!! L: Вывести список правил.
!!! v: Отображение подробной информации. Этот ключ будет выводить имя интерфейса, параметры правил и маски TOS. 
!!! n: Не резолвить IP адреса, показывать в цифровом виде. Ускоряет вывод.
!!! --line-numbers: показать номер правила в цепочке
!!! Счетчики пакетов и байтов, также будут показаны в списке, с 'K' суффиксом, 'М' или 'G' в зависимости от необходимого множителя.

Отображение состояния брандмауэра / Показать текущие правила (по умолчанию таблица FILTER):
iptables -L -n -v 

Показать текущие правила  с номером строки (по умолчанию таблица FILTER):
iptables -n -L -v --line-numbers

Показать таблицу Filter:
iptables -L -n -v -t filter

Показать таблицу NAT:
iptables -n -t nat -L

Показать таблицу MANGLE:
iptables -n -t mangle -L

Показать из таблицы FILTER цепочку INPUT 
iptables -L INPUT -n -v 

Показать из таблицы FILTER цепочку OUTPUT
iptables -L OUTPUT -n -v --line-numbers

Построение правил в iptables

iptables [-t table] command [match] [target/jump]
command:
-A - добавить правило в конец цепочки (APPEND)
-D - удалить правило из цепочки (DELETE)
-R - заменить одно правило другим (REPLACE)
-I - вставить правило в указанное место в цепочке (INSERT) (по умолчанию вставляет в начало)
-L - показать список правил (LIST)
-F - очистить цепочку или таблицу (FLUSH)
-Z - обнулить счетчики (ZERO)
-N - создать цепочку пользователя (NEW)
-X - удалить цепочку пользователя 
-P - установить политику по умолчанию (DROP, ACCEPT)

Общие критерии match
-p - протокол (-p tcp)
-s - определяет IP-адрес источника (-s 10.0.0.1)
-d - определяет  IP-адрес назначения
-i - определяет входящий интерфейс
-o - определяет исходящий интерфейс (o eth0)
-f - определяет фрагментыm фрагментированного пакета (!-f) 
 
!!! Символ "!" инвертирует значение параметра.

Критерии:

TCP критерии:
    --sport - порт источника
    --dport - порт назначения (--dport 1024:65535)
    --tcp-flags - определение TCP-флагов
    --syn - запрос на соединение

UDP критерии:
    --sport - порт источника
    --dport - порт назначения

ICMP критерии:
    --icmp-type - определяет тип ICMP пакета (--icmp-type echo-request)

Действия(-j):

ACCEPT - принять пакеты
DROP - сбросить пакет
REJECT - сбросить пакет с сообщение об ошибке
RETURN - возвращает из цепочки
LOG - помещает информацию в системный журна

Терминальные и нетерминальные действия:


Терминальными называются действия, которые прерывают прохождение пакета через текущую базовую цепочку. 
То есть если к пакету в рамках некоторого правила было применено терминальное действие,
 он уже не проверяется на соответствие всем следующим правилам в этой цепочке (и в тех цепочках, 
из которых она была вызвана, если это пользовательская цепочка). 
Терминальными являются все действия, специфичные для таблиц filter и nat. 
Из приведенных выше в этом разделе — ACCEPT, DROP, REJECT, NFQUEUE, QUEUE.

Например:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "IN HTTP: "
Второе из приведенных правил (логирование) никогда не будет срабатывать, так как все пакеты,
 удовлетворяющие этому критерию (входящие TCP-пакеты на порт 80), 
будут пропущены по первому из этих правил, и до второго просто не дойдут.


Нетерминальными, соответственно, являются действия, не прерывающие процесс прохождения пакета через цепочки. 
Нетерминальными являются действия, специфичные для таблицы mangle, а из перечисленных выше — LOG, ULOG и NFLOG.

Например:
iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "IN HTTP: "
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Теперь все входящие на TCP-порт 80 пакеты будут сначала заноситься в лог, и только потом пропускаться.

Действие RETURN с точки зрения такой классификации занимает промежуточное положение — оно может прервать прохождение пакета 
через отдельную цепочку (или несколько цепочек, если для перехода в них использовалась опция -g, а не -j), 
но совсем не обязательно, чтобы это приводило к завершению обработки пакета в рамках текущей базовой цепочки.

Удаление правил брандмауэра

!!! D: удалить одно или несколько правил из указанной цепочки
Для отображения номера строки наряду с другой информацией по существующим правилам, введите:
# iptables -L INPUT -n --line-numbers
# iptables -L OUTPUT -n --line-numbers
# iptables -L OUTPUT -n --line-numbers | less
# iptables -L OUTPUT -n --line-numbers | grep 8.8.8.8
Вы получите список IP. Посмотрите на число слева, а вводите число, чтобы удалить его. 

Например, удаление линии номер 4, введите:
# iptables -D INPUT 4

Или найти источник IP 202.54.1.1 и удалить из правила:
# iptables -D INPUT -s 202.54.1.1 -j DROP
  

Добавление правил брандмауэра

Чтобы вставить одно или несколько правил в указанной цепочке, как правило используется следующий синтаксис. 

Сначала узнать номер строки:
# iptables -L INPUT -n --line-numbers

Вывод например:
Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    DROP       all  --  202.54.1.1           0.0.0.0/0
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state NEW,ESTABLISHED

Чтобы вставить правило между 1 и 2, введите:
# iptables -I INPUT 2 -s 8.8.8.8 -j DROP

Для просмотра обновленных правил, введите:
# iptables -L INPUT -n --line-numbers

Вывод например:
Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    DROP       all  --  202.54.1.1           0.0.0.0/0
2    DROP       all  --  8.8.8.8              0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state NEW,ESTABLISHED

Блокировать весь трафик:

# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -P FORWARD DROP
# iptables -L -v -n

Блокировать только входящий трафик:

# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT

Блокировка сетевых адресов локальной сети на внешнем интерфейсе

IP-спуфинг — атака заключающаяся в использовании в IP-пакетах, отправляемых жертве,
в качестве обратного адреса IP-адрес хоста, которому она доверяет. 
Пакеты с немаршрутизируемыми адресами источника должны быть отвергнуты, 
используя следующий синтаксис:
# iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

Диапазон адресов IPv4 для частных сетей (убедитесь, что они заблокированы на внешнем интерфейсе)

    10.0.0.0/8 -j (A)
    172.16.0.0/12 (B)
    192.168.0.0/16 ©
    224.0.0.0/4 (MULTICAST D)
    240.0.0.0/5 (E)
    127.0.0.0/8 (LOOPBACK)

Блокировка IP-адресов

Чтобы заблокировать IP адрес 1.2.3.4, введите:
# iptables -A INPUT -s 1.2.3.4 -j DROP

Блокировка входящие запросов на порт

Чтобы заблокировать все запросы на порт 80, введите:
# iptables -A INPUT -p tcp --dport 80 -j DROP
# iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP

Чтобы заблокировать порт 80 только для IP-адреса 1.2.3.4, введите:
# iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP
# iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP

Блокировка исходящего IP-адреса

Чтобы заблокировать исходящий трафик определенного хоста или домена, такого как sysadminblog.ru, введите:
host -t a sysadminblog.ru

Ответ будет:
sysadminblog.ru has address 95.211.41.31

Запишите свой ​​IP-адрес и введите следующую команду, чтобы блокировать весь исходящий трафик с 95.211.41.31:
# iptables -A OUTPUT -d 95.211.41.31 -j DROP

Можно использовать маски:
# iptables -A OUTPUT -d 192.168.1.0/24 -j DROP
# iptables -A OUTPUT -o eth1 -d 192.168.1.0/24 -j DROP

Вы также можете использовать доменное имя, введите:
# iptables -A OUTPUT -p tcp -d www.sysadminblog.ru -j DROP
# iptables -A OUTPUT -p tcp -d sysadminblog.ru -j DROP
Хотя в документации пишут, что использование доменного имени вместо IP не рекомендуется.

Логирование и блокирование пакетов

Введите следующую команду, чтобы логировать и блокировать IP-спуфинг на открытый интерфейс с именем eth1:
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

По умолчанию все логируется в файл /var/log/messages.

Комментарий от akkerman:
Так лучше не делать, в особенности для явно левого трафика. 
LOG можно вставлять только строго с -m limit, 
иначе любая DoS-атака будет во много раз эффективнее: 
фактически косвенным образом злоумышленник получает прямой 
путь интенсивного воздействия непосредственно на файловую систему сервера.

Как делать правильнее, написано ниже
Логирование и блокирование пакетов с ограниченным количеством записей журнала
Параметр -m может ограничить количество записей в журнале созданных в единицу времени. 
Это используется для предотвращения флуда в файле журнала. 
Чтобы записывать не более 7 записей в 5 минут, введите:
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

Логировать все из цепочки undef:
iptables -A undef_in -j LOG --log-level info --log-prefix "--- IN --- DROP "
iptables -A undef_in -j DROP
iptables -A undef_out -j LOG --log-level info --log-prefix " --- OUT --- DROP "
iptables -A undef_out -j DROP
iptables -A undef_fw -j LOG --log-level info --log-prefix "--- FW --- DROP "
iptables -A undef_fw -j DROP

Блокирование или разрешение трафика от Mac-адреса

Используйте следующий синтаксис:
# iptables -A INPUT -m mac --mac-source 00:19:99:3C:AB:23 -j DROP
## *only accept traffic for TCP port # 8080 from mac 00:19:99:3C:AB:22 * ##
# iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:19:99:3C:AB:22 -j ACCEPT

Запретить или разрешить ICMP запросы для ping

Введите следующую команду, чтобы заблокировать ICMP запросы:
# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP

Ping ответ также может быть ограничен определенными сетями или хостами:
# iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT

Следующий пример принимает только ограниченный тип ICMP запросов:
### ** assumed that default INPUT policy set to DROP ** #############
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
## ** all our server to respond to pings ** ##
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

Ограничить число одновременных подключений к серверу для каждого клиента по IP

Вы можете использовать модуль connlimit, чтобы поставить такие ограничения. 

Для ограничения не больше 3 SSH соединений на хост, введите:
# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT

Установить HTTP запросов до 20:
# iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP
Параметры в примере,
    --connlimit-above 3: Соответствует ли количество существующих соединений выше 3.
    --connlimit-mask 24: Группировать хосты по префиксу. Для IPv4, префиксы от 0 до 32.

INPUT разрешаем

Разрешаем работу локальных приложений использующих loop интерфейс
iptables -A INPUT -i lo -j ACCEPT

Разрешаем все с хоста
iptables -I INPUT -s 192.168.15.0/24 -j ACCEPT
iptables -I INPUT -s 10.0.0.0/24 -j ACCEPT
 
Разрешаем трафик для уже установленных соединений:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Разрешаем доступ к ssh для сети:
iptables -A INPUT -s 10.0.0.0/23 -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT

Разрешаем порт 53 (DNS):
iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT

Разрешаем доступ к веб сервер http:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -i eth0 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT

Разрешаем доступ на 80 порт только определенного адреса и интерфейса ppp0:
iptables -A INPUT -p tcp -s 8.8.8.8 --dport 80 -i ppp0 -j ACCEPT 

Разрешаем NTP (сервер времени):
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT

Разрешаем POP3 и IMAP:
iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT

Разрешаем samba \ шары:
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT

Разрешаем доступ к веб сервер https:
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT

Разрешаем udp/tcp 514 rsyslog:
iptables -A INPUT -i eth0 -p udp --dport 514 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 514 -j ACCEPT

Разрешаем принт сервер cups / printing service udp/tcp port 631 for LAN users 
iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT

Разрешаем соединение с PPTP-сервером для всех:
iptables -A INPUT -p tcp --dport 1723 -j ACCEP

Разрешаем прокси squid:
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT
 
Разрешаем mysql / mariadb:
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

Разрешаем tcp 9102 на клиенте Bareos (обычно на клиенте с которого делает backup сервер bareos):
iptables -A INPUT -p tcp --dport 9102 -j ACCEPT

Разрешаем доступ к zabbix-agent с хоста:
iptables -A INPUT -s 192.168.1.200/32 -p tcp -m tcp --dport 10050 -j ACCEPT


Разрешаем доступ к ipa портам (ldap,https,ntp,bind):
iptables -A -p tcp -m multiport --dports 53,80,88,389,443,464,663 -j ACCEPT
iptables -A -p udp -m multiport --dports 53,88,123,464 -j ACCEPT

Разрешаем доступ к ipa портам (ldap,https,ntp,bind) с определённой сети и определенного интерфейса:
iptables -A -s 192.168.1.0/24 -p tcp -m multiport --dports 53,80,88,389,443,464,636  -i eth0 -j ACCEPT
iptables -A -s 192.168.1.0/24 -p udp -m multiport --dports 53,88,123,464 -i eth0  -j ACCEPT

Разрешаем протокол GRE для всех:
iptables -A INPUT -p gre -j ACCEPT

Включаем логирование для пакетов INVALID:
iptables -A INPUT -m state --state INVALID -j LOG --log-prefix "Strange:"

Пример включения логирования на разрешающие правило:
iptables -A INPUT -p tcp -m multiport --dports 22,53,8080,139,445 -j LOG --log-level INFO --log-prefix "New connection from ours: "
iptables -A INPUT -p tcp -m multiport --dports 22,53,8080,139,445 -j ACCEPT

INPUT drop



Отбрасываем подключения IP-атакующего\порт-бедалага:
iptables -A INPUT -s IP-атакующего -p tcp --destination-port порт-бедалага -j DROP 

Ограничиваем максимальное число «полуоткрытых» соединений с одного IP к конкретному порту:
iptables -I INPUT -p tcp --syn --dport порт_бедалага -m iplimit --iplimit-above 10 -j DROP 

Отключаем ответы на запросы ICMP ECHO:
iptables -A INPUT -p icmp -j DROP --icmp-type 8

NAT

!!! В организация NAT не должно быть в принципе.
!!! Доступ к интернету должен осуществляется через proxy сервер

iptables -t nat -A POSTROUTING -o isp -j MASQUERADE

iptables -t nat -A POSTROUTING -o isp -j SNAT --to-source 10.0.0.23
iptables -t nat -A PREROUTING -i eth1 -j DNAT --to-destination 192.168.1.25

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 10.10.15.50:3128 
iptables -t nat -A PREROUTING -p tcp -d 192.168.3.124 --dport 3389 -j DNAT --to 10.70.70.105:3389
iptables -t nat -A PREROUTING -p tcp -d 192.168.3.124 --dport 5090 -j DNAT --to 10.70.70.101:5090

IP FORWARD / MASQUERADE / Включение IP Forward

FORWARD:
!!! По умолчанию ip forward выключен
!!! Если forward выключен то не будет работать маршрутизация между интерфейсами

Проверяем текущие состояние:
cat /proc/sys/net/ipv4/ip_forward - проверяем текущие состояние ip_forward

Включение forward:
!!! это будет работать до перезагрузки
echo 1 > /proc/sys/net/ipv4/ip_forward

!!! Для постоянного включения необходимо отредактировать файл  /etc/sysctl.conf, найти строку net.ipv4.ip_forward=1 и убрать комментарий с неё
nano /etc/sysctl.conf
---------------------
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
---------------------
sysctl -p  - выполняем для применения изменений без перезагрузки 

NAT:
Примеры настройки MASQUERADE:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

iptables -t nat -A POSTROUTING -o isp -j MASQUERADE

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

Пример работы своей цепочки(из wiki):

!!!Например, предположим, что нам нужно обеспечить доступ к определенным портам нашего сервера для всех хостов из подсети 10.134.0.64/26, кроме 10.134.0.67 и 10.134.0.100.
iptables -F # Очищаем все цепочки таблицы filter
iptables -N our_subnet # Создаем специальную цепочку для проверки пакетов из нашей подсети
iptables -A our_subnet -s 10.134.0.67 -j RETURN # Запрещенный хост — выходим
iptables -A our_subnet -s 10.134.0.100 -j RETURN # Запрещенный хост — выходим

# Всем остальным разрешаем доступ к нужным портам
iptables -A our_subnet -p tcp -m multiport --dports 22,53,8080,139,445 -j ACCEPT
iptables -A our_subnet -p udp -m multiport --dports 53,123,137,138 -j ACCEPT
iptables -A our_subnet -p icmp --icmp-type 8 -j ACCEPT

# Разрешаем пакеты по уже установленным соединениям
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Все пакеты из нашей подсети отправляем на проверку
iptables -A INPUT -s 10.134.0.64/26 -j our_subnet
iptables -P INPUT DROP # Что не разрешено — то запрещено
iptables -P OUTPUT ACCEPT # На выход — можно все

iptables ipset (списки)

Пример правил:
iptables -A INPUT -p tcp -m set --match-set whitelist src -m comment --comment WHITELIST -j ACCEPT
iptables -A INPUT -p tcp -m set --match-set blacklist src -m comment --comment BLACKLIST -j DROP
iptables -A INPUT -p udp -m set --match-set asterisk-blacklist src -m multiport --dports 5060,5038,2000,4569,2727,4520,5000,8088,10000:20000 -m comment --comment "::01-asterisk-blacklist:: Blacklist" -j DROP
iptables -A INPUT -p tcp -m set --match-set asterisk-blacklist src -m multiport --dports 5060,5038,2000,4569,2727,4520,5000,8088,10000:20000 -m comment --comment "::01-asterisk-blacklist:: Blacklist" -j DROP
iptables -A INPUT -p udp -m set --match-set sip src -m multiport --dports 10000:20000 -m comment --comment "::08-sip:: RTP" -j ACCEPT
iptables -A INPUT -p udp -m set --match-set sip src -m multiport --dports 4000:4999 -m comment --comment "::08-sip:: T.38" -j ACCEPT
iptables -A INPUT -p udp -m set --match-set sip src -m udp --dport 5060 -m comment --comment "::08-sip:: SIP" -j ACCEPT
iptables -A INPUT -p tcp -m set --match-set asterisk-mgmt src -m tcp --dport 5038 -m comment --comment "::08-sip:: AMI" -j ACCEPT
iptables -A INPUT -p tcp -m set --match-set ssh src -m tcp --dport 22 -m comment --comment "::99-system:: SSH" -j ACCEPT
iptables -A INPUT -p tcp -m set --match-set sshttl src -m tcp --dport 22 -m comment --comment "::99-system:: SSH" -j ACCEPT
iptables -A INPUT -p tcp -m set --match-set zabbix src -m tcp --dport 10050 -m comment --comment "::99-system:: Zabbix" -j ACCEPT
iptables -A INPUT -p tcp -m set --match-set bareos src -m tcp --dport 9102 -m comment --comment "::99-system:: Bareos" -j ACCEPT
iptables -A INPUT -p udp -m set --match-set tftp src -m udp --dport 69 -m comment --comment "::89-tftp:: TFTP" -j ACCEPT
iptables -A INPUT -p tcp -m set --match-set web src -m tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p tcp -m set --match-set web src -m tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT

Пример списка:
/etc/iptables/blacklist.ipset 
-! create blacklist hash:net family inet hashsize 131072 maxelem 262144 counters timeout 7200
-! add blacklist 10.100.2.50/32
-! add blacklist 192.168.100.0/24

Сохранение правил брандмауэра

Чтобы сохранить правила брандмауэра в CentOS / RHEL / Fedora Linux, введите:
# service iptables save

В других дистрибутивах
iptables-save > /root/my.active.firewall.rules
или
iptables-save

Восстановление правил брандмауэра

Для восстановление правил брандмауэра из файла /root/my.active.firewall.rules, введите:
# iptables-restore  < /root/my.active.firewall.rules
# iptables-restore  /root/my.active.firewall.rules
Для восстановление правил брандмауэра в CentOS / RHEL / Fedora Linux, введите:
# service iptables restart

Остановка, перезапуск, запуск брандмауэра Если у Вас CentOS / RHEL / Fedora Linux, вводите:

# service iptables stop
# service iptables start
# service iptables restart

Чтобы отчистить правила iptables его собственными средствами введите:

!!! F: Удаление всех правил (flushing)
!!! X: Удаление цепочки
!!! t <таблица>: Выбрать таблицу и удалить правила
!!! P: Установить политику по умолчанию (например DROP, REJECT или ACCEPT)

# iptables -F
# iptables -X
# iptables -t nat -F
# iptables -t nat -X
# iptables -t mangle -F
# iptables -t mangle -X
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD ACCEPT

Очистка таблицы filter:

iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD

Очистка таблицы nat:

iptables -t nat -F PREROUTING
iptables -t nat -F POSTROUTING

Очистка таблицы mangle:

iptables -t mangle -F PREROUTING

Чистим ветки логов:

iptables -F undef_in
iptables -F undef_out
iptables -F undef_fw
iptables -X undef_in
iptables -X undef_out
iptables -X undef_fw

Разрешаем принимать трафик на loopback-интерфейсе:

iptables -A INPUT eth2 -j ACCEPT
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A FORWARD -i lo -o eth1 -j ACCEPT$IPT -A FORWARD -i eth2 -o lo -j ACCEPT
iptables -A FORWARD -i lo -o eth2 -j ACCEPT$IPT -A FORWARD -i eth1 -o lo -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

Разрешение исходящего трафика:

iptables -A OUTPUT -o eth0 -j ACCEPT
iptables -A OUTPUT -o eth1 -j ACCEPT
iptables -A OUTPUT -o eth2 -j ACCEPT

Разрешить соединения, которые инициированы изнутри

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

Следующими правилами разрешаем коннекты на наш сервер из вне:

iptables -A INPUT -p udp --dport 33434:33523 -j ACCEPT - Разрешить traceroute
iptables -A INPUT -p tcp --dport 22 -j ACCEPT - Разрешаем SSH
iptables -A INPUT -p tcp --dport 10000 -j ACCEPT - Разрешаем webmin
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT - Доступ на http

Проброс RDP на сервер терминалов:

iptables -t nat -A PREROUTING -p tcp --dport 3389 -i eth0 -j DNAT --to 192.168.0.100
iptables -A FORWARD -i eth0 -d 192.168.0.100 -p tcp --dport 3389 -j ACCEPT

Выход из локалки на почтовые сервера

iptables -A FORWARD -d smtp.mail.ru -o eth0 -p tcp -m tcp --dport 25 -j ACCEPT
iptables -A FORWARD -d smtp.masterhost.ru -o eth0 -p tcp -m tcp --dport 25 -j ACCEPT

Входящий трафик  на почтовые сервера
iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT

Заворачиваем трафик на порт сквида:

iptables -t nat -A PREROUTING -p tcp -m multiport --dport 80,81,82,83,88,8000,8001,8002,8080,8081,3128,9090 -s 0/0 -d 0/0 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -p udp -m multiport --dport 80,81,82,83,88,8000,8001,8002,8080,8081,3128,9090 -s 0/0 -d 0/0 -j REDIRECT --to-port 3128

Если прокси не установлена,либо нет нужды в использовании SQUID, то просто форвардим нужные порты:

iptables -A FORWARD -o eth0 -p tcp -m multiport --dport 80,81,82,83,88,8000,8001,8002,8080,8081,3128,9090 -j ACCEPT 

Прячем NAT:

iptables -t mangle -A PREROUTING -j TTL --ttl-set 64
iptables -t mangle -A PREROUTING -j RETURN

Все что не разрешено, но ломится отправим в цепочку undef:

iptables -N undef_in
iptables -N undef_out
iptables -N undef_fw
iptables -A INPUT -i vlan2 -j undef_in
iptables -A OUTPUT -j undef_out
iptables -A FORWARD -j undef_fw

Антибрут ssh:

iptables -A INPUT -m state  --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m tcp  --dport 22 -m state --state NEW  -m recent --set --name SSH
iptables -A INPUT -p tcp -m tcp  --dport 22 -m state --state NEW  -m recent --update --seconds 60  --hitcount 4 --rttl --name SSH -j DROP
iptables -A INPUT -p tcp -m tcp  --dport 22 -m state --state NEW -j ACCEPT
После этого хосты, пытающиеся перебирать пароль, будут блокироваться: 
все IP из черного списка будут фиксироваться в файле /proc/net/ipt_recent/SSH

Разрешаем некоторые ICMP-сообщения

https://ru.wikipedia.org/wiki/ICMP  - icmp-type
iptables -A INPUT -i eth0 -p icmp -m icmp  --icmp-type 3 -j ACCEPT
iptables -A INPUT -i eth0 -p icmp -m icmp  --icmp-type 11 -j ACCEPT
iptables -A INPUT -i eth0 -p icmp -m icmp  --icmp-type 12 -j ACCEPT

open firewall:

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m tcp --tcp-flags  SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT # Небольшая защита от DoS
iptables -A INPUT -p all -m state --state  RELATED,ESTABLISHED -j ACCEPT # Разрешаем уже установленные соединения
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT # Разрешаем 22 порт
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT # Разрешаем 80 порт
iptables -A INPUT -i eth0 -p icmp -m icmp  --icmp-type 3 -j ACCEPT # Разрешаем некоторые ICMP-сообщения
iptables -A INPUT -i eth0 -p icmp -m icmp  --icmp-type 11 -j ACCEPT # Разрешаем некоторые ICMP-сообщения
iptables -A INPUT -i eth0 -p icmp -m icmp  --icmp-type 12 -j ACCEPT # Разрешаем некоторые ICMP-сообщения
iptables -A INPUT DROP

sysctl \ conntrack

Итак, есть /proc/net/nf_conntrack, в нём можно найти наши проблемные записи, 
но напрямую их поправить не удастся (или можно, тогда как?). 
Timeout NAT. Информация о сессиях также может быть удалена по timeout. 
Т.е. если в течение долгого времени в рамках соединения обмена трафика нет - сессия закрывается и информация о ней так же удаляется из таблицы NAT. 
По умолчанию значения тайм-аутов стоят достаточно большие.
Поэтому, при больших потоках трафика, даже если nf_conntrack_max установлен в максимальное значение, 
существует риск столкнуться с переполнением таблицы и разрывами соединений. 

apt install conntrack-tools - установка пакета
conntrack -L conntrack
conntrack -L conntrack -s 192.168.0.100 - список для нужного внутреннего IP
conntrack -L conntrack -d 8.8.8.8 - на какой-то адрес
conntrack -L conntrack -q 192.168.0.1 - коннекты, проходящие через старый gate
conntrack -D conntrack -s 192.168.0.100 -q 192.168.0.1 - удалить проблемную запись
conntrack -F conntrack - есть и "оружие последнего дня", полная очистка таблицы
conntrack -h - помощь

# sysctl net.netfilter.nf_conntrack_max - посмотреть текущий размер таблицы NAT
net.netfilter.nf_conntrack_max = 65536

# sysctl -a | grep conntrack_max - посмотреть текущий размер таблицы NAT
net.netfilter.nf_conntrack_max = 65536
net.ipv4.netfilter.ip_conntrack_max = 65536
net.nf_conntrack_max = 65536

# sysctl net.netfilter.nf_conntrack_count - посмотреть заполненность таблицы
net.netfilter.nf_conntrack_count = 654

NAT tweak

# sysctl net.netfilter.nf_conntrack_max - посмотреть текущий размер таблицы NAT
net.netfilter.nf_conntrack_max = 65536

# sysctl -a | grep conntrack_max - посмотреть текущий размер таблицы NAT
net.netfilter.nf_conntrack_max = 65536
net.ipv4.netfilter.ip_conntrack_max = 65536
net.nf_conntrack_max = 65536

# sysctl net.netfilter.nf_conntrack_count - посмотреть заполненность таблицы
net.netfilter.nf_conntrack_count = 654


Посмотреть установленные значения задержек (в секундах):
# sysctl -a | grep conntrack | grep timeout
net.netfilter.nf_conntrack_generic_timeout = 600 - NAT- сервер будет хранить информацию о сессии даже в том случае, если будет проходит 1 пакет в 10 минут.
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 120
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60
net.netfilter.nf_conntrack_tcp_timeout_established = 432000 - TCP- сессию NAT- сервер будет отслеживать 5 дней(!), если даже за это период пройдет только 1 пакет, это может привести к быстрому заполнению nf_conntrack_max
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close = 10
net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300
net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 300
net.netfilter.nf_conntrack_udp_timeout = 30
net.netfilter.nf_conntrack_udp_timeout_stream = 180
net.netfilter.nf_conntrack_icmp_timeout = 30
net.netfilter.nf_conntrack_events_retry_timeout = 15
net.ipv4.netfilter.ip_conntrack_generic_timeout = 600
net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_sent = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_sent2 = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 432000
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_last_ack = 30
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close = 10
net.ipv4.netfilter.ip_conntrack_tcp_timeout_max_retrans = 300
net.ipv4.netfilter.ip_conntrack_udp_timeout = 30
net.ipv4.netfilter.ip_conntrack_udp_timeout_stream = 180
net.ipv4.netfilter.ip_conntrack_icmp_timeout = 30

ipteplse-sex

vim  /etc/systemd/system/sex-sec.service
----------------------------------------
[Unit]
Description= add iptables and route
After=syslog.target

[Service]
Type=simple
TimeoutStartSec=10
ExecStart=/etc/iptables/sex_sec.sh

[Install]
WantedBy=multi-user.target
----------------------------------------

mkdir /etc/iptables

vim /etc/iptables/sex_sec.sh
----------------------------
#!/bin/bash
iptables-restore /etc/iptables/iptable.4
ip6tables-restore /etc/iptables/iptable.6 
sleep 30
#!/bin/bash

list_net_ip="192.168.55 192.168.80 192.168.88 10.12.88"
ip_router="192.168.16.55"
i=99

for x in ${list_net_ip} ; do
      i=$(ip route | grep "${x}" 1>/dev/null ; echo $?)
      if ((i > 0)) ; then
       #echo -e "ip route add ${x} via ${ip_router}"
       ip route add ${x}.0/24 via ${ip_router}
      fi
done

-----------------------------
chmod +x /etc/iptables/sex_sec.sh

vim  /etc/iptables/iptable.4
----------------------------
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.18.0.0/16 ! -o br-6e31867864c0 -j MASQUERADE
-A POSTROUTING -o ovsbr0 -j MASQUERADE
-A POSTROUTING -s 172.18.0.2/32 -d 172.18.0.2/32 -p tcp -m tcp --dport 443 -j MASQUERADE
-A POSTROUTING -s 172.18.0.5/32 -d 172.18.0.5/32 -p tcp -m tcp --dport 8080 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
-A DOCKER -i br-6e31867864c0 -j RETURN
-A DOCKER ! -i br-6e31867864c0 -p tcp -m tcp --dport 8443 -j DNAT --to-destination 172.18.0.2:443
-A DOCKER ! -i br-6e31867864c0 -p tcp -m tcp --dport 32768 -j DNAT --to-destination 172.18.0.5:8080
COMMIT

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -i enp0s20f0u2 -j ACCEPT
-A INPUT -i enp0s20f0u1u2 -j ACCEPT
-A INPUT -i enp0s20f0u1u1 -j ACCEPT
-A INPUT -i zthnhjuefn -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p udp -m udp --dport 5678 -j ACCEPT
-A INPUT -s 192.168.16.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -s 192.168.15.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 100/sec -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 4 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 12 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i zthnhjuefn -j ACCEPT
-A FORWARD -i enp0s20f0u1u1 -j ACCEPT
COMMIT

----------------------------

vim /etc/iptables/iptable.6
------------------------
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p ipv6-icmp -j ACCEPT
COMMIT
------------------------
Рубрики
iptables \ Fail2ban

fail2ban / unban / ignoreip

Выполнить разбан(unban ip):

iptables –L - ознакомится с правилами iptables
iptables --list-rules - ознакомится с правилами iptables
iptables -S - ознакомится с правилами iptables
fail2ban-client set JAIL unbanip IP - разблокировать IP
fail2ban-client set ssh-iptables unbanip 1.1.1.1 - разблокировать IP

Файл логов (LOG):

cat /var/log/fail2ban.log - показать содержимое лог файла 
tail -f /var/log/fail2ban.log - наблюдать за файлом 
fail2ban-client status - посмотреть статус fail2ban
fail2ban-client status NAME_JAIL  - посмотреть статус NAME_JAIL

Список забаненных:

cat /var/log/fail2ban.log |grep Ban

Ручной бан:

fail2ban-client set [name-of-jail] banip [ip-address] - ручной бан
fail2ban-client set NAME_JAIL banip 1.1.1.1 - ручной бан

Разбан:

fail2ban-client set NAME_JAIL unbanip 1.1.1.1 - разбанить

Пример разбана:

Первый вариант удаляем из iptables:
-----------------------------------
iptables -L -n - проверяем фаервол (смотрим цепочки)
fail2ban-client status - смотрим список правил fail2ban
fail2ban-client status ssh - смотрим баны в списке
iptables -D fail2ban-ssh -s xxx.yyy.zzz.www -j DROP - удалить из таблицы fail2ban-ssh ip
-----------------------------------

Второй вариант удаляем из iptables:
-----------------------------------
iptables -L -n --line-numbers
iptables -D asterisk-iptables 3
-----------------------------------

Третий вариант удаляем из fail2ban:
-----------------------------------
fail2ban-client status ssh - смотрим баны в списке
fail2ban-client set ssh unbanip 192.168.15.50 - разбанить
#fail2ban-client get ssh actionunban 192.168.15.50 - разбанить
-----------------------------------

Добавить игнорирование IP

fail2ban-client get JAIL_NAME  ignoreip - показать игнорируемые IP в JAIL_NAME 
fail2ban-client set JAIL_NAME addignoreip 10.14.16.10 - добавить в список игнорируемых ip (10.14.16.10) в JAIL_NAME
fail2ban-client set JAIL_NAME unbanip 10.14.16.10 - разблокировать ip (10.14.16.10) из JAIL_NAME
Рубрики
iptables \ Fail2ban

Fail2ban

Описание:

Fail2ban — простой в использовании локальный сервис, 
который отслеживает log–файлы запущенных программ, 
и на основании различных условий блокирует по IP найденных нарушителей.
Программа умеет бороться с различными атаками на все 
популярные *NIX–сервисы, такие как Apache, Nginx, ProFTPD, vsftpd, Exim, Postfix, named, и т.д.
Но в первую очередь Fail2ban известен благодаря готовности 
«из коробки» к защите SSH–сервера от атак типа «bruteforce», то есть к защите SSH от перебора паролей.

Установка:

apt-get install fail2ban

Конфигурация Fail2ban:

/etc/fail2ban/fail2ban.conf — отвечает за настройки запуска процесса Fail2ban.
/etc/fail2ban/jail.conf — содержит настройки защиты конкретных сервисов, в том числе sshd.

Файл jail.conf поделён на секции, так называемые «изоляторы» (jails), каждая секция отвечает за определённый сервис и тип атаки:

-----------------------------------------------------------------
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 600
maxretry = 3
banaction = iptables-multiport
-----------------------------------------------------------------
[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 6
-----------------------------------------------------------------
Параметры из секции [DEFAULT] применяются ко всем остальным секциям, если не будут переопределены.
Секция [ssh] отвечает за защиту SSH от повторяющихся неудачных попыток авторизации на SSH–сервере, проще говоря, «brute–force».

Подробнее по каждому из основных параметров файла jail.conf:

-----------------------------------------------------------------
ignoreip — IP–адреса, которые не должны быть заблокированы. Можно задать список IP-адресов разделённых пробелами, маску подсети, или имя DNS–сервера.
-----------------------------------------------------------------
bantime — время бана в секундах, по истечении которого IP–адрес удаляется из списка заблокированных.
-----------------------------------------------------------------
maxretry — количество подозрительных совпадений, после которых применяется правило. В контексте [ssh] — это число неудавшихся попыток логина, после которых происходит блокировка.
-----------------------------------------------------------------
enabled — значение true указывает что данный jail активен, false выключает действие изолятора.
-----------------------------------------------------------------
port — указывает на каком порту или портах запущен целевой сервис. Стандартный порт SSH–сервера — 22, или его буквенное наименование — ssh.
-----------------------------------------------------------------
filter — имя фильтра с регулярными выражениями, по которым идёт поиск «подозрительных совпадений» в журналах сервиса. 
Фильтру sshd соответствует файл /etc/fail2ban/filter.d/sshd.conf.
-----------------------------------------------------------------
logpath — путь к файлу журнала, который программа Fail2ban будет обрабатывать с помощью заданного ранее фильтра. 
Вся история удачных и неудачных входов в систему, в том числе и по SSH, по умолчанию записывается в log–файл /var/log/auth.log.
-----------------------------------------------------------------
findtime — определяет длительность интервала в секундах, за которое событие должно повториться 
определённое количество раз, после чего санкции вступят в силу. Если специально не определить этот параметр, 
то будет установлено значение по умолчанию равное 600 (10 минут). Проблема в том, что ботнеты, участвующие 
в «медленном брутфорсе», умеют обманывать стандартное значение. Иначе говоря, при maxretry равным 6, 
атакующий может проверить 5 паролей, затем выждать 10 минут, проверить ещё 5 паролей, повторять это 
снова и снова, и его IP забанен не будет. В целом, это не угроза, но всё же лучше банить таких ботов.
-----------------------------------------------------------------

Рекомендации по настройке Fail2ban:

-----------------------------------------------------------------
Не рекомендуется оставлять параметр ignoreip со значением по умолчанию 127.0.0.1/8, 
это создаёт очевидную угрозу в многопользовательских системах — если злоумышленник 
получил доступ хотя–бы к одному shell–аккаунту, то он имеет возможность беспрепятственно 
запустить bruteforce–программу для атаки на root или других пользователей прямо с этого–же сервера.
-----------------------------------------------------------------
Прежде чем вносить изменения следуя рекомендациям, отметим, что не стоит редактировать основной файл настроек jail.conf, 
для этого предусмотрены файлы с расширением *.local, которые автоматически подключаются и имеют высший приоритет.
-----------------------------------------------------------------

Дополнительно:

nano /etc/fail2ban/jail.local
-----------------------------------------------------------------
[DEFAULT]
## Постоянный IP-адрес.
## Если не переопределить ignoreip здесь,
## то стоит закомментировать этот параметр в jail.conf.
ignoreip = 57.66.158.131
-----------------------------------------------------------------
[ssh]
## если в течении 1 часа:
findtime = 3600
## произведено 6 неудачных попыток логина:
maxretry = 6
## то банить IP на 24 часа:
bantime = 86400
-----------------------------------------------------------------
[ssh-ddos]
enabled = true
port 	= ssh
filter = sshd-ddos
logpath = /var/log/auth.log
maxretry = 2
-----------------------------------------------------------------
[ssh] - еще и отправка на email
enabled = true
port 	= ssh
filter = sshd
action = iptables[name=sshd, port=ssh, protocol=tcp]
	sendmail-whois[name=ssh, dest=****@yandex.ru, sender=fail2ban@***.ru]
logpath = /var/log/auth.log
maxretry = 3
bantime = 600
-----------------------------------------------------------------
[postfix] - Защита почтового сервера
enabled = true
port 	= smtp,ssmtp,submission
action = iptables[name=Postfix-smtp, port=smtp, protocol=tcp]
filter = postfix
logpath = /var/log/mail.log
bantime = 86400
maxretry = 3
findtime = 3600
ignoreip = 127.0.0.1
-----------------------------------------------------------------
[sasl] - Защита почтового сервера
enabled = true
port 	= smtp,ssmtp,submission,imap2,imap3,imaps,pop3,pop3s
filter = postfix-sasl
action = iptables[name=Postfix-smtp, port=smtp, protocol=tcp]
logpath = /var/log/mail.log
bantime = 86400
maxretry = 3
findtime = 3600
-----------------------------------------------------------------
[dovecot] - Защита почтового сервера
enabled = true
port = smtp,ssmtp,submission,imap2,imap3,imaps,pop3,pop3s
filter = dovecot
action = iptables-multiport[name=dovecot-pop3imap,port="pop3,pop3s,imap,imaps", protocol=tcp]
logpath = /var/log/mail.log
maxretry = 3
findtime = 3600
bantime = 86400
-----------------------------------------------------------------
[roundcube-auth] - Защита почтового сервера
enabled = true
filter = roundcube-auth
port 	= http,https
logpath = /var/log/mail.log
action = iptables-multiport[name=roundcube, port="http,https"]
bantime = 86400
maxretry = 3
findtime = 3600
-----------------------------------------------------------------
[apache] - Защита веб-сервера (apache)
enabled = true
port 	= http,https
filter = apache-auth
logpath = /var/log/apache2/error.log
maxretry = 3
-----------------------------------------------------------------
[apache-multiport] - Защита веб-сервера (apache)
enabled = true
port 	= http,https
filter 	= apache-auth
logpath = /var/log/apache2/error.log
maxretry = 3
-----------------------------------------------------------------
[apache-noscript] - Защита веб-сервера (apache)
enabled = true
port 	= http,https
filter = apache-noscript
logpath = /var/log/apache2/error.log
maxretry = 3
-----------------------------------------------------------------
[apache-overflows] - Защита веб-сервера (apache)
enabled = true
port 	= http,https
filter = apache-overflows
logpath = /var/log/apache2/error.log
maxretry = 2
-----------------------------------------------------------------
[vsftpd] - Защита FTP сервера
enabled = true
port 	= ftp,ftp-data,ftps,ftps-data
filter = vsftpd
logpath = /var/log/vsftpd.log
action = iptables[name=VSFTPD, port=21, protocol=tcp]
bantime = 600
maxretry = 3
findtime = 1800
-----------------------------------------------------------------

nginx:

[nginx-http-auth]
enabled  = true
filter   = nginx-http-auth
port     = http,https
logpath  = /var/log/nginx/error.log

[nginx-noscript]
enabled  = true
port     = http,https
filter   = nginx-noscript
logpath  = /var/log/nginx/access.log
maxretry = 6

[nginx-badbots]
enabled  = true
port     = http,https
filter   = nginx-badbots
logpath  = /var/log/nginx/access.log
maxretry = 2

[nginx-404]
enabled	 = true
port	 = http
filter	 = nginx-404
logpath	 = /var/log/nginx/access.log
findtime = 600
maxretry = 5

Проверка работы фильтра:

fail2ban-regex /var/NAME_LOG.log /etc/fail2ban/filter.d/NAME_FILTER.conf
fail2ban-regex /var/NAME_LOG.log /etc/fail2ban/filter.d/NAME_FILTER.conf --print-all-matched

Выполнить разбан(unban ip):

iptables –L - ознакомится с правилами iptables
iptables --list-rules - ознакомится с правилами iptables
iptables -S - ознакомится с правилами iptables
fail2ban-client set JAIL unbanip IP - разблокировать IP
fail2ban-client set ssh-iptables unbanip 1.1.1.1 - разблокировать IP

Файл логов (LOG):

cat /var/log/fail2ban.log - показать содержимое лог файла 
tail -f /var/log/fail2ban.log - наблюдать за файлом 
fail2ban-client status - посмотреть статус fail2ban
fail2ban-client status NAME_JAIL  - посмотреть статус NAME_JAIL

Список забаненных:

cat /var/log/fail2ban.log |grep Ban

Ручной бан:

fail2ban-client set [name-of-jail] banip [ip-address] - ручной бан
fail2ban-client set NAME_JAIL banip 1.1.1.1 - ручной бан

Разбан:

fail2ban-client set NAME_JAIL unbanip 1.1.1.1 - разбанить

Пример разбана:

Первый вариант удаляем из iptables:
-----------------------------------
iptables -L -n - проверяем фаервол (смотрим цепочки)
fail2ban-client status - смотрим список правил fail2ban
fail2ban-client status ssh - смотрим баны в списке
iptables -D fail2ban-ssh -s xxx.yyy.zzz.www -j DROP - удалить из таблицы fail2ban-ssh ip
-----------------------------------

Второй вариант удаляем из iptables:
-----------------------------------
iptables -L -n --line-numbers
iptables -D asterisk-iptables 3
-----------------------------------

Третий вариант удаляем из fail2ban:
-----------------------------------
fail2ban-client status ssh - смотрим баны в списке
fail2ban-client set ssh unbanip 192.168.15.50 - разбанить
#fail2ban-client get ssh actionunban 192.168.15.50 - разбанить
-----------------------------------

Добавить игнорирование IP

fail2ban-client get JAIL_NAME  ignoreip - показать игнорируемые IP в JAIL_NAME 
fail2ban-client set JAIL_NAME addignoreip 10.14.16.10 - добавить в список игнорируемых ip (10.14.16.10) в JAIL_NAME
fail2ban-client set JAIL_NAME unbanip 10.14.16.10 - разблокировать ip (10.14.16.10) из JAIL_NAME

Свой фильтр:

nano  /etc/fail2ban/jail.conf
-----------------------------------------------------------------
[redmine]
enabled  = true
filter   = redmine
port     = 80,443
#backend  = polling
action   = iptables-allports[name=redmine]
logpath  = /var/log/redmine/default/production.log
maxretry = 5
findtime = 7320
bantime  = 7320
-----------------------------------------------------------------
nano /etc/fail2ban/filter.d/redmine.conf
-----------------------------------------------------------------
# redmine configuration file
# Author: David Siewert
# $Revision$
[Definition]
failregex = Failed [-/\w]+ for .* from 
# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =
# Source:
#http://www.fail2ban.org/wiki/index.php/MANUAL_0_8
-----------------------------------------------------------------
проверка синтаксиса:
-----------------------------------------------------------------
fail2ban-regex /var/log/redmine/default/production.log /etc/fail2ban/filter.d/redmine.conf 
-----------------------------------------------------------------