iptables -Как убить установленное соединение кроме ip?

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

define message =
You can also include make macros like
    $$@ = $@
in a multi-line variable
endef

help:; @ $(info $(message)) :

Играя с функциейvalueи директивой export, вы также можете включить в свой Makefile целый скрипт, который позволит вам использовать многострочную команду -без глобального включения .ONESHELL:

define _script
echo SHELL is $SHELL, PID is $$
cat <<'EOF'
literally $SHELL and $$
EOF
endef
export script = $(value _script)

run:; @ eval "$$script"

даст

SHELL is /bin/sh, PID is 12434
literally $SHELL and $$

1
25.04.2021, 18:24
1 ответ
  1. использоватьiptables-restore

    Добавление правил по одному изменяет брандмауэр по одному правилу за раз, что может привести к нежелательному промежуточному состоянию для набора правил брандмауэра. Напротив, iptables-saveатомарно сохраняет набор правил, а обратный iptables-restoreатомарно восстанавливает набор правил (по крайней мере для данной таблицы ). Пакет либо увидит первый набор правил, либо увидит второй набор правил, но никогда не увидит промежуточное состояние.

    Когда у вас есть работающий набор правил, вы не должны использовать команды оболочки для его загрузки, а вместо этого используйте iptables-saveдля вывода правил в файл и iptables-restoreдля загрузки их обратно из этого файла. Этот файл можно легко редактировать напрямую, так как это обычный синтаксис, по крайней мере, для самих правил. Если есть динамические компоненты (динамические IP-адреса, временные блокировки IP-адресов и т. д. )следует адаптировать правила с некоторой логикой, например, с пользовательскими -определенными цепочками или вспомогательным инструментомipsetи связанным совпадением и цель .

  2. установленные соединения останутся с текущим методом

    Переключение правил таким образом (или использованиеiptables-restore)не уничтожит активные соединения из-за короткого -правила цепи с отслеживанием состояния. Это правило запрашивает conntrack , который все еще имеет действительную запись и будет продолжать разрешать трафик. Таким образом, уже установленное соединение на порту 22 80 или 443 может сохраняться неопределенно долго (, пока сохраняется адекватный трафик ), несмотря на то, что новый набор правил запрещает это сейчас.

    Чтобы закрыть все установленные соединения,нужно дополнительно (установитьconntrack -инструментыи )запустить сразу после:

    conntrack -F
    

    , который очистит таблицу поиска conntrack , требуя, чтобы соединения возвращались через состояние NEW. Правило для порта 3306 будет беспрепятственно поддерживать там уже установленное соединение.

  3. даже conntrack -Fнедостаточно для TCP по умолчанию.

    Уже установленные TCP-соединения проходят специальную обработку, которая проверяет их поток из свойств TCP и позволяет снова создать запись conntrack в состоянии NEW, несмотря на то, что пакет TCP SYN не виден. Это контролируется свойством sysctl net.netfilter.nf_conntrack_tcp_loose, которое по умолчанию не установлено.

    Это по-прежнему требует разрешения состояния NEW где-то в наборе правил iptables . Увы, это так, потому что цепочка OUTPUTразрешает все , так что сюда входят пакеты для потоков в НОВОМ состоянии. Таким образом, хотя пакеты от клиента теперь изначально отбрасываются, если сервер отправит одиночный пакет из предыдущего потока клиенту, соединение возобновится беспрепятственно.

    • Чтобы избежать этого, обычно можно отключить netfilter.nf_conntrack_tcp_looseвот так:

      sysctl -w net.netfilter.nf_conntrack_tcp_loose=0
      

      , но это также нарушит установленное соединение с портом 3306 после conntrack -F. conntrack -инструменты непросто использовать для удаления всех потоков, кроме одного, поэтому использование вместо этого нескольких conntrack -D...не является простым методом, но подходит для конкретного случая OP (только три вид потоков для удаления):

      Заменить conntrack -Fна:

      conntrack -D -s $csa -p tcp --dport 22
      conntrack -D -s $csa -p tcp --dport 80
      conntrack -D -s $csa -p tcp --dport 443
      
    • Другой способ — сохранить свободную обработку TCP, но также ограничить исходящие пакеты правилом с отслеживанием состояния.

      Например, для (используется современная версия state:conntrack):

      .
      iptables -A OUTPUT -o lo -j ACCEPT
      iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
      iptables -P OUTPUT DROP
      

      В этом случае следует также включить явный исходящий трафик для общих служб, необходимых серверу (DNS, NTP, веб-доступа и т. д.)с использованием таких правил, как-A OUTPUT -p... --dport... -m conntrack --ctstate NEW -j ACCEPT).


Примечание :Я оставил рядом с обработкой RELATED. Обычно рекомендуется использовать RELATED вместе с ESTABLISHED.

Например, правила OP не разрешают ICMP, поэтому без СВЯЗАННОГО правила, разрешающего соответствующие ошибки ICMP, Обнаружение MTU пути не будет работать должным образом (, например, :TCP-соединения могут зависать при прохождении через туннели. в пути ). Все равно сначала стоит заглянуть в этот блог:Безопасное использование iptables и помощников по отслеживанию соединений .

2
28.04.2021, 22:51

Теги

Похожие вопросы