LINUX.ORG.RU
ФорумAdmin

Share PPTP vpn connection to lan clients

 , ,


0

1

Сервер:

  1. enp11s0 - физический интерфейс (inet 192.168.0.5)
  2. ppp12 - Поднятое VPN соединение (inet 192.168.1.200) Сервер не получает внешний IP от VPN-а (так и надо)

А вот клиенты, которые коннектятся к серверу через GW 192.168.0.5, должны получать внешний IP от VPN-а (ppp12)

Грубо говоря: Вообщем , как расшарить ppp12 соединение клиентам и дать доступ в интернет через VPN (в моем случае хочу PS4 пустить через VPN, ибо NAT3), при том чтобы сервер получал «стандартный» интернет, если можно так выразиться ?

PBR позволяет как угодно маршрутизировать пакеты. Так что вы можете всё, пришедшее из ppp12 отправлять клиенту. Но как вы будете настраивать клиента непонятно.

Вот эта фраза:

клиенты, которые коннектятся к серверу через GW 192.168.0.5, должны получать внешний IP от VPN-а

странная. Клиент не может получать IP, он получает пакеты. IP назначается при установлении VPN соединения. Клиент, не имея внешний IP, получив ip-пакет, адресованный на этот внешний IP, ничего с ним не сделает, просто дропнет.

Наверное, можно руками прописывать нужный IP-адрес на клиента после установления соединения, но это неудобно.

Не понятно, почему вас не устраивает получение VPN IP-адреса сервером и NAT на сервере для клиента из локальной сети.

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

У меня клиент пс4, там можно прописать только gw. И все.

Сервер должен пускать пс4 через впн. Но самому серверу ходить в инет через впн не нужно, ибо зачем…

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

Тогда мне это не понятно:

Сервер не получает внешний IP от VPN-а (так и надо)

Вам достаточно, чтобы default маршрут через VPN не появлялся в таблице маршрутизации main. Заносите маршрут через VPN в отдельную таблицу, по этой таблице делайте поиск для пакетов от вашей PS4. Ну и MASQUERADE правило в iptables для VPN интерфейса.

Если не понятно про что я пишу, погуглите про Policy-based Routing (PBR), про команду ″ip rule″.

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

Просто отличный ответ. Так на каждый вопррс можно отвечать.

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

Проясните пожалуйста: Нашел скрипт здесь

# Search route for traffic coming from 192.168.0.4/24 in table 'vpn' 
# (unicast: This rule type simple causes the kernel to refer to the 
# specified routing table in the search for a route.)
/sbin/ip rule add from 192.168.4.0/24 table vpn

В комменте пишут так :«192.168.0.4/24» а скрипте так : «192.168.4.0/24». Я не понимаю, это ошибка или так надо ?

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

Так все же опечатка или нет?

Опечатка. Но как я сказал, дело не в этом, там другие проблемы.

Чтобы знать куда двигаться…

Я вам выше привел ссылку на главу из lartc

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

192.168.0.4/24 — это опечатка. И скрипт действительно не очень, но можете попробовать его использовать.

Лично мне в скрипте не нравится, что он на каждый запуск делает ″ip rule add″. Правила (rule) маршрутизации не удаляются при падении интерфейса. На сервере перезапуск тунеля обычное дело, через какое-то время в выводе ″ip rule show″ будет куча правил.

Да и статья тоже не очень, ЕМНИП, чтобы можно было писать ″table vpn″, нужно поправить файл /etc/iproute2/rt_tables (соответствие номер — имя таблицы).

Вы сначала командами с консоли сделайте чтобы работало, потом уже скрипт пишите/исщите. Да и pppd другие, чем openvpn, аргументы передаёт скрипту, https://wiki.archlinux.org/title/PPTP_Client (/etc/ppp/ip-up.d).

Ну, и вобще не обязательно вызывать на каждое поднятие тунеля ″ip rule″. ИМХО, лучше все rule прописать где-то отдельно, чтобы он один раз при запуске системы создавались, а скрипт при поднятии тунеля просто прописывал default маршрут в нужную таблицу.

Ещё можно в эту таблицу прописать:

ip route add default unreachable table vpn metric 100

чтобы клиент без тунеля не выходит в инет.

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

ИМХО, лучше все rule прописать где-то отдельно, чтобы он один раз при запуске системы создавались

ИМХО не лучший вариант. Через н-лет захочешь перенести/исправить и уже забудешь где какой кусок. Но это как говориться на вкус и цвет.

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

Лично мне в скрипте не нравится, что он на каждый запуск делает ″ip rule add″. Правила (rule) маршрутизации не удаляются при падении интерфейса. На сервере перезапуск тунеля обычное дело, через какое-то время в выводе ″ip rule show″ будет куча правил.

Ну для таких фишек есть простое решение - присваивать правилу фиксированный приорити.

/sbin/ip rule add from 192.168.4.0/24 table vpn priority 31200

Если правил несколько, то для каждого выбрать свой номерок. И добавлять рулесы лучше с поднятием интерфейса, что бы ip адреса не висли беспризорными.

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

Ну для таких фишек есть простое решение - присваивать правилу фиксированный приорити.

+1 Так же делаю.

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

Обсуждать, так обсуждать, хоть и не по теме. :) Там ещё удаляется route для варианта «redirect-gateway def1» но никто же не сказал что будет обязательно def1 :)

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

И добавлять рулесы лучше с поднятием интерфейса

Чем это лучше? По вашему, если интерфейса нет, то тогда и rule нет и пакет от клиента пойдёт по main таблице.

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

Через н-лет захочешь перенести/исправить и уже забудешь где какой кусок.

Вот именно, и это вкупе с фиксированным приоритетом правил может дать внезапный эффект. Забудешь, что где-то далеко лежит скрипт, котрый при определённых условиях поднимит ещё какой интерфейс/тунель, и попытается создать правило с таким же приоритетом, что ты только что назначил другому правилу.

mky ★★★★★
()

Сделал так:

sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
sudo iptables-save > /etc/iptables/rules.v4
sudo ip6tables-save > /etc/iptables/rules.v6

Добавил скрипт /etc/network/if-up.d/00-iptables:

#!/bin/sh
if ! [ "$IFACE" = enp11s0 ]; then
	exit 0
fi

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables-restore < /etc/iptables/rules.v4
ip6tables-restore < /etc/iptables/rules.v6

Добавил скрипт /etc/ppp/ip-up.d/add_route:

#!/bin/sh

if [ "$CALL_FILE" = "home-vpn" ]; then
	ip route add default dev ppp12 scope link table 120	
	if [ -z "`ip rule list table 120`" ]; then
		ip rule add from 192.168.0.148 table 120
	fi	
	exit 0
fi
FreakMurderer
() автор топика
Последнее исправление: FreakMurderer (всего исправлений: 1)
Ответ на: комментарий от mky

Чем это лучше? По вашему, если интерфейса нет, то тогда и rule нет и пакет от клиента пойдёт по main таблице.

Если бы было так, не было бы проблем. Но реально, интерфейса нет, а правило, отправляющее ip «вникуда» остается, появляются зависшие адреса. Актуально, когда делается соурс-роутинг для реальных ip.

Вот именно, и это вкупе с фиксированным приоритетом правил может дать внезапный эффект. Забудешь, что где-то далеко лежит скрипт, котрый при определённых условиях поднимит ещё какой интерфейс/тунель, и попытается создать правило с таким же приоритетом, что ты только что назначил другому правилу.

Список всех правил с приоритетами видны по команде ip rule lst. Так-что ошибиться сложно, забыть невозможно. :) Ну и при аккуратном администрировании можно завести хорошую привычку вести спек на сервер в виде файла, лежащем в одном определенном месте.

Потом, если поднимать правила с поднятием и опусканием интерфейса, то и команды запускаются через конфигурацию или hook’и pre-up и post-down.

А так, никто ж не заставлет. :)

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

Забудешь, что где-то далеко лежит скрипт, котрый при определённых условиях поднимит ещё какой интерфейс/тунель, и попытается создать правило с таким же приоритетом, что ты только что назначил другому правилу.

Или «забудешь» при наборе команды rm -rf ./ точку поставить. Или «забудешь»... ну вы поняли.

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

Команда ip rule возвращает 255, если правил для таблицы не существует.

ip rule list table 120 >/dev/null 2>&1 || ip rule add from 192.168.0.148 table 120

Неплохо так же таблички поименовать.

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

Вместо 120 написать стринг?

Файл /etc/iproute2/rt_tables.d/vpn.conf

120 MyVPN

И использовать это название:

ip rule list table MyVPN >/dev/null 2>&1 || ip rule add from 192.168.0.148 table MyVPN

Имя файлa и название таблицы выбирается по вкусу.

Если каталог rt_tables.d/ не поддерживается, то можно добавить сразу в файл /etc/iproute2/rt_tables

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

Можно ли сделать что-то вроде этого? ip rule add from 192.168.0.100-148 table 120 И если можно, то как?)

Нет, нельзя. Там можно указать либо ip, либо ip/len.

Можно сделать подргуому, но это, типа, жестяк:

ip rule add from 192.168.0.100 table 120
ip rule add from 192.168.0.101 table 120
ip rule add from 192.168.0.102 table 120
....
ip rule add from 192.168.0.147 table 120
ip rule add from 192.168.0.148 table 120

Можно агрегировать куски в префиксы, какие получатся.

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

Подскажите плиз как сделать split tunneling, если используется openvpn client.

Такое ip route add default dev <tun> scope link table 120 не проходит

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

Подскажите плиз как сделать split tunneling, если используется openvpn client.

О! Какой-то термин. Никогда его не видел. Пошел смотреть, что же он означает… Уфффф… Посмотрел. Слава богу - он означает ровно ничего. :) Максимум «концепт» :) В мире юникс-лайк такого нету. В мире юникс-лайк это обычный роутинг. :)

Такое ip route add default dev scope link table 120 не проходит

Честно говоря, я не знаю, что именно у вас не проходит. Но то, что вам нужно (если я правильно понял), называется примерно, как «Configure two Routers on one Device». При этом пофиг, как организованы у вас внешние каналы.

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

Так мне нужно абсолютно то же самое, что я и делал в этой теме ранее. Share PPTP vpn connection to lan clients (комментарий)

Вы же сами видели: Теперь нужно это сделать не для PPP, а для openVpn.

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

Вот этот скрипт на Дебиане работает, а на DD-WRT ни в какую не хочет.

Возможно ли что, в DD-WRT, в ядре нет поддержки ?:

  • IP: advanced router (CONFIG_IP_ADVANCED_ROUTER)
  • IP: policy routing (CONFIG_IP_MULTIPLE_TABLES)
FreakMurderer
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.