LINUX.ORG.RU
ФорумJob

Openvpn проброс 80 порта от клиента на сервер (шлюз)

 , ,


0

1

Есть сервер 1 с IP 1.3.4.5 он же шлюз OpenVPN Есть сервер 2 с IP 2.3.4.5 он же клиент Openvpn сервера №1

Необходимо с сервера #2 пробросить внешний (тот что смотрит в мир айпи) 80 порт на сервер №1 через туннель openvpn, так чтобы сохранялся источник IP-адреса от кого исходит запрос.

PUBLIC_IP=212.24.17.13 - Публичный IPv4

/sbin/iptables -A FORWARD -p tcp -i eth0 -d 10.8.0.1 –dport 80 -j ACCEPT /sbin/iptables -t nat -A PREROUTING -p tcp -d $PUBLIC_IP –dport 80 -j DNAT –to-destination 10.8.0.1:80 /sbin/iptables -t nat -A POSTROUTING -o tun+ -j MASQUERADE

Нашел такое, оно работает, но из-за маскарада оно теряет IP с которого идет подключение на 80й порт и подключения исходят от 10.8.0.2, а должно выдавать белый IP

Жду отклика на задачу, готов оплатить.


Ответ на: комментарий от Ano921

Увидел в другой ветке ответ что это не веб и nginx не подходит. Так все-же нужно более подробное тз, возможно у этой задачи есть более простое решение чем вы пытаетесь сделать. Опишите для чего вам там реальный ип и чего хотите получить.

vpnvpnvpn
()

А куда вы ждёте отклик? Лички тут нет, контакт укажите.

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

почему не подходит, в чем заключается проблема? опишите задачу (именно задачу а не вариат её решения который не выходит реализовать) более подробно, возможно кто-то предложит решение.

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

Необходимо пробросить порт 80 и 443 с сервера №1 на сервер №2, сохраняя при этом адрес источника (реальный IP того кто подключается).

IPIP/GRE не подходит в данном случае из-за технических ограничений в ДЦ.

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

Без маскарада что приходит?

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

Только 1 команда и всё? Проверю завтра

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

неплохо было бы понимать что там на backend’е предполагается? хотелось бы так же знать почему неподходит вариант с nginx’ом и адресом в header’ах?

вообще это задача решается с использованием прокси, если вариант с nginx’ом не подходит можно использовать например haproxy и proxy_protocol там информация об source адресах передается после установки tcp соединения и на принимающем стороне должна быть поддержка proxy_protocol’а, nginx его так же поддерживает..

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

Представьте задачу, что у вас 1000 доменов на которых выпущен SSL.

Как вы представляете себе таскать каждый раз при смене proxy IP эти все 1000 доменов? У меня такой возможности нет, тем более что задача как раз в том чтобы быстро и легко без труда развернуть новый ipv4 у домена и я не тратил кучу времени на это дело. При этом же, я могу менять хоть каждый день (этого еще не было конечно, но всё же) и мне что каждый раз покупать сервер под эти мощности? Потому мне задача нужна которая выполняет всё вышесказанное с передачей ip источника без каких-то там L7 приложений

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

вообще имелось ввиду tcp проксирование порта… т.е. идентично пробросу…

ну и автоматизацию для переконфигурации никто не отменял

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

При пробросе порта на NGINX все соединения на себя будет брать NGINX и инициализации SSL не будет в данном случае.

Понимаете что такое машина с 1000 доменами и какая она должна быть по хар-кам? Мне что каждый раз покупать новый сервер под это дело?

Я же описал правильно и грамотно свой вопрос (задачу), не нужно ничего другого придумывать.

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

Если вам нужен именно OpenVPN, то настройте его в режиме L2 (TAP), либо настройте в режиме одного клиента (iroute 0.0.0.0 у единственного клиента).

Многопользовательские L3-туннели (в т.ч. OpenVPN TUN, WireGuard) не позволяют указывать IP-адрес, через который происходит маршрутизация (ip route … via 10.2.0.100) — эта опция требует L2-связности. Многопользовательские L3-серверы требуют конфигурации внутренней маршрутизации (опция iroute в OpenVPN, AllowedIPs в WireGuard), поэтому новичку для связи серверов/маршрутизаторов лучше использовать простые Peer-to-peer L3-туннели без собственных подсистем маршрутизации и проверок адреса источника: IPIP, GRE, L2TP, либо L2-туннели (но это может добавить проблем с маршрутизацией и безопасностью).

IPIP/GRE не подходит в данном случае из-за технических ограничений в ДЦ.

Ограничений по протоколам? Ну тогда заверните IPIP или GRE в UDP через fou, например:

https://www.man7.org/linux/man-pages/man8/ip-gue.8.html
https://gist.github.com/ciis0/b7c7b179978fa8b5b907b9abedeb6092

Либо настройте L2TPv3 статично (через ip l2tp, а не через xl2tpd сотоварищи).

The ip l2tp commands are used to establish static, or so-called unmanaged L2TPv3 ethernet tunnels. L2TPv3 is suitable for Layer-2 tunneling. L2TPv3 defines two packet encapsulation formats: UDP or IP.

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

А тут и не предложили ни одного решения, только проксирование, но оно ортогонально вопросу. Для общего случая вводных не достаточно. Если у http сервера монопольный ответ на входящие соединения - одно решение, если нет, то все немного сложнее.

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

А тут и не предложили ни одного решения, только проксирование, но оно ортогонально вопросу.

если вы видите еще какое либо решение, предлагайте…

но с прокси провереное рабочее решение, тс же хочет чтоб все решалось без использования какого-либо софта средствами ядра.

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

Прокси - это уровнем сильно повыше. На уровне tcp/ip предлагаю навскидку, должно работать:

# хороним входящее подключение от проброса
iptables -t filter -A INPUT -i vpn_iface0 -p tcp --dport 443 -m recent --name FROMVPN --set -j ACCEPT
# проверяем ответный пакет на наличие в схороненном месте и метим
iptables -t mangle -A OUTPUT -p tcp --sport 443 -m recent --name FROMVPN --rcheck -j MARK --set-mark 100
# пхаем меченые пакеты в тоннель
ip rule add fwmark 100 lookup 100
ip route add 0.0.0.0 via vpn_iface0 table 100

На машине с пробросом, естественно, кроме DNAT надо еще и SNAT включить, чтобы до клиентов пакеты долетали.

Можно через ipset придумать. Ну, идея понятна, надеюсь.

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

но с pbr и заворачиванием трафика в туннель тут ясно, а вот как здесь source адреса будут сохранятся и далее сервер за впн на них будет отвечать несовсем

хороним входящее подключение от проброса

iptables -t filter -A INPUT -i vpn_iface0 -p tcp –dport 443 -m recent –name FROMVPN –set -j ACCEPT

здесь видимо вместо vpn_iface0 внешний интерфейс сервера?

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

Короче, на фронте:

iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT....
iptables -t nat -A POSTROUTING -o eth0 -j SNAT....

а на бэке - то что выше. я бы еще –rcheck уточнил и –remove добавил, чтобы совсем без side эффектов было, универсально. ну и побенчить надо recent vs ipset что быстрее будет, то и использовать.

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

тогда получается что эти правила за впн подключением на втором сервере к которому идет проброс… т.е. туда нужно на первом сервере настроить еще и dnat,snat (к серверу за впн). правильно я понимаю вашу идею?

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

только snat надо на исходящий трафик wan. не надо тоннель натить, это все поломает.

Anoxemian ★★★★★
()

Сервер2 (default gateway указывает на интернет провайдера), принимает пакеты на порт 80 и перенаправляет их на Сервер1 (через openvpn туннель)

Сервер1 (default gateway указывает на !!! Сервер2 через openvpn туннель !!!) – автоматически возвращает клиенту из интернета пакеты через Сервер2.

Сервер2 роутит пакеты клиентам в интернет, делая MASQUERADE (SNAT)

Всё!

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

Мы на это плюём, для решения задачи. Ведь это сервер с 1000 доменов, всё остальное неважно!!!

Там где-то затерялся сарказм, но я не помню где

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

Я тут подумал, и решил - решение рабочее и годное, но решение - говно. Слишком много side-effects. Надо метить всю сессию с помощью connmark. Тогда волосы станут шелковистыми.

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

поднял на тестовом стенде из виртуалок, данное решение (не c connmark, а предложенное выше) - но увы с использованием recent/ipset не взлетело… что-то не заворачивается в туннель Однако если просто сделать iptables -t mangle -A OUTPUT -p tcp –sport 443 -j MARK –set-mark 100 и далее ip rule как описано выше то работает. с ipset таже ситуация. есть идеи почему может не работать?

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

Э. Ну ты просто пустил весь трафик в тоннель (это норм, просто не универсально). Кек, я другой вопрос решал)))

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

есть идеи почему может не работать?

не идеи, а точные знания: где-то не включен ip_forward, где-то не отключен rp_filter

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

а чем решение с проксированием плохо? да там все решается прокси софтом. ну и что? производительность, ну так этож универсальное решение используемое на всяких хайлоад проектах. Вон взять тот-же кубер там входной точкой является балансировщик тот же nginx, openresty или haproxy. почему-то никто не городит всякие костыльные решения на основе принципа делать все ниже прикладного уровня. Тут вот мне непонятно желание тс принципиально не использовать софт. Разве что он это на на крайне слабом железе/виртуалках хочет сделать. Но он это не комментирует. Создается впечатление что это исключительно принцип и не более.

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

Да ничем не плохо, просто находится вне заданного вопроса)

Anoxemian ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.