Как послать пакет из ppp адресованный локальному адресу через eth0 (Причем DNAT не подходит, DST нужно сохранить...)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

andrews239
Сообщения: 11

Как послать пакет из ppp адресованный локальному адресу через eth0

Сообщение andrews239 »

Пока есть только одна рабочая схема с двойным DNAT, но для этого нужен второй linux...

Linux1 (ppp0 1.2.3.4, eth0 192.168.1.1/24)
Linux2 (eth0 192.168.1.10)
Target (eth0 192.168.1.11, dummy:1.2.3.4)

Приходит пакет от провайдера from x.y.z.t to 1.2.3.4

Linux1

ppp ( x.y.z.t -> 1.2.3.4)
PREROUTE-dnat ( x.y.z.t -> 192.168.1.10)
eth0 ( x.y.z.t -> 192.168.1.10) send via gw 192.168.1.10


Linux2

eth0 ( x.y.z.t -> 192.168.1.10)
PREROUTE-dnat ( x.y.z.t -> 1.2.3.4)
eth0 ( x.y.z.t -> 1.2.3.4) send via gw 192.168.1.11


Target

eth0 ( x.y.z.t -> 1.2.3.4) accept to local ip.



В результате двойного преобразования получаем пакет с прежнем
DST адресом но не на первом роутере, а на нужном компе во внутренней сети.

Огорчает необходимость второго linux бокса... Пока на его роль можно подрядить
только виртуальную машину, но это как то не слишком рационально, может все же
есть способ ограничится одним роутером, просто по определенной класификации
не принимать пакет локально, а посылать на выбранный GW...
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Как послать пакет из ppp адресованный локальному адресу через eth0

Сообщение sash-kan »

опишу простейшую схему. в случае, если оба интерфейса — ethernet.
1.
eth0 — внешний мир.
eth1 — локальная сеть. в ней находится хост с адресом 1.2.3.4.
2. на обоих интерфейсах прописаны необходимые для их функционирования ip-адреса. никаких упоминаний ни про 1.2.3.4, ни про сети, включающие этот адрес, не должно быть ни в адресах на этих двух интерфейсах, ни в таблице маршрутизации.
3. пакеты, адресованные для 1.2.3.4, приходят с дефолтного шлюза (доступного через eth0). и туда же должны возвращаться ответные пакеты.

что делаем:
1. убеждаемся, что netfilter пропустит пакеты для/от 1.2.3.4 через все пять цепочек PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING.
2. убеждаемся, что включен форвардинг:
$ cat /proc/sys/net/ipv4/ip_forward
1
3. включаем proxy_arp на обоих интерфейсах:
$ echo 1 | sudo tee /proc/sys/net/ipv4/conf/eth0/proxy_arp | sudo tee /proc/sys/net/ipv4/conf/eth1/proxy_arp
1
4. прописываем маршрут до хоста 1.2.3.4:
$ sudo ip r a 1.2.3.4 dev eth1

всё. получился так называемый псевдо-бридж. описанный, например, здесь: http://lartc.org/howto/lartc.bridging.proxy-arp.html#AEN2371 (есть и переводы lartc-а на русский язык).


в случае, если один (или оба) интерфейса — типа ppp, есть нюансы.
1. возможно, в провайдерском файле (/etc/ppp/peers/как-он-там-у-вас-называется), придётся явно упомянуть опцию proxyarp.
2. если на интерфейсе ppp0 вы получаете от провайдера адрес 1.2.3.4, вся схема может не заработать. и надо будет этот адрес заменить на какой-нибудь фейковый. делается с помощью опции в провайдерском файле такого примерно вида:
10.10.10.10:
(ip-адрес, за ним двоеточие. см. man pppd).
3. не то чтобы нюанс, а просто напоминание: дефолтный маршрут должен проходить через ppp0. если это невозможно, придётся как-то изворачиваться. видимо, где-то так: http://lartc.org/howto/lartc.netfilter.html (маркирование пакетов и отдельный (для них) дефолтный шлюз). это всё в том случае, если src-ip в приходящих для 1.2.3.4 пакетах нельзя свести к какому-нибудь диапазону адресов.

вариант с ppp мною ни разу не опробован, но препятствий не вижу. только вышеперечисленные нюансы.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
andrews239
Сообщения: 11

Re: Как послать пакет из ppp адресованный локальному адресу через eth0

Сообщение andrews239 »

Похоже самым удачным выбором было бы использование iptables ... -j ROUTE, т.к. это можно БЫЛО сделать
в PREROUTE... Но к сожалению авторы iptables решили, что дублировать другие подсистемы не стоит, но
к сожалению мой случай как раз не дублировался...

pppd синхронизирует настройки IP с провайдером, и провайдер адрес навязывает. После установки
соединения адрес так же не изменить.

Так что 1.2.3.4 с интерфейса не убрать...

Похоже стоит написать модуль для iptables, который тупо меняет DST на mangle/PREROUTE
и меняет его обратно на mangle/POSTROUTE.... И главное ни чего НЕ трекает...
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Как послать пакет из ppp адресованный локальному адресу через eth0

Сообщение sash-kan »

andrews239 писал(а):
07.04.2009 01:40
провайдер адрес навязывает

что значит «навязывает»? если указать свой, перестают ходить пакеты через интерфейс?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
andrews239
Сообщения: 11

Re: Как послать пакет из ppp адресованный локальному адресу через eth0

Сообщение andrews239 »

sash-kan писал(а):
07.04.2009 14:14
andrews239 писал(а):
07.04.2009 01:40
провайдер адрес навязывает

что значит «навязывает»? если указать свой, перестают ходить пакеты через интерфейс?


Навязывает, это шлет conf-reject и отказывается установить связь, если проявляешь инициативу с другим адресом.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Как послать пакет из ppp адресованный локальному адресу через eth0

Сообщение sash-kan »

andrews239 писал(а):
07.04.2009 01:40
Так что 1.2.3.4 с интерфейса не убрать...

собственно, насколько я понимаю механику, убирать надо не столько адрес с интерфейса, сколько (возможно добавившиеся) маршруты из таблицы маршрутизации. они там появляются? см. вывод
$ ip r sh table all
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
andrews239
Сообщения: 11

Re: Как послать пакет из ppp адресованный локальному адресу через eth0

Сообщение andrews239 »

sash-kan писал(а):
11.04.2009 16:13
andrews239 писал(а):
07.04.2009 01:40
Так что 1.2.3.4 с интерфейса не убрать...

собственно, насколько я понимаю механику, убирать надо не столько адрес с интерфейса, сколько (возможно добавившиеся) маршруты из таблицы маршрутизации. они там появляются? см. вывод
$ ip r sh table all


Diff:
> 1.2.3.200 dev ppp0 proto kernel scope link src 1.2.3.4
> local 1.2.3.4 dev ppp0 table local proto kernel scope host src 1.2.3.4

Добавились два существенных маршрута.
Первый вороде как к теме не относится...

Я попытался перенести "local ..." в другую таблицу, с pref 10, линк работать перестал...
Не очень понимаю, почему так получилось. Похоже таблица local имеет какието
свойства не описываемые лаконичным:

0: from all lookup local
.....

Если бы работа канала не нарушилась, то можно было часть трафика не акцептить локально,
а отправлять дальше...
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Как послать пакет из ppp адресованный локальному адресу через eth0

Сообщение sash-kan »

и маркирование пакетов (с запихиванием их в другую таблицу маршрутизации) тоже не работает? (ссылка есть в первом моём посте).
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
andrews239
Сообщения: 11

Re: Как послать пакет из ppp адресованный локальному адресу через eth0

Сообщение andrews239 »

sash-kan писал(а):
12.04.2009 19:03
и маркирование пакетов (с запихиванием их в другую таблицу маршрутизации) тоже не работает? (ссылка есть в первом моём посте).


Я не точно сформулировал задачу... Мне нужно переправить ЧАСТЬ трафика...
Поэтому я тестировал принятие трафика локально при переносе роута из local в
пользовательский rule.

Думаю, что с MARK & ip rule проблем не возникнет.

Пока есть продвижение через iptables...
Вместо "-j ROUTE" там появилось "-j TEE" создает копию пакета и отправляет
на указанный GW. Оригинал пакета при этом нужно естественно убить...
Идея конечно не фонтан, но попробовать нужно...
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Как послать пакет из ppp адресованный локальному адресу через eth0

Сообщение sash-kan »

andrews239 писал(а):
13.04.2009 17:40
Думаю, что с MARK & ip rule проблем не возникнет.
так за чем же дело встало? помечайте только нужные пакеты.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
andrews239
Сообщения: 11

Re: Как послать пакет из ppp адресованный локальному адресу через eth0

Сообщение andrews239 »

sash-kan писал(а):
16.04.2009 20:07
andrews239 писал(а):
13.04.2009 17:40
Думаю, что с MARK & ip rule проблем не возникнет.
так за чем же дело встало? помечайте только нужные пакеты.

Проблема в том, что если из local унести правило:
local 1.2.3.4 dev ppp0 table local proto kernel scope host src 1.2.3.4
то не помеченные пакеты до локального интерфейса не доходят...


Я попытался перенести "local ..." в другую таблицу, с pref 10. Линк работать перестал...
Не очень понимаю, почему так получилось. Похоже таблица local имеет какието
свойства не описываемые лаконичным:
0: from all lookup local
.....

Если бы работа канала не нарушилась, то можно было часть трафика не акцептить локально,
а отправлять дальше...
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Как послать пакет из ppp адресованный локальному адресу через eth0

Сообщение sash-kan »

чего-то я, видимо, не понимаю.
в частности, не понимаю, что означает в данном случае слово «унести».
если оно означает «удалить», то спрашивается — зачем?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
andrews239
Сообщения: 11

Re: Как послать пакет из ppp адресованный локальному адресу через eth0

Сообщение andrews239 »

Так...

Если я оставляю маршрут в таблице local

local 1.2.3.4 dev ppp0 table local proto kernel scope host src 1.2.3.4

То ВСЕ пакеты захватываются локальным адресом, и ни какие FWMARK мне не помогут это
изменить.

Если я эту строчку удаляю, то ВСЕ пакеты НЕ приходят на локальный адрес...

Нужно что-то среднее... :-)
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Как послать пакет из ppp адресованный локальному адресу через eth0

Сообщение sash-kan »

ага.
нуу. с моими поверхностными познаниями вариантов видится всего три:
перенести все записи (ip r sh table all), тем или иным образом затрагивающие 1.2.3.4, из table local в какую-нибудь другую таблицу. _возможно_ это сработает.
или договариваться с провайдером о том, чтобы они не навязывали вам 1.2.3.4 внутри туннеля.
или оставить существующую конфигурацию.

p.s. ещё один вариант пришёл в голову. те пакеты, что вам нужно обрабатывать локально, можно заворачивать через dnat на какой-нибудь локальный ip. не ставя на них метку, естественно.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
andrews239
Сообщения: 11

Re: Как послать пакет из ppp адресованный локальному адресу через eth0

Сообщение andrews239 »

sash-kan писал(а):
19.04.2009 18:08
ага.
нуу. с моими поверхностными познаниями вариантов видится всего три:
перенести все записи (ip r sh table all), тем или иным образом затрагивающие 1.2.3.4, из table local в какую-нибудь другую таблицу. _возможно_ это сработает.


Я как раз написал (хоть и коряво) что после такого переноса локальный адрес перестает работать.

sash-kan писал(а):
19.04.2009 18:08
или договариваться с провайдером о том, чтобы они не навязывали вам 1.2.3.4 внутри туннеля.
или оставить существующую конфигурацию.


Увы, у мобильного оператора куча клиентов, и желающие странного им не нужно. :-(

sash-kan писал(а):
19.04.2009 18:08
p.s. ещё один вариант пришёл в голову. те пакеты, что вам нужно обрабатывать локально, можно заворачивать через dnat на какой-нибудь локальный ip. не ставя на них метку, естественно.


Гениально! Хорошая идея.

Проблему исходящих то же можно решить... Поставить route default .... src fake-ip .... И на выходе snat...

Вобщем такой вариант более логичное решение, чем дублировать пакеты и оригинал уничтожать...
Спасибо сказали: