LINUX.ORG.RU
ФорумAdmin

udp source address


0

0

Привет.

Наткнулся на необычную для себя вещь. Есть DNS-сервер, который слушает 0.0.0.0:53. На сервере есть два IP: 1.1.1.1 (eth1) и 1.1.1.2 (eth1:0).

Если приходит запрос на 1.1.1.2, то получаем такое:

13:31:17.809847 IP 3.3.3.3.35856 > 1.1.1.2.domain: 22611 MX? somedomain.ru. (33)
13:31:17.809914 IP 1.1.1.1.domain > 3.3.3.3.35856: 22611*- 1/0/1 MX mx.somedomain.ru. 10 (69)

Т.е. ответ идет с другим src. Таблица:
1.1.1.0 * 255.255.255.128 U 0 0 0 eth1
default 1.1.1.3 0.0.0.0 UG 0 0 0 eth1

Пробовал извращаться с подменой src-адреса через fwmark+iproute2 - не помогло, результат тот же.

В связи с этим два вопроса:
1. Почему так происходит
2. Как это вылечить

★★★

>Пробовал извращаться с подменой src-адреса через fwmark+iproute2 - не помогло, результат тот же.

CONNMARK прикручивал?

nnz ★★★★
()

Ядру пофиг на какой интерфейс\ip пришел пакет, при посылке ответа оно руководствуется только таблицей марщрутизации. А у тебя все маршруты через eth1. route add -host 3.3.3.3 gw 0.0.0.0 dev eth1:0 Должно помочь.

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

я делал так

iptables -t mangle -A OUTPUT -p udp --sport 53 -j MARK --set-mark 666

и потом добавлял

ip rule add fwmark 666 table dnsrt
ip route add default via 1.1.1.3 dev eth1:0 src 1.1.1.2 table dnsrt

Проверял, пакет попадает в таблицу dnsrt, но src адрес не меняется на 1.1.1.2.

CONNMARK тоже сейчас попробовал, не помог %(

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

>route add -host 3.3.3.3 gw 0.0.0.0 dev eth1:0 Должно помочь.
Это помогло, но 3.3.3.3 это адрес любого человека в интернете, поэтому вариант не очень подходит.

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

>Это помогло, но 3.3.3.3 это адрес любого человека в интернете, поэтому вариант не очень подходит. route flush route add default gw 1.1.1.3 dev eth1:0 route add -net 1.1.1.0 gw 0.0.0.0 netmask 255.255.255.128 dev eth1:0

И не юзай костыли вроде CONNMARK.

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

когда нибудь я научась форматировать с первого раза route flush route add default gw 1.1.1.3 dev eth1:0 route add -net 1.1.1.0 gw 0.0.0.0 netmask 255.255.255.128 dev eth1:0

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

>route add default gw 1.1.1.3 dev eth1:0
Это вылечит одно и поломает другое. Заработает eth1:0, но перестанет отвечать eth0

А CONNMARK мне не помог. С ним пакеты вообще перестали попадать в нужную таблицу. Видимо --resotre-mark не срабатывает. С -j MARK они туда попадают, но src - не меняется, даже если я указываю его принудительно:
ip route add default via 1.1.1.3 dev eth1:0 src 1.1.1.2 table dnsrt

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

>а лучше пропиши в named.conf (если у тебя bind dns) чтобы слушал оба этих интерфейса вместо 0.0.0.0
Так и сделал, и свершилось чудо! Спасибо большое!

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

Ну это в принципе правильное решение, просто добавлю. Когда приложение не указывает с какого ip-адреса должен идти пакет, то адрес выбирается автоматически на основании только главной таблице маршрутизации. Изменить его только с помощью SNAT, то есть если рассматривать вариант, что DNS слушает 0.0.0.0, то вам нужен: CONNMARK(--set-mark), CONNMARK(--restore-mark), SNAT(mark).

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