LINUX.ORG.RU

Пробросить порты с -j MASQUERADE с сохранением реального ip адреса

 , ,


0

1

Добрый день! Помогите пожалуйста организовать обратный/прозрачный прокси-сервер.

Необходимо пробросить определённый порт (999) с одного сервера (1.1.1.1) на другой сервер (2.2.2.2) и при этом сохранить реальный ип адрес клиента. Я почти уверен, что с помощью правил в iptables такое реализовать невозможно, но все же использую правила:

iptables -t nat -A PREROUTING -i venet0 -p tcp --dport 999 -j DNAT --to 2.2.2.2:999

iptables -t nat -A POSTROUTING -j MASQUERADE

Эти сервера не находятся в локальной сети и оба адреса 1.1.1.1 и 2.2.2.2 доступны из интернета. т.е. запросы приходящие, например от клиента 188.1.1.1, на сервер 1.1.1.1:999 успешно перенаправляются на 2.2.2.2:999, и все было хорошо до тех пор пока не потребовалось определить реальный ip адрес клиента ибо запросы на 2.2.2.2 после MASQUERADE приходят с адреса 1.1.1.1 вместо 188.1.1.1.

Пробовал изучать вопрос с TPROXY в mangle, но к сожалению не смог разобраться. Помогите пожалуйста найти решение для организации reverse прокси, где можно будет передать реальный адрес клиента.



Последнее исправление: Aliev_S (всего исправлений: 2)

Проблема не в iptables, а в маршруте на 2.2.2.2. В iptables нужно убрать MASQUERADE и всё. Но 2.2.2.2 каким-то образом должен понимать, что вот этот пакет пришёл через 1.1.1.1 и отвечать нужно через 1.1.1.1, и для этого нужен тунель между 1.1.1.1 и 2.2.2.2.

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

С помощью SNAT перенаправлять на 1.1.1.1 тоже пробовал, но так трафик вовсе не доходит. Я уже просто не могу сообразить. Вы имеете ввиду ssh туннель?

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

haproxy тоже через заголовки передает адреса? http не подходит, на 2.2.2.2 работает служба, наверное это что-то вроде RDP-трафика.

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

В http-случае через заголовки, да, но можно перекидывать на уровне tcp - https://habr.com/ru/post/247297/ . Но не знаю на сколько вам это подойдет.

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

Спасибо за ссылку, а это разве не тоже самое, что и с iptables? Вот каким образом преобразовать proxy_protocol в реальный ip, у меня же нет на 2.2.2.2 nginx с listen proxy_protocol и set_real_ip_from & real_ip_header. Это возможно сделать?

Aliev_S
() автор топика

Да, наверное, без туннеля не обойтись, чтобы сервера по L2 были доступны друг другу.

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

SNAT точно как и MASQUERADE замещаяет в пакет исходный src-ip адрес, который вы хотите передать на 2.2.2.2.

Тунель любой, хоть GRE или IPIP, или OpenVPN, и на 2.2.2.2 настроить, что ответы, на приходящее из тунеля соединения, отправлять в тунель. Но если на 2.2.2.2 винда, то ой.

mky ★★★★★
()

Спасибо всем за ответы! Решение было найдено haproxy с send-proxy и поддержка proxy protocol на 2.2.2.2, трафик перенаправляется, а реальные адреса теперь видно.

Aliev_S
() автор топика

iptables -t nat -A PREROUTING -i venet0 -p tcp --dport 999 -j DNAT --to 2.2.2.2:999

По уму, одной только этой строчки было бы достаточно.

Она подменит только target у пакета, оставив source неизменным

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