1 |
spirit пишет: |
2 |
> Ты же добавлял в nat POSTROUTING SNAT правило по марку... |
3 |
> и говорил что все работает... |
4 |
Да, если добавить -t nat -o tap0 -m mark --mark 0x1 -j SNAT --to-source |
5 |
10.1.0.2, то начинает работать. |
6 |
|
7 |
> Дело видать в том, что адрес источника определяется до того, как пройдет |
8 |
> mangle OUTPUT.. поэтому адрес источника старый - соответствующий |
9 |
> базовому route. после mangle OUTPUT меняется маршрут пакета, но не его |
10 |
> загововки.. его выплевывает в tap0 со старым source addr... |
11 |
Пожалуй, да. |
12 |
|
13 |
Тут еще есть одна засада. Дело в том что мне нужно принудительно |
14 |
отрубать эти соединения при определенных условиях. Это нужно вот для |
15 |
чего. Дело в том, что пользователям позволено менять себе |
16 |
интернет-канал. Каналы отличаются скоростью. На самом деле каналов у |
17 |
меня 4, а пользователей более 3000. Так вот, когда пользователь меняет |
18 |
себе канал интернета, нужно отрубить все его текущие соединения с |
19 |
инетом. Это нужно для того, чтобы предотвратить такую ситуацию: |
20 |
пользователь переключается на дорогой скоростной канал, ставит закачку, |
21 |
переключается на дешевый канал и у него трафик билингуется по низкой |
22 |
цене, а закачка продолжается по дорогому скоростному каналу. |
23 |
|
24 |
Я немного переписал cutter под свои нужды, чтобы рубить соединения прям |
25 |
с локального компа. Алгоритм таков: |
26 |
вызывается утилита local_cutter c аргументами src_ip:src_port |
27 |
dst_ip:dst_port. |
28 |
с помощью библиотеки libpcap запускается сбор пакетов с фильтром host |
29 |
src_ip and port src_port |
30 |
с помощью библиотеки libnet отправляется пакет FIN с dst_ip:dst_port на |
31 |
src_ip:src_port, чтобы приложение подумало что это отправил удаленный |
32 |
сервер. |
33 |
приложение отвечает пакетом ACK. я его улавливаю pcap'ом и беру из этого |
34 |
ответа правильный seq номер, чтобы собрать "правильный" RST пакет. и |
35 |
отправляю на src_ip:src_port этот RST. |
36 |
Все, приложение думает что сервер закрыл соединение. |
37 |
|
38 |
Но вот это работает только для тех соединений, у которых сразу стоит |
39 |
правильный src_ip. Поэтому я убрал правило из iptables nat POSTROUTING, |
40 |
и начал пробовать добиться нужного эффекта с iproute2. |
41 |
|
42 |
Между прочим, если в табличку knet добавить |
43 |
ip ro add 94.100.176.20 via 10.1.0.1 ta knet |
44 |
то у всех пользователей соединение с 94.100.176.20 устанавливается сразу |
45 |
с правильным src_ip (10.1.0.2). И мой local_cutter такое соединение |
46 |
может отрубить. Поэтому я так понимаю что не достаточно ip rule fwmark |
47 |
0x1 ta adsl, чтобы пакеты от user пошли через tap0. |