LINUX.ORG.RU
ФорумAdmin

Как сохранять ip клиента, используя DNAT и SNAT в iptables?

 , , , ,


0

1

Добрый день.

У меня есть два хоста и клиент.

Я хочу сделать так, чтобы при подключении на хост1, он (хост1) перенаправлял соединение на хост2. Ответ от хост2 должен отправляться на хост1, а хост1 уже отправлял ответ клиенту.

Схематично это выглядит так:
клиент->хост1->хост2
хост2->хост1->клиент

У меня получилось этого добиться такими правилами на хост1:

iptables -t nat -A PREROUTING -p tcp --dport 3000 -j DNAT --to-destination хост2:3000
iptables -t nat -A POSTROUTING -p tcp -d хост2 --dport 3000 -j SNAT --to-source хост1

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

Совет поднять прокси сервер вместо использования DNAT мне не подходит, потому что я все это делаю для защиты от DDOS уровня L4-L7. Я хочу все сомнительные соединения напрявлять на хост2, который мне не так важен. Но если использовать прокси сервер, то это не имеет смысла, т.к. пакеты попадут на сокет прокси на хост1. А я как раз хочу избежать попадание пакетов на сокет на хост1.

Буду рад любым ответам. Я понимаю, что я могу вообще сейчас делать фигню, по этому прошу не оскорблять, а указать на ошибку.


Реальная возможность зависит от конкретной ситуации, а вообще можно вместо SNAT настроить роутинг на хост2 - шлюз хост1 для маршрута на client.

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

Что за роутинг? Как это сделать?

по этому прошу не оскорблять

Придётся молчать! )

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

>Что за роутинг? Как это сделать?

Вдоль сделай.

anonymous ()

SNAT адрес источника заменяет в пакете, не? MASQ нужен чтобы клиент видел ip хост1 здесь клиент->хост1

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

Да, я делал вместо SNAT такое правило на хост1:

iptables -t nat -A POSTROUTING -j MASQUERADE

С ним тоже работало подключение, но проблема оставалась. На хост2 вместо айпи клиента виден айпи хост1.

lokha ()
Ответ на: комментарий от lokha
iptables -t nat -A POSTROUTING -s хост2 -j MASQUERADE
iptables -t nat -A POSTROUTING -o адаптерпроводсклиентом -j MASQUERADE
why ()
Последнее исправление: why (всего исправлений: 1)

Что за протокол выше? Если http, то можно реальный адрес в дополнительный хэдэр класть.

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

на хост2:

ip ro add <клиент> via <хост1>

на хост1 в iptables только правило с dnat

В таком виде это возможно, если хост1 и хост2 в одной сети, ну или чуть сложнее, если промежуточные узлы есть, но под вашим контролем. Если хосты где-то в Инете у разных провайдеров - то гораздо сложнее.

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

на клиенте я не могу ничего менять, это в буквальном смысле клиент (домашний пк) и он может быть случайный

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

В таком виде это возможно, если хост1 и хост2 в одной сети, ну или чуть сложнее, если промежуточные узлы есть, но под вашим контролем. Если хосты где-то в Инете у разных провайдеров - то гораздо сложнее.

Не в одной сети, один хост ovh, другой hetzner. Ну в общем общей локальной сети нет.

А какой вариант сложнее?

lokha ()

Как сохранять ip клиента

используя SNAT

/0

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

ip ro add <клиент> via <хост1>

я не знаю айпи клиента, я знаю айпи только хост1 и хост2

lokha ()

По этой части

Когда соединение устанавливается, приложение на хост2 думает, что айпи клиента - это хост1. А я хочу, чтобы айпи клиента сохранялось на хост2.

Поднять тунель между хост1 и хост2.
На хост1 только DNAT
На хост2 pbr что бы пакеты из тунельного соединения улетали обратно.

А вот теперь полная глупость от вас

Я хочу сделать так, чтобы при подключении на хост1, он (хост1) перенаправлял соединение на хост2.

вы пишите хочу что бы прилетало на хост1

потому что я все это делаю для защиты от DDOS уровня L4-L7. Я хочу все сомнительные соединения напрявлять на хост2, который мне не так важен. Но если использовать прокси сервер, то это не имеет смысла, т.к. пакеты попадут на сокет прокси на хост1. А я как раз хочу избежать попадание пакетов на сокет на хост1.

А тут что бы не прилетало.
Вы уж определитесь, «либо трусы либо крестик».

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

Всё решается маршрутизацией. Если у вас серверы не в одном L2-сегменте, то маршрутизацию в общем виде вы не настроите. Нужно установить VPN или простой IP-туннель (ipip/gre), и внутри него уже маршрутизировать пакеты так, как вам необходимо.

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

Всё решается маршрутизацией. Если у вас серверы не в одном L2-сегменте, то маршрутизацию в общем виде вы не настроите. Нужно установить VPN или простой IP-туннель (ipip/gre), и внутри него уже маршрутизировать пакеты так, как вам необходимо.

Увы, суть моей задачи в том, чтобы не устанавливать соединение вообще. Любой tcp-tunnel это соединение linux, это допуск пакетов на сокет. Это открывает двери к L4 атакам.

Я же хотел сразу пересылать пакеты на другой хост2, чтобы задодусился хост2, а не хост1. А на хост1 будут приниматься только соединения с белых IP и соответственно будут изолированы от плохих пакетов.

Я понимаю, как это звучит. Но исходя из того, что я изучил в linux, мне кажется это рабочей схемой.

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

По схеме изложенной в топике вам ответили.

Я же хотел сразу пересылать пакеты на другой хост2, чтобы задодусился хост2, а не хост1. А на хост1 будут приниматься только соединения с белых IP и соответственно будут изолированы от плохих пакетов.

Смотрите согласно вашей схемы пакет все равно прилетает на хост1, как не крути, хост1 отправляет его на хост2. Хост2 отвечает отправив пакет на хост1 и хост1 отвечает клиенту. Я не понимаю от какого именно DDOS вы хотите спастись.

anc ★★★★★ ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей