Возникла необходимость по наступлению определённого события временно перенаправлять http соединения на другой порт, где слушает nginx с заглушкой. Это легко можно сделать с помошью парочки правил в iptables. Приведу несколько основных моментов из bash скрипта. Нам нужны две таблицы в новой цепочке: “nat” для непосредственно перенаправления и “filter” для сброса активных сессий. Фильтровать активные сессии необходимо потому, что в таблицу “nat”, цепочки PREROUTING, поподают лишь tcp соединения с состоянием NEW. Активные tcp соединения живут примерно 2-3 минуты. Если это не критично, то можно обойтись без их фильтрации. Для этого просто не добавляем все правила в которых указана таблица “filter”. Для начала создадим новую цепочку. Это удобно тем что её можно очистить полностью, когда необходимо вернуть всё к изначальному состоянию.
1 2 |
|
Теперь создадим два правила в цепочках PREROUTING и INPUT в которых будем направлять tcp в нашу цепочку. Эти правила не будут удаляться.
1 2 |
|
Теперь, если нам необходимо включить перенаправление, то добавляем правила в нашу цепочку:
1 2 |
|
Если необходимо перенаправлять к примеру ещё и https то можно вместо “–dport 80” указать “-m multiport –dports 80,443” Чтобы убрать перенаправление, просто чистим нашу цепочку.
1 2 |
|
Вот в принципе и всё, за всеми подробностями идём в маны iptables, написано там всё очень подробно.
P.S.
Нашел более удобный способ сброса активный tcp соединений - conntrack. Пакет называется по разному, в Debian вроде просто conntrack, в CentOS/RedHat conntrack-tool. После установки, у нас появляется возможность удобно посмотреть активные соединения и их статус:
1
|
|
Так же удобно их разом очистить:
1
|
|
Фильтровать он по multiport не умеет. Суть заключается в том, что просто чистится в ядре таблица соединений tcp по определённому порту. Входящий пакет после этого со статусом не NEW не находится в таблице и сбрасывается с tcp-reset. В таком случае нет нужды использовать таблицу filter.