Доброго времени суток всем !
есть модуль ядра написанный на Си который ловит пакеты на 80 порт, анализирует GET запрос (т.е. пропускает 3 пакета handshakе т.к. они не несут нагрузки и неизвестно к какой страничке/сайту в конечном итоге пойдёт запрос) и принимает решение дропнуть или пропустить пакет.
задача: хотелось-бы чтоб пакет не просто дропался модулем(на стороне пользователя это выглядит будто сайт просто лёг) а возвращалась страничка с описанием почему доступ закрыт.
сейчас пробую сделать это дело след образом
1 - модуль ядра, при запрещённом GET, шлёт через netlink в userspase следующую структуру
struct helper_data{
__u32 saddr;
__u32 daddr;
__u16 sport;
__u16 dport;
__u32 SEQb;
__u32 ACKb;
};
2 - в userspase демон эту структуру ловит и по идее(судя по анализу с wireshark) должен отправить 2 пакета, ACK (seq=ACKb, ack_seq=345) и ACK(seq=ACKb, ack_seq=345)+PSH+нагрузка(HTTP ответ), соответственно выставив адреса, порты, посчитав контрольную сумму TCP.
но пакеты с выставленный ACK и ACK+PSH не отправляются (tcpdump на сервере и wireshark на клиенте не видят их), при этом sendto ошибок не возвращает.
далее попробовал проанализировать, отправляются пакеты PSH, FIN+ACK, SIN+ACK, RST, и остальные вменяемые и невменяемые связки
при этом если saddr поставить левый и выставить seq из присланной модулем структуры и новый ack_seq, то пакеты отправляются и принимаются, но при этом tcpdump говорит что seq и ack_seq установлены в 1 а не в те значения что я выставил
window в пакете ставлю заведомо больше значений seq и ack_seq
вопщем прошу помощи в понимании как правильно послать поддельный пакет с ответом http, или возможно другой алгоритм решение поставленной задачи.
заранее благодарен за помощь !
да, чуть не забыл, сервер CentOS 6.4 клиент WinXp SP3 оба в VirtualBox