[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Вопрос по роутингу/iptables



Всем привет,


Такая ситуация. Нужно реализовать подобие Captive Portal. То есть
определенные запросы (идущие на 80 порт и удовлетворяющие неким условиям
(*) ) отправлять на специальный веб-сервер (типа как через -j REDIRECT),
который будет редиректить на некоторую страничку.

Проблема в том, что редирект можно делать только в nat/PREROUTING (ну и
в OUTPUT еще), а это слишком рано, некие условия (*) оптимальнее всего
вычисляются в mangle/FORWARD (потому что там известно, собирался ли
пакет убегать через "внешний" интерфейс или нет).

Возникла такая идея (проверить пока не на чём):

1) В mangle/FILTER вычислять условие, если оно удовлетворяется, то
ставить метку, скажем, в 1.

2) В iproute2 настроить, что все, что имеет метку 1 (вроде, можно такое)
отпралять на интерфес lo, через 127.0.0.1. Непонятно, правда, куда
пойдет пакет. Судя по картинке
http://www.jollycom.ca/iptables-tutorial/images/tables_traverse.jpg он
должен идти в mangle/POSTROUTING, nat/POSTROUTING, потом в сеть.

3) Так как мы его отправили в lo, он тут же, по идее, должен опять
пройти все цепочки. Тут мы его и заредиректим (т.е правило типа -t nat
-i lo -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080. Чтоб
с самой машины можно было ходить на 80 порт, можно в шаге 2.5 в
POSTROUTING делать SNAT на какой-нибудь дурацкий адрес, и тут его тоже
матчить (ну или поставить в условии, что source IP - не 127.0.0.1).

Непонятно, как в обратную сторону пакеты пойдут. По идее, они пойдут
через OUTPUT,  у них восстановится srcaddr:srcport (на тот, что был в
dstaddr:dstport перед REDIRECT) и они благополучно вернутся к отправителю.

Вопрос. А может, как-то проще можно? Придуманная схема выглядит ой как
нетрезво.

-- 
WBR,
Ivan S. Dubrov

Attachment: signature.asc
Description: OpenPGP digital signature


Reply to: