Если вы используете 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 $$
использоватьiptables-restore
Добавление правил по одному изменяет брандмауэр по одному правилу за раз, что может привести к нежелательному промежуточному состоянию для набора правил брандмауэра. Напротив, iptables-save
атомарно сохраняет набор правил, а обратный iptables-restore
атомарно восстанавливает набор правил (по крайней мере для данной таблицы ). Пакет либо увидит первый набор правил, либо увидит второй набор правил, но никогда не увидит промежуточное состояние.
Когда у вас есть работающий набор правил, вы не должны использовать команды оболочки для его загрузки, а вместо этого используйте iptables-save
для вывода правил в файл и iptables-restore
для загрузки их обратно из этого файла. Этот файл можно легко редактировать напрямую, так как это обычный синтаксис, по крайней мере, для самих правил. Если есть динамические компоненты (динамические IP-адреса, временные блокировки IP-адресов и т. д. )следует адаптировать правила с некоторой логикой, например, с пользовательскими -определенными цепочками или вспомогательным инструментомipset
и связанным совпадением и цель .
установленные соединения останутся с текущим методом
Переключение правил таким образом (или использованиеiptables-restore
)не уничтожит активные соединения из-за короткого -правила цепи с отслеживанием состояния. Это правило запрашивает conntrack , который все еще имеет действительную запись и будет продолжать разрешать трафик. Таким образом, уже установленное соединение на порту 22 80 или 443 может сохраняться неопределенно долго (, пока сохраняется адекватный трафик ), несмотря на то, что новый набор правил запрещает это сейчас.
Чтобы закрыть все установленные соединения,нужно дополнительно (установитьconntrack -инструментыи )запустить сразу после:
conntrack -F
, который очистит таблицу поиска conntrack , требуя, чтобы соединения возвращались через состояние NEW. Правило для порта 3306 будет беспрепятственно поддерживать там уже установленное соединение.
даже 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 и помощников по отслеживанию соединений .