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

PPTP не SNAT'ится

 , , ,


0

1

Или, если быть точным, то GRE.
В общем, есть сервер с Xen'ом, есть domU с PPTP-сервером. dom0 занимается вопросами роутинга трафика. VPN-сервер в своей подсети; плюс сервер обслуживает локальную сеть.

vpn-сервер включен в br2, IP 192.168.221.251
Локальная сеть - через br0, адрес хоста клиента в данном случае 192.168.1.133.

Суть проблемы: с внешнего мира все прекрасно подключается и работает. С локальной сети при обращении на внешний адрес сессия не устанавливается. 1723 доступен, nmap'ится и так далее. GRE уходит на шлюз, SNAT'ится от внешнего адреса, DNAT'ится на VPN сервер, тот успешно отвечает (на br2 есть ответ), а вот дальше, такое ощущение, что шлюз не знает, что с этими пакетами делать. На br0 есть только клиентские запросы.

iptables

"${ipt}" -A FORWARD -p tcp -d 192.168.221.251 -j ACCEPT #
"${ipt}" -A FORWARD -p gre -j ACCEPT # vpn

"${ipt}" -A PREROUTING  -t nat -p tcp -d $exip --dport 1723   -j DNAT --to 192.168.221.251:1723 # VPN
"${ipt}" -A PREROUTING  -t nat -p gre ! -s 192.168.221.251 -d $exip                -j DNAT --to 192.168.221.251 # VPN
"${ipt}" -A POSTROUTING -t nat -p tcp -s $homenet/24 -d 192.168.221.251 --dport 1723 -j SNAT --to-source $exip
"${ipt}" -A POSTROUTING -t nat -p gre -s $homenet/24 -d 192.168.221.251              -j SNAT --to-source $exip


lsmod
lsmod | grep -E 'gre|pptp'                                                                                                         
ip_gre                 24576  0
gre                    16384  1 ip_gre
nf_nat_pptp            16384  0
nf_nat_proto_gre       16384  1 nf_nat_pptp
nf_conntrack_pptp      16384  1 nf_nat_pptp
nf_conntrack_proto_gre    16384  1 nf_conntrack_pptp
*** ну и + зависимости ***

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

pptpd log: https://paste.ubuntu.com/p/cGzWmzc5Cr/

tcpdump:
br0: https://paste.ubuntu.com/p/sjwyW9PrZD/
br2: https://paste.ubuntu.com/p/8HH3GfZGqs/

Если убрать SNAT для локальной сети и подключаться на адрес VPN-сервера - то, естественно, тоже все работает.

Вроде на старом сервере (с подобной конфигурацией, но Debian 7 и на ядре 3.9) оно работало (по-крайней мере, я не помню, чтобы оно не работало). Правда, есть подозрение, что тогда из локальной сети я ходил на локальный адрес - сейчас уже не проверю.

Смахивает немного на вот это. Но поведение поменялось только с 3.5, т.е., со старым вариантом я не должен был столкнуться. Кроме того, попытка использовать правила с -j CT --helper pptp или установка net.netfilter.nf_conntrack_helper в 1 вообще блокирует трафик с локальной сети на 1723-й порт VPN-сервера (да и нужно ли оно, если на 1723 все ходит нормально и так?)

Насчет предложений сменить PPTP на что-то более вменяемое - возможно, в будущем :). Пока устраивает и так, но хотелось бы разобраться в проблеме и сделать максимально универсальный вариант (с одинаковым адресом сервера как изнутри, так и снаружи).

★★★★★

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

uname -a
sysctl -a | grep conntrack_helper

TL;DR: для старых(<4.9) ядер - проверить что включен conntrack_helper. Для новых ядер - убедиться что он отключен и добавить правило в таблицу raw:

iptables -t raw -A PREROUTING -p tcp --dport 1723 -j CT --helper pptp

Для профилактики - conntrack -F

Если не помогает - присылай дампы трафика. У меня на генте УМВР, но только в такой конфигурации как я описал выше(хотя ядер <4.9 у меня уже почти не осталось)

Update: не сразу увидел, что у тебя там DNAT. Такой конфигурации у меня нигде нет, да и дампы ты приложил - а я их не заметил, так что можешь смело проигнорировать данный пост.

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

Вот разве что conntrack -F не делал при экспериментах

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

Может. С другой стороны - работает оно сейчас да и работает, чего его трогать? Для того, чтобы ходить по ригам через ssh да статистику смотреть - с головой. А чтобы что-то другое использовать - его надо хотя бы изучить, потом раскатать по всем машинам. Сделаю, но позже.

Ну и в целом, если абстрагироваться от PPTP - GRE не только там используется. В итоге вопрос можно свести к «как правильно snat'ить gre?»

YAR ★★★★★
() автор топика
2 марта 2019 г.

Я все же добил проблему :)
helper все же помог. Просто нужно было правила SNAT'а убирать. Итоговый вариант выглядит так:

##### PPTP VPN server related #####
"${ipt}" -A PREROUTING  -t raw -p tcp -m tcp --dport 1723 -j CT --helper pptp
"${ipt}" -A PREROUTING  -t nat -p tcp -d $exip --dport 1723   -j DNAT --to 192.168.221.251:1723 # VPN
"${ipt}" -A PREROUTING  -t nat -p gre ! -s 192.168.221.251 -d $exip                -j DNAT --to 192.168.221.251 # VPN


+ net.netfilter.nf_conntrack_helper=1 в sysctl.conf. Ну и раз уж он включается, то и для FTP придется правила поменять под новый стиль.

А на старой системе действительно локальный DNS отдавал местный адрес и SNAT не использовался.

Update: правило лишнее, уже сам путаться начал. Т.е., можно или правило, или helper в sysctl. Главное - использовать или helper в том или ином виде, или правила с SNAT'ом (если в таком виде оно работает), но не вместе.

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