Классика жанра:
- два провайдера
- один маршрут дефолтный, другой для "других нужд" отстроен по технологии set-mark/fwmarkПонадобилось SIP пробросить через второй инет (не дефолтный), делаю:
- в iptables -t nat PREROUTING завожу правило -s SIP_SERVER -j MARK --set-mark 0x2
- соответсвенно довожу до "ума" через ip ro add default IF_ISP2 via GW_ISP2 table ISP2
плюс ip ru add fwmark 0x2 table ISP2всё вроде хорошо, но почемуто именно с от SIP_SERVER пакеты пробрасываясь через IF_ISP2 по непонятной мне причине имеют исходящий IP равный моему адресу для ISP1 !!!
т.е. бывает при перезагрузке всё работает нормально, а бывает клинит :(
нарисую ещё разок фигурально:
------как есть (неправильно)--------
IP IP_ISP1.5080 > SIPNET.5060: SIP (исходящий пакет с интерфейса IF_ISP2)
ну и тишина... ибо IP_ISP1 у провайдера ISP2 конечно не валиден
------как должно быть (правильно)---
IP IP_ISP2.5080 > SIPNET.5060: SIP
IP SIPNET.5060 > IP_ISP2.5080: SIP
... и т.д.люди добрые, помогите, а?
Потому что:1. вы не смотрите на правила файрволла в комплексе
2. вы не смотрите на правила маршрутизации и таблицы маршрутизации в комплексе.
3. потому что вы не объединяете правила и таблицы маршрутизации в единую картину с правилами файрволла.
резюмирую:iptables -nvL
iptables -nvL -t nat
iptables -nvL -t mangleip ru sh
ip ro sh table main
ip ro sh table default
ip ro sh table ISP1
ip ro sh table ISP2
ну это предложение слишком общее, меня скорее интересует как увидеть причину по которой исходящий пакет имеет неверный адрес.дело в том, что у меня есть ряд компьютеров, для которых в -t mangle PREROUTING стоит правило -s IP_PC -j MARK --set-mark и эти компьютеры абсолютно спокойно ходят через ISP2
делаю небольшую поправку (сначала не заметил): SIP-сервер находится от локалки (в которой часть компов ходит через ISP1, часть через ISP2) через сервер (назавем его PC_GW), который эти пакеты от SIP NAT-ит, имея две сетевухи - одна смотрит в локалку, другая в сетку с SIP-ом.
что интересно, генерируя пакет netcat-ом на PC_GW (UDP,dport=5060,dst=sipnet.ru) пакет доходит до основного шлюза и выходит в свет через IF_ISP2 с адресом IP_ISP2, но если пакет такойже приходит от SIP, NAT-ится PC_GW в его локальный IP (на стороне основного шлюза он 1:1 как и сгенерированный netcat-ом), но почемуто уходит через IF_ISP2 с адресом IP_ISP1
>ну это предложение слишком общее, меня скорее интересует как увидеть причину по
>которой исходящий пакет имеет неверный адрес.повторить еще раз, как смотреть причину ?
>повторить еще раз, как смотреть причину ?ну например команда ip r g 212.53.40.40
говорит мне, что всё правильно:
212.53.40.40 via GW_ISP2 dev eth1.307 src IP_ISP2 <----- вот один из этапов проверки
cache mtu 1500 advmss 1460 hoplimit 64какими инструментами проследить "решения" системы об исходящем интерфейсе?
тема закрыта, нет сил разбираться, НО каким-то непостяжимым образом вся загвоздка оказалась в порту 5080... поменял на сервере на 5081, скоррестировал правила - и всё работает наура!убивал такой ньюанс - пакет доходил до цепочки -t mangle POSTROUTING, но в -t nat POSTROUTING он таинственным образом исчезал 8-(
>тема закрыта, нет сил разбираться, НО каким-то непостяжимым образом вся загвоздка оказалась
>в порту 5080... поменял на сервере на 5081, скоррестировал правила -
>и всё работает наура!
>
>убивал такой ньюанс - пакет доходил до цепочки -t mangle POSTROUTING, но
>в -t nat POSTROUTING он таинственным образом исчезал 8-(lsmod |grep sip
>lsmod |grep sipбыла такая мысль :) думал хелпер перехватывает, а нет - пусто