LINUX.ORG.RU
решено ФорумAdmin

Linux Advanced Routing: DNAT пакетов, отправленных на локальный адрес

 , , ,


1

1

ЛОР, побудь моим личным LARTC[2].

Вообще всё перерыл, даже на serverfault спросил, бестолку.

Есть линуксовый роутер (4.14), интерфейсы wan0 и lan0, адреса 1.2.3.4 и 10.0.0.1 соответственно.

# ip -4 addr
11: lan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 34:ce:00:66:f0:56 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.1/24 brd 10.0.0.255 scope global lan0
       valid_lft forever preferred_lft forever
13: wan0@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc cake state UP group default qlen 1000
    link/ether 78:11:dc:01:32:70 brd ff:ff:ff:ff:ff:ff
    inet 1.2.3.4/24 brd 1.2.3.255 scope global wan0
       valid_lft forever preferred_lft forever

Внутри сети есть машина 10.0.0.2 с веб-сервером, который слушает на 10.0.0.2:443. Есть доменное имя domain.tld, которое ресолвится в 1.2.3.4. На роутере настроен DNAT (порт форвардинг) 1.2.3.4:443 в 10.0.0.2:443:

# iptables -t nat -S | egrep 'wan0|lan0|443'
-A PREROUTING -i wan0 -j zone_wan_prerouting
-A POSTROUTING -o lan0 -j zone_lan_postrouting
-A zone_lan_postrouting -s 10.0.0.0/24 -d 10.0.0.2/32 -p tcp -m tcp --dport 443 -j SNAT --to-source 10.0.0.1
-A zone_lan_prerouting -s 10.0.0.0/24 -d 1.2.3.4/32 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.0.0.2:443
-A zone_wan_prerouting -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.0.0.2:443

Проблема: если с роутера сделать curl https://domain.tld, то DNAT его не поймает.

Попробовал написать правило в OUTPUT, но это не сработало:

iptables -t nat -A OUTPUT -p tcp -d 1.2.3.4 --dport 443 -j DNAT --to-destination 10.0.0.2:443

Судя по tcpdump, DNAT срабатывает, но пакет (с подменённым адресом назначения) продолжает уходить с внешнего интерфейса.

Куда копать?

P. S.: без использования split DNS и прочих хаков (настоящий сетап гораздо более сложный, вкорячивать туда ещё и split DNS я хочу в последнюю очередь)

★★★★★

Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от intelfx

Простите не дописал. Продолжение:
Возможно вы путаете с вариантами FORWARD, но INPUT и OUTPUT отдельная тема. Скажем так «чуть порезанная». Много «копей было сломано» в обсуждении именно этих цепочек. Но считается такое поведение «удобное» хоть и немного ломает логику. Иначе подумайте сами, куда «присунуть» ту же таблицу nat. Не логично конечно выглядит, но вот так и оставили, зато всем понятно. Как-то так.

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

Вот тут я вас не понял. Похоже вы путаете 1. правила iptables, 2. таблицы роутинга, 3. правила роутинга. В принятии решения при открытии сокета участвуют только пункты 2 и 3(косвенно). А пункт 1 это уже про передачу данных и изменения адресов.

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

В принятии решения при открытии сокета участвуют только пункты 2 и 3(косвенно)

Казалось бы, каждый пакет роутится отдельно? Как роутинг связан с открытием сокета?

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

Как роутинг связан с открытием сокета?

Никак. Но сокет изначально открывается на основании ваших таблиц. Как сильно выше писал если вы на 1.2.3.4 с 1.2.3.4 пойдете, то будет выбран src адрес 1.2.3.4 а не 4.3.2.1. Конечно вы можете забиндить или конкретный адрес или конкретный интерфейс, но это уже относиться к особенностям клиентского ПО.
PS На всякий случай напоминаю для подобных случаев, что интерфейс != IP адрес на нем. Это «два разных человека».

anc ★★★★★
()
Последнее исправление: anc (всего исправлений: 1)
Ответ на: комментарий от intelfx

Сделай TRACE для пакетов c nat в разных вариантах и получишь реальную документацию. Там есть несколько не очевидных вещей.

Учти, что часть действий nat происходит еще и в postrounting, который уже не наблюдается даже через trace :) В некоторых случаях может быть rerouting после nat/postrouting.

PS хоть wiki пиши! Глядишь хоть сам запомню где чего может смениться :)

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.