LINUX.ORG.RU
ФорумAdmin

SNAT & routing


0

0

Есть 2 линка в интернет. На одном реальный ЙП(ppp0), на другом серый(eth1). Дефолтный шлюз на сером линке.

Нужно чтобы asterisk слал запросы через линк с реальным ЙП.

Делаю:

iptables -t mangle -A OUTPUT -d ! 192.168.0.0/255.255.255.0 -m owner --uid-owner asterisk -j MARK --set-mark 255

ip route add 88.88.88.88 dev ppp0 table i_ip

ip route add default via 88.88.88.88 dev ppp0 table i_ip

ip rule add fwmark 255 pri 100 table i_ip

ip rule add from 88.88.88.88 pri 200 table i_ip

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

Пакеты от астериска уходят через ppp0, как и нужно, НО адрес источника у них не 88.88.88.88 а 192.168.254.2 (eth1, серый линк).

Как добиться SNAT на 88.88.88.88 для пакетов, идущих через ppp0?

iptables -t nat -A POSTROUTING -o ppp0 -j SNAT 88.88.88.88 дает тот же результат.

Через цепочки PRE/POSTROUTING проходят только транзитные пакеты, т.ч. махинации с натом бессмысленны. У вас пакеты с eth1 заворачиваются на 88.88.88.88 и пройдя OUTPUT вылетают во-внешку

mutronix ★★★★
()

> iptables -t mangle -A OUTPUT -d ! 192.168.0.0/255.255.255.0 -m owner --uid-owner asterisk -j MARK --set-mark 255

> Как добиться SNAT на 88.88.88.88 для пакетов, идущих через ppp0?

А не проще будет отказаться от iproute и в iptables на выходе задать "-o ppp0" по тому же флажку?

anonymous
()
Ответ на: комментарий от anonymous

> А не проще будет отказаться от iproute и в iptables на выходе задать "-o ppp0" по тому же флажку?

нужно чтобы через ppp0 шёл только астериск. все остальные по eth1. для этого и применяется маркировка.

VladimirMalyk ★★★★★
() автор топика
Ответ на: комментарий от mutronix

> Через цепочки PRE/POSTROUTING проходят только транзитные пакеты, т.ч. махинации с натом бессмысленны. У вас пакеты с eth1 заворачиваются на 88.88.88.88 и пройдя OUTPUT вылетают во-внешку

спасибо. в моем случае видимо как раз это и происходит. хотя в http://lists.netfilter.org/pipermail/netfilter/2006-May/065700.html пишут что после OUTPUT пакеты в POSTROUTING попадают. по этой картинке http://www.opennet.ru/docs/RUS/iptables/misc/iptables-tutorial/images/tables_... то же самое.

ну да ладно. существуют ухищрения сделать SNAT для локальных процессов?

VladimirMalyk ★★★★★
() автор топика
Ответ на: комментарий от mutronix

http://www.opennet.ru/docs/RUS/iptables/#TRAVERSINGOFTABLES

От локальных процессов:
mangle OUTPUT
nat OUTPUT
Filter OUTPUT
mangle POSTROUTING
nat POSTROUTING

То есть проходят.

Топикстартеру:
> существуют ухищрения сделать SNAT для локальных процессов?

По идее этих ухищрений для локальных процесов делать не надо совсем. Если на локальном хосте нормально прописана таблица маршрутизации, то для локальных хостов адрес отправителя пакета назначается автоматически согласно таблице маршрутов. И пересылается также автоматически через соответствующие интерфейсы.

> iptables -t mangle -A OUTPUT -d ! 192.168.0.0/255.255.255.0 -m owner --uid-owner asterisk -j MARK --set-mark 255

> ip route add 88.88.88.88 dev ppp0 table i_ip

> ip route add default via 88.88.88.88 dev ppp0 table i_ip

> ip rule add fwmark 255 pri 100 table i_ip

> ip rule add from 88.88.88.88 pri 200 table i_ip

Это всё лишнее. Вся эта работа производится автоматически. Просто убери все эти правила
> iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

Это оставь - для LAN.

И пробуй. Не получится - показывай тогда ip route show (route -n)

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

> И пробуй. Не получится - показывай тогда ip route show (route -n)

gate:/etc/iptables# ip ro s

195.5.5.202 dev ppp0 proto kernel scope link src 82.207.127.61

192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.254

192.168.254.0/24 dev eth1 proto kernel scope link src 192.168.254.2

default via 192.168.254.1 dev eth1

#таблица маршрутизации для астериска

gate:/etc/iptables# ip ro s t i_ip

88.88.88.88 dev ppp0 scope link

default via 88.88.88.88 dev ppp0

#отлов пакетов от астериска в таблицу маршрутизации

gate:/etc/iptables# ip ru l

0: from all lookup 255

100: from all fwmark 0xff lookup i_ip

200: from 88.88.88.88 lookup i_ip

32766: from all lookup main

32767: from all lookup default

VladimirMalyk ★★★★★
() автор топика

У меня так:

echo "200 table1" >> /etc/iproute2/rt_tables

iptables -t mangle -A OUTPUT -m owner --uid-owner asterisk -d ! 127.0.0.1 -j MARK --set-mark 100
iptables -t mangle -A OUTPUT -m owner --uid-owner asterisk -d 192.168.1.0/24 -j MARK --set-mark 101

ip rule add fwmark 100 lookup table1
ip route add default dev ppp0 table table1
ip route flush cache

iptables -t nat -A POSTROUTING -m owner --uid-owner asterisk -o ppp0 -j SNAT --to X.X.X.X

SlavikSS ★★
()
Ответ на: комментарий от SlavikSS

> iptables -t mangle -A OUTPUT -m owner --uid-owner asterisk -d 192.168.1.0/24 -j MARK --set-mark 101

при этом клиенты SIP из локалки не отваливаются?

в остальном сделал один в один - результат прежний - пакеты от астериска идут через ppp0, но отправитель стоит не 88.88.88.88

VladimirMalyk ★★★★★
() автор топика
Ответ на: комментарий от Slavaz

> И пробуй. Не получится - показывай тогда ip route show (route -n)

gate:/etc/iptables# ip ro s

195.5.5.202 dev ppp0 proto kernel scope link src 88.88.88.88

192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.254

192.168.254.0/24 dev eth1 proto kernel scope link src 192.168.254.2

default via 192.168.254.1 dev eth1

#таблица маршрутизации для астериска

gate:/etc/iptables# ip ro s t i_ip

88.88.88.88 dev ppp0 scope link

default via 88.88.88.88 dev ppp0

#отлов пакетов от астериска в таблицу маршрутизации

gate:/etc/iptables# ip ru l

0: from all lookup 255

100: from all fwmark 0xff lookup i_ip

200: from 88.88.88.88 lookup i_ip

32766: from all lookup main

32767: from all lookup default

VladimirMalyk ★★★★★
() автор топика
Ответ на: комментарий от VladimirMalyk

тебе нужно так:
> iptables -t mangle -A OUTPUT -m owner --uid-owner asterisk -d 192.168.0.0/24 -j MARK --set-mark 101


это для того, чтоб ответ от астериска клиенту не заворачивался на ppp0

> в остальном сделал один в один - результат прежний - пакеты от астериска идут через ppp0, но отправитель стоит не 88.88.88.88


покажи iptables -vnL -t nat

SlavikSS ★★
()
Ответ на: комментарий от SlavikSS

>> iptables -t mangle -A OUTPUT -m owner --uid-owner asterisk -d 192.168.0.0/24 -j MARK --set-mark 101

> это для того, чтоб ответ от астериска клиенту не заворачивался на ppp0

понял.

> iptables -vnL -t nat

gate:/etc/iptables# iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 149 packets, 15141 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 1 packets, 73 bytes)
 pkts bytes target     prot opt in     out     source               destination
    1   539 SNAT       0    --  *      ppp0    0.0.0.0/0            0.0.0.0/0           OWNER UID match 117 to:88.88.88.88
   94  7069 SNAT       0    --  *      eth1    192.168.0.0/24      !192.168.0.0/24      to:192.168.254.2

Chain OUTPUT (policy ACCEPT 2 packets, 612 bytes)
 pkts bytes target     prot opt in     out     source               destination

VladimirMalyk ★★★★★
() автор топика
Ответ на: комментарий от VladimirMalyk

Пакет попал в цепочку, исходящий айпи должен изменится!
У меня так postfix заворачивается и всё отлично пашет!
Астериск как один процесс или несколько?

SlavikSS ★★
()
Ответ на: комментарий от SlavikSS

> Пакет попал в цепочку, исходящий айпи должен изменится!

йп измениться должен, но похоже пакет в цепочку не попал.

показатель pkts для цепочки не изменяется. точнее изменяется, но количество пакетов много меньше того, что я регистрирую через tcpdump на интерфейсе ppp0.

ситцация аналогична даже если я делаю iptables -t nat -A POSTROUTING -o ppp0 -j SNAT --to-source 88.88.88.88

может ли такое быть, что пакеты улетают во внешку сразу после OUTPUT, как mutronix писал(а).

VladimirMalyk ★★★★★
() автор топика
Ответ на: комментарий от Slavaz

gate:/etc/iptables# iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 1240 packets, 116K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 5 packets, 352 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 MASQUERADE  0    --  *      ppp0    0.0.0.0/0            0.0.0.0/0
    0     0 RETURN     0    --  *      ppp0    0.0.0.0/0            0.0.0.0/0
  993 86483 SNAT       0    --  *      eth1    192.168.0.0/24      !192.168.0.0/24      to:192.168.254.2

Chain OUTPUT (policy ACCEPT 5 packets, 352 bytes)
 pkts bytes target     prot opt in     out     source               destination
gate:/etc/iptables#

tcpdump -i ppp0 показывает исходящие пакеты с неправильным ЙП отправителя:
14:38:45.053797 IP 192.168.254.2.sip > h40n40.sub.tario.ru.sip: SIP, length: 381

VladimirMalyk ★★★★★
() автор топика
Ответ на: комментарий от VladimirMalyk

> показатель pkts для цепочки не изменяется. точнее изменяется, но количество пакетов много меньше того, что я регистрирую через tcpdump на интерфейсе ppp0.

Зачем гнать все пакеты через нат? в нат попадают только первые пакеты открытия сессии!

> может ли такое быть, что пакеты улетают во внешку сразу после OUTPUT, как mutronix писал(а).


С таким заворачиванием пакеты не попадают в OUTPUT таблицы filter!

> ситцация аналогична даже если я делаю iptables -t nat -A POSTROUTING -o ppp0 -j SNAT --to-source 88.88.88.88


У меня не хотело заворачивать ICMP, возможно с SIP та же проблема. Попробуйте завернуть какой-нибудь другой процесс, работающий по TCP или UDP.

SlavikSS ★★
()
Ответ на: комментарий от SlavikSS

> Зачем гнать все пакеты через нат? в нат попадают только первые пакеты открытия сессии!

именно пакеты открытия сессии я и вижу в tcpdump. астериск дает запрос, потом еще и еще...

> У меня не хотело заворачивать ICMP, возможно с SIP та же проблема. Попробуйте завернуть какой-нибудь другой процесс, работающий по TCP или UDP.

буду пробовать, спасибо.

VladimirMalyk ★★★★★
() автор топика

Решение проблемы

Сабжевым способом решить проблемы с asterisk мне не удалось.

PavelR с opennet подсказал альтернативный способ - использовать опцию bindaddr астериска. астериск шлет запросы через тот интерфейс, на который он забинден. это не совсем то, что хотелось, но проблему решает.

VladimirMalyk ★★★★★
() автор топика
Ответ на: Решение проблемы от VladimirMalyk

Ну... цель оправдывает средства. Цель достигнута - чего ещё надо для счастья?

Но проблема действительно интересная, у себя тестовый полигон поднимать нету времени, к сожалению... попытался было напрячь мозг и смоделировать все процессы - воображения не хватило :(

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

> Ну... цель оправдывает средства. Цель достигнута - чего ещё надо для счастья?

это да :)

> Но проблема действительно интересная, у себя тестовый полигон поднимать нету времени, к сожалению... попытался было напрячь мозг и смоделировать все процессы - воображения не хватило :(

с проблемой надо все-таки разобраться - на случай если в следующий раз это будет не астериск. честно признаться, не думал что ситуация окажется настолько нетривиальной.

VladimirMalyk ★★★★★
() автор топика
Ответ на: комментарий от VladimirMalyk

>может ли такое быть, что пакеты улетают во внешку сразу после 
OUTPUT, как mutronix писал(а).

В первом комменте я был не прав - исходящие локальные пакеты проходят
через POSTROUTING как и показано на приведенной вами картинке. А 
теперь смотрим картинку ещё раз. Routing decision выполняется до 
прохождения цепочек iptables. 

порядок движения пакетов, созданных локальными процессами.
Таблица 3-3. От локальных процессов
Шаг  	Таблица  	Цепочка  	Примечание
1 	  	  	                Локальный процесс (т.е., 
                                        программа-сервер или 
                                        программа-клиент).
2 	  	  	                Принятие решения о 
                                        маршрутизации. Здесь решается 
                                        куда пойдет пакет дальше -- 
                                        на какой адрес, через какой 
                                        сетевой интерфейс и пр.
3 	mangle 	        OUTPUT 	        Здесь производится внесение 
                                        изменений в заголовок пакета.
                                        Выполнение фильтрации в этой 
                                        цепочке может иметь 
                                        негативные последствия.
7  	nat  	        POSTROUTING  	Здесь выполняется Source 
                                        Network Address Translation. 
                                        Не следует в этой цепочке 
                                        производить фильтрацию 
                                        пакетов во избежание 
                                        нежелательных побочных 
                                        эффектов. Однако и здесь 
                                        можно останавливать пакеты, 
                                        применяя политику 
                                        по-умолчанию DROP.
8 	  	  	                Сетевой интерфейс (например, 
                                        eth0)
9 	  	  	                Кабель (т.е., Internet)


>    0     0 MASQUERADE  0    --  *     ppp0\
>    0.0.0.0/0            0.0.0.0/0
>    0     0 RETURN      0    --  *     ppp0\
>    0.0.0.0/0            0.0.0.0/0
>  993 86483 SNAT        0    --  *     eth1\
>    192.168.0.0/24      !192.168.0.0/24      to:192.168.254.2

Все пакеты астерикса изначально идут на default route eth1! Вот 
почему правило для -o ppp0 -j SNAT не работает, а правило -o eth1 -j 
SNAT --to-source 192.168.254.2 - да!

Дальше маркированный пакет с серым в попадает в ip route и уходит 
через ppp0

mutronix ★★★★
()
Ответ на: комментарий от mutronix

Решение проблемы 2

> Все пакеты астерикса изначально идут на default route eth1! Вот 
почему правило для -o ppp0 -j SNAT не работает, а правило -o eth1 -j 
SNAT --to-source 192.168.254.2 - да!

да, действительно так и есть.

добавляем в /etc/iproute2/rt_tables таблицу iip

делаем:
ip ru add from 88.88.88.88 table iip
ip ro add 88.88.88.88 dev ppp0 table iip
ip ro add default via  88.88.88.88 dev ppp0 table iip
ip ru add fwmark 255 pri 100 table iip
ip ru add from 88.88.88.88 pri 200 table iip
ip ru f c

iptables -t mangle -A OUTPUT -d ! 192.168.0.0/24 -m owner --uid-owner asterisk -j MARK --set-mark 255
iptables -t nat -A POSTROUTING -m mark --mark 255 -j SNAT --to-source 88.88.88.88

и все работает отлично!

mutronix, спасибо.

VladimirMalyk ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.