Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: icq через iproute2+iptables  (Прочитано 2057 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн fisher74

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 13761
    • Просмотр профиля
icq через iproute2+iptables
« : 20 Сентября 2010, 11:29:29 »
Просьба не пинать, делаю первые скромные шаги в iproute2+iptables.

Сервер: Локальная сеть провайдера получается через eth0 (дальше adsl-роутер 192.168.1.1).
Запущен squid, который локальные ресурсы провайдера тянет напрямую, а фуллнет - каскадом из "головного" прокси-сервера через openvpn-сервер (там тоже adsl).
Кроме локальной сети провайдер "дарит" связь с icq-серверами. Какой алгоритм не знаю, но пинги не идут, а nmap на порт 5190 откликается.
Если на сервера icq прибить тупой роутинг через eth0, то клиенты icq работают без проблем, но связи по http с серверами нет. Оно и понятно - провайдер пропускает видимо только порты 5190, а squid, просекая, что есть прямая дорога не обращается к головному прокси.
Можно и на ограничения http забить и squid покрутить, но хочется поправить,а заодно и с iproute2 немного разобраться.
Мои действия:
1. Добавляем таблицу для протокола icq
2. Создаём правила принятия решения маршрутизации
3. Назначаем маршрут по-умолчанию для этой таблицы
#echo 252 icq-proto >> /etc/iproute2/rt_tables
#ip rule add fwmark 1 table icq-proto
#ip route add default via 192.168.1.1 table icq-proto

Получаю:
#ip rule show
0: from all lookup local
32765: from all fwmark 0x1 lookup icq-proto
32766: from all lookup main
32767: from all lookup default
# ip route sh table icq-proto
default via 192.168.1.1 dev eth0

Дальше, как я понимаю, необходимо промаркировать пакеты (а потом и соединения). Делаю это, естественно, с помощью iptables
#iptables -t mangle -A PREROUTING -p tcp --dport 5190 -j CONNMARK --set-mark 1
#iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark

И
#traceroute login.icq.com -p5190
traceroute to login.icq.com (205.188.251.43), 30 hops max, 60 byte packets
connect: Сеть недоступна
# nmap -P0 login.icq.com -p5190

Starting Nmap 5.00 ( http://nmap.org ) at 2010-09-20 11:19 MSD
nexthost: failed to determine route to 205.188.251.43
QUITTING!
Проверяем связь с icq, добавив дефолтовый шлюз через eth0
# ip route add default via 192.168.1.1
# nmap -P0 login.icq.com -p5190

Starting Nmap 5.00 ( http://nmap.org ) at 2010-09-20 11:20 MSD
Interesting ports on login.icq.com (205.188.251.43):
PORT     STATE SERVICE
5190/tcp open  aol

Nmap done: 1 IP address (1 host up) scanned in 0.80 seconds

То есть, что-то где-то не работает...
Понимаю, что нужно исключить ложку дёгтя из моей каши в голове, а лучше всю кашу.
Гугл курю, но что-то пока просветления в мозгах нету.

Просю помощи.

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: icq через iproute2+iptables
« Ответ #1 : 20 Сентября 2010, 14:54:28 »
Дальше, как я понимаю, необходимо промаркировать пакеты (а потом и соединения). Делаю это, естественно, с помощью iptables
#iptables -t mangle -A PREROUTING -p tcp --dport 5190 -j CONNMARK --set-mark 1
#iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark

Это первое, что бросается в глаза. Сам на этих граблях проторчал немного, всё из за невнимательности. Нужно так юзать:
iptables -t mangle -A PREROUTING -p tcp --dport 5190 -j MARK --set-mark 1

Оффлайн censor

  • Старожил
  • *
  • Сообщений: 1126
    • Просмотр профиля
Re: icq через iproute2+iptables
« Ответ #2 : 20 Сентября 2010, 15:05:35 »
из постановки задачи мало что понял, но по моему все должно быть гораздо проще.
может попробуете нарисовать схемку в dia

Оффлайн fisher74

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 13761
    • Просмотр профиля
Re: icq через iproute2+iptables
« Ответ #3 : 20 Сентября 2010, 16:52:24 »
Это первое, что бросается в глаза. Сам на этих граблях проторчал немного, всё из за невнимательности. Нужно так юзать:
iptables -t mangle -A PREROUTING -p tcp --dport 5190 -j MARK --set-mark 1
С марок и начинал - не пошло. На лоре наткнулся на подобную тему, там коннмарк используют, хотя и тоже положительных результатов не добились...

все должно быть гораздо проще.
Опуская холивар:
Необходимо пакеты icq завернуть через определённый шлюз, остальные пакеты (другие протоколы/порты) не трогать

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: icq через iproute2+iptables
« Ответ #4 : 20 Сентября 2010, 18:49:36 »
С марок и начинал - не пошло. На лоре наткнулся на подобную тему, там коннмарк используют, хотя и тоже положительных результатов не добились...
Да, действительно я сейчас нашел не мало howto, которые основываются на коннмарках, но у меня на них так и ничего не получилось. Оно так раньше наверное и работало, но возможно это исправили... Еще я видел, что коннмарки пользуют только для пометки сессионных протоколов, но потом в итоге по меткам коннмарка перемечали пакеты всёже марком, но в нашем случае можно обойтись лишь одним марком..

Оффлайн fisher74

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 13761
    • Просмотр профиля
Re: icq через iproute2+iptables
« Ответ #5 : 20 Сентября 2010, 19:17:51 »
Ну не выходит каменный цветок
(Нажмите, чтобы показать/скрыть)

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: icq через iproute2+iptables
« Ответ #6 : 20 Сентября 2010, 19:24:27 »
А. Это. Ты на этом же компе и проверяешь, по этому пакеты в PREROUTING не попадают. Нужно в OUTPUT продублировать или сделать новую цепочку и туда заворачивать из PREROUTING и OUTPUT.

Оффлайн fisher74

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 13761
    • Просмотр профиля
Re: icq через iproute2+iptables
« Ответ #7 : 20 Сентября 2010, 19:47:47 »
продублировал
(Нажмите, чтобы показать/скрыть)
Воз и ныне там

Пользователь решил продолжить мысль 20 Сентября 2010, 19:48:46:
Или имелось ввиду?
iptables -A OUTPUT -p tcp --dport 5190 -j MARK --set-mark 1

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: icq через iproute2+iptables
« Ответ #8 : 20 Сентября 2010, 19:54:21 »
Нет, всё в mangle должно быть. У тебя, судя по счётчикам, ни один пакет не доходит до того правила. Что в остальных таблицах творится?

Оффлайн fisher74

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 13761
    • Просмотр профиля
Re: icq через iproute2+iptables
« Ответ #9 : 20 Сентября 2010, 20:04:19 »
почти девственная чистота
(Нажмите, чтобы показать/скрыть)
(Нажмите, чтобы показать/скрыть)

Пользователь решил продолжить мысль 20 Сентября 2010, 20:15:51:
Проверил с соседней машины, указав эту железку шлюзом по молчанию. Клиент подключился и пошли счётчики.
Правда, как пошли, так и остановились на тех цифрах, что указаны в спойлере
(Нажмите, чтобы показать/скрыть)
Но понятно, что маркировка идёт, только не вся. Нужно чтобы и с самого сервера так же шли.
« Последнее редактирование: 20 Сентября 2010, 20:15:51 от fisher74 »

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: icq через iproute2+iptables
« Ответ #10 : 20 Сентября 2010, 20:16:21 »
Херь какаято. Сейчас проверил у себя с несуществующим шлюзом, всё работает:
(Нажмите, чтобы показать/скрыть)
Единственная разница, я не юзал именные таблицы...

Оффлайн fisher74

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 13761
    • Просмотр профиля
Re: icq через iproute2+iptables
« Ответ #11 : 20 Сентября 2010, 23:52:38 »
Нашёл кое-какую закономерность. Как только добавляю дефолтовый маршрут на какой-нибудь маршрутизатор (два под боком), сразу связь поднимается, хотя на на нём порт 5190 перекрыт напрочь. Причём как с марками, так и с конмарками работает...
Дальше пока ковыряться неохота... Может завтра продолжу изыскания...

Оффлайн fisher74

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 13761
    • Просмотр профиля
Re: icq через iproute2+iptables
« Ответ #12 : 23 Сентября 2010, 18:39:12 »
Ну никак не получается для локального клиента. Уже и так и эдак. Выставляешь в основной таблице нужный путь - всё работает, переносишь его в доп.таблицу маршрутизации - не работает.
Дампил соединение - идёт только по 5190.
А вот netstat натолкнул на мыслишку. Как ни кручу, клиент исходящим интерфейсом берёт тот, который подходит по основной таблице. Licq ещё какой-то порт поднимает на прослушку. но это видимо для передачи данных и "на скрорость" не влияет.
Начал в глядываться в картинку, которую активно изучаю и появилась мысль, что не удасться мну просто так это побороть.
Картинка работы таблесов:

Смотрим правое плечо, собственно там и начинает формироваться соединение.
Клиент начинает сессию и тут же попадает в маршрутизацию, где ему выставляется нужный интерфейс для работы согласно основной таблицы маршрутов.
А вот маркировка уже идёт позже, в цепочке OUTPUT таблицы mangle. В итоге-то пакеты может и уходят в нужного интерфейса и возвращаются от сервера туда же, но вот клиент их ждёт совершенно в другом месте :(

Есть у кого какие соображения?

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: icq через iproute2+iptables
« Ответ #13 : 23 Сентября 2010, 19:19:15 »
Выкинь эту картинку, ибо:
Цитата: man iptables
              nat:
                  This  table  is  consulted when a packet that creates a new connection is encountered. --cut-- OUTPUT (for altering locally-generated packets before routing)

              mangle:
                  This  table is used for specialized packet alteration.  --cut-- OUTPUT (for  altering  locally-generated packets before  routing)
по сему пакет должен проходить так:
locally generated -> mangle/output -> nat/output -> routing -> filter/output

Оффлайн fisher74

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 13761
    • Просмотр профиля
Re: icq через iproute2+iptables
« Ответ #14 : 23 Сентября 2010, 19:26:36 »
Ещё одна картинка. В ней первичная маршрутизация также до цепочек.
Если нет, то подскажи где я неправильно делаю?
Попробую ещё раз описать нужную схему:
интерфейсы eth0 и ppp0
Нужно соединения на порт 5190 завернуть через eth0 (дальше маршрутизатор с IP 192.168.1.1), а все остальные пакеты через ppp0

Дабы не искать диапазоны серверов icq (мало ли): 205.188.0.0/16, 64.12.0.0/16

 

Страница сгенерирована за 0.033 секунд. Запросов: 23.