Sibilia octopress blog

notes on memory.

Перенаправление Http

| Comments

Возникла необходимость по наступлению определённого события временно перенаправлять http соединения на другой порт, где слушает nginx с заглушкой. Это легко можно сделать с помошью парочки правил в iptables. Приведу несколько основных моментов из bash скрипта. Нам нужны две таблицы в новой цепочке: “nat” для непосредственно перенаправления и “filter” для сброса активных сессий. Фильтровать активные сессии необходимо потому, что в таблицу “nat”, цепочки PREROUTING, поподают лишь tcp соединения с состоянием NEW. Активные tcp соединения живут примерно 2-3 минуты. Если это не критично, то можно обойтись без их фильтрации. Для этого просто не добавляем все правила в которых указана таблица “filter”. Для начала создадим новую цепочку. Это удобно тем что её можно очистить полностью, когда необходимо вернуть всё к изначальному состоянию.

1
2
iptables -t nat -N HTTP_REDIR
iptables -t filter -N HTTP_REDIR

Теперь создадим два правила в цепочках PREROUTING и INPUT в которых будем направлять tcp в нашу цепочку. Эти правила не будут удаляться.

1
2
iptables -t nat -I PREROUTING -p tcp -j HTTP_REDIR
iptables -t filter -I INPUT -p tcp -j HTTP_REDIR

Теперь, если нам необходимо включить перенаправление, то добавляем правила в нашу цепочку:

1
2
iptables -t nat -A HTTP_REDIR -p tcp --dport 80 -j REDIRECT --to-port 20302
iptables -t filter -A HTTP_REDIR -p tcp --dport 80 -j REJECT --reject-with tcp-reset

Если необходимо перенаправлять к примеру ещё и https то можно вместо “–dport 80” указать “-m multiport –dports 80,443” Чтобы убрать перенаправление, просто чистим нашу цепочку.

1
2
iptables -t nat -F HTTP_REDIR
iptables -t filter -F HTTP_REDIR

Вот в принципе и всё, за всеми подробностями идём в маны iptables, написано там всё очень подробно.

P.S.

Нашел более удобный способ сброса активный tcp соединений - conntrack. Пакет называется по разному, в Debian вроде просто conntrack, в CentOS/RedHat conntrack-tool. После установки, у нас появляется возможность удобно посмотреть активные соединения и их статус:

1
conntrack -L -p tcp --dport 80

Так же удобно их разом очистить:

1
conntrack -D -p tcp --dport 80

Фильтровать он по multiport не умеет. Суть заключается в том, что просто чистится в ядре таблица соединений tcp по определённому порту. Входящий пакет после этого со статусом не NEW не находится в таблице и сбрасывается с tcp-reset. В таком случае нет нужды использовать таблицу filter.

Comments