FreeBSD mpd5 (сервер) и mpd5 клиент (роутер)

Простые/общие вопросы по UNIX системам. Спросите здесь, если вы новичок

Модераторы: vadim64, terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
ShadowAGT
рядовой
Сообщения: 13
Зарегистрирован: 2016-08-17 17:49:49

FreeBSD mpd5 (сервер) и mpd5 клиент (роутер)

Непрочитанное сообщение ShadowAGT » 2017-03-10 16:37:47

Приветствую!

Ребят, подскажите пожалуйста. Не могу сообразить, запутался уже... Поднял в инете свой VPN на MPD5 (pptp), там все работает норм. При установлении связи с сервером даются IP

Сервак: 192.168.200.254
Клиент: 192.168.200.201
Сервак (внешний IP): 9.9.9.9

В таблице 10 прописаны внешние IP клиентов, которым разрешается подлазить к порту 1723 соответственно.
Кусок ipfw c сервера:

Код: Выделить всё

nat 1 config if bge0 log  same_ports reset
add 1002 allow all from 192.168.200.0/24 to 192.168.200.0/24
add 1002 allow tcp from table(10) to me dst-port 1723 setup keep-state
add 1002 allow gre from any to me
add 1003 nat 1 ip4 from 192.168.200.0/24 to not 192.168.200.0/24 via bge0
add 1003 nat 1 ip4 from not 192.168.200.0/24 to 9.9.9.9 via bge0
При этом, с виндового клиента коннекчусь (через домашний шлюз), все выдается, все норм. Гнать через этот VPN весь трафик мне не нужно. Нужны только отдельные IP на которые будем ходить. Напрмер 1.2.3.4. Делаю на виндовой машине ROUTE и поехали. Все ок, полет нормальный.

НО. Мне нужно чтоб все машины домашние (сетка 172.16.0.0/24), ходящие через домашний шлюз (172.16.0.254), ходили через этот VPN. Поднял на домашнем шлюзе mpd5 клиент. Подключаюсь домашним шлюзом, делаю

route add 1.2.3.4 192.168.200.254

И шлюз как нужно идет по маршруту через VPN на 1.2.3.4. А вот тут я что-то подзастрял. Домашние машины, не идут на 1.2.3.4 вообще никак после этого.

Интерфейс смотрящий в домашнюю сеть msk1 (172.16.0.254), смотрящий в инет rl1 (10.1.2.3.4 - сеть провайдера).

Кусок IPFW домашнего шлюза

Код: Выделить всё

add 11000 allow all from any to any via ng0
nat 1 config if rl1 reset same_ports
add 15000 nat 1 all from any to not 1.2.3.4 via rl1
nat 2 config if ng0 reset same_ports
add 15100 nat 2 all from any to 1.2.3.4 via ng0
Домашние машины соответственно имеют IP 172.16.0.1 и шлюз прописан 172.16.0.254
Где я туплю? Подскажите пожалуйста. Совсем запутался...:-(

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

snorlov
подполковник
Сообщения: 3832
Зарегистрирован: 2008-09-04 11:51:25
Откуда: Санкт-Петербург

FreeBSD mpd5 (сервер) и mpd5 клиент (роутер)

Непрочитанное сообщение snorlov » 2017-03-10 17:14:39

А вы уверены, что надо гнать через nat...

ShadowAGT
рядовой
Сообщения: 13
Зарегистрирован: 2016-08-17 17:49:49

FreeBSD mpd5 (сервер) и mpd5 клиент (роутер)

Непрочитанное сообщение ShadowAGT » 2017-03-10 17:32:50

Не уверен... Потому и прошу помощи. Я сначала и не собирался, но ведь и без него только лишь с одним

Код: Выделить всё

route add 1.2.3.4 192.168.200.254
так же с машин-клиентов домашней сетки, хост 1.2.3.4 не пингуется/не трассируется... Потому и полез уже в nat на домашнем шлюзе...

ShadowAGT
рядовой
Сообщения: 13
Зарегистрирован: 2016-08-17 17:49:49

FreeBSD mpd5 (сервер) и mpd5 клиент (роутер)

Непрочитанное сообщение ShadowAGT » 2017-03-13 15:16:32

Разобрался.... Пишу данный опус в том числе как напоминание для себя (вдруг еще когда пригодится), а своих записей не найду...

В целом перешел на OpenVPN, но это не связано с роутингом и NAT, это было связано с тем, что мой провайдер, GRE трафик пускает в инет с другого IP, не того которым мы (юзеры провайдера) инет серфим или файлы качаем. Долго одуплялся, почему при ограничении фаерволом, разрешенных к соединению извне IP адресов, на сервере в инете, у меня не поднимался ng0 интерфейс на mpd5... Потом увидел и мне это не понравилось, решил перейти на OpenVPN, соответственно интерфейс взял tap и протокол udp.

Перво наперво, из конфига сервера VPN, я убрал к едрене фене PUSH команду меняющую DEFAULTROUTE на клиентском MPD. Мне это совершенно не нужно, т.к. в основном по тырнету я хожу и качаю через основного провайдера. VPN делался исключительно для того, чтоб я через свой небольшой сервер (и только через него), мог работать с другими своими серваками в тырнетах...

Вобщем сделал двумя способами. Оба работают.

Исходные данные.

Код: Выделить всё

OpenVPN сервер где-то там в тырнете: 9.9.9.9
Через VPN нужно ходить на серверы (в тырнете): 1.2.3.4 и 4.3.2.1
OpenVPN сервер при установленни связи себе берет IP: 192.168.200.1
OpenVPN клиент (на домашней машине роутере), получает IP: 192.168.200.2 - 192.168.200.254
Все компы в домашней локальной сети, имеют адреса: 172.16.0.0/24
Интерфейс на домашней машине роутере, смотрящий в домашнюю локалку у меня rl0: 172.16.0.254
Комп в домашней локалке с которого проводились тесты: 172.16.0.200
В обоих случаях, на сервере действует одна и та же база IPFW. Отличие добавится только в способе №2.

IPFW на сервере (пока коряво, но работает и доходчиво :-)...

Код: Выделить всё

# Это для обоих случаев общее
nat 1 config if bge0 log  same_ports reset
add 1003 nat 1 all from 192.168.200.0/24 to not 192.168.200.0/24 via bge0
add 1003 nat 1 all from not 192.168.200.0/24 to 9.9.9.9 via bge0
# А это только для 2го способа
add 1004 nat 1 all from 172.16.0.0/24 to not 172.16.0.0/24 via bge0
add 1004 nat 1 all from not 172.16.0.0/24 to 9.9.9.9 via bge0
Ну исходно, так же представим что нам нужно, чтоб машины в тырнете. 1.2.3.4 и например 4.3.2.1, ходились из всей домашней локалки 172.16.0.0/24 через VPN. Остальные по дефолтному маршруту через провайдера, без VPN.

Способ №1
Использовал setfib на домашнем роутере, для того чтоб заNAT-ить трафик на интерфейс rl1 по дефолту (ставил перед правилами NAT дефолтно работающего работающего по одному лишь линку к провайдеру, без tap0).


В этом способе я использовал табличку 10, для ведения списка машин, на которые будем ходить через VPN. Соотвественно.

Код: Выделить всё

table 10 add 1.2.3.4
table 10 add 4.3.2.1
IPFW для домашнего роутера.

Код: Выделить всё

# Используем FIB 0 для всех по-умолчанию
add 11000 setfib 0 ip from 172.16.0.0/24 to any in
# Используем FIB 1 для тех адресов назначения, которые мы хотим чтоб посещались через VPN
add 11000 setfib 1 ip from 172.16.0.0/24 to table(10)
# Это NAT для того, что у нас должно пойти через VPN
nat 2 config if 172.16.0.0/24 same_ports
add 11001 nat 2 ip from 172.16.0.0/24 to any out via tap0
add 11002 143516 nat 2 ip from any to any in via tap0
# Это NAT через канал провайдера без VPN
nat 1 config if 172.16.0.0/24 same_ports
add 12001 nat 1 ip from 172.16.0.0/24 to any out via rl1
add 12002 nat 1 ip from any to any in via rl1
# Это у меня было для обычного режима. Не убрал еще.
add 15000 nat 1 ip from any to not 192.168.200.0/24 via rl1
Не залезая в дебри, и не проводя кучу тестов, что могу отметить в таком способе.
Достоинства:
  1. достаточно гибкая вещь, с помощью лишь IPFW можно достаточно гибко подогнать нужный трафик под нужный FIB и соответственно отправить по нужному каналу. Ну например для yandex.ru гоним трафик через FIB0 (дефолтный), а для google.com гоним через FIB1 (VPN). Можно заставить ходить по VPN на отдельные порты, балансировать трафик с помощью разных там skipto (но это уже совсем другая история) и т.д.
  2. Сеть 172.16.0.0/24 для злодеев, если проникнут на сервер в тырнете, останется недоступной.
Несдостатки:
  1. Ну в целом, как таковых я их не увидел, за исключением той мелочи, что домашняя машина-шлюз, в этом случае, в правила nat не попадает (может и можно загнать, но я пока не врубился как), и для нее эти маршруты приходилось прописывать на ней (машине-шлюзе) роуты вручную. Типа так

    Код: Выделить всё

    route add 1.2.3.4 192.168.200.1
    route add 4.3.2.1 192.168.200.1
    
    Конечно же это можно было выдавать PUSH-ем с OpenVPN сервера, при установлении соединения, или написать up-скрипт для OpenVPN, который и rout-ы на домашнюю машину шлюз забил бы, и файрвол дернул бы...
  2. Мелочь, но есть, при такой реализации я не видел с OpenVPN сервера, машины в домашней сети вообще, даже те, которые мне были нужны. Думаю это конечно же ерунда, и нужно было просто сделать route который я опишу во втором способе

Способ №2
Использование route и обыкновенного набора IPFW, который работал при одном лишь линке с провайдером. Тупо подкорректировал/изменил маршрутизацию. Спасибо snorlov, что навел на мысль.

Здесь в IPFW сервера (VPN) как раз необходимы те правила, которые были приведены вначале
# Это для обоих случаев общее
nat 1 config if bge0 log same_ports reset
add 1003 nat 1 all from 192.168.200.0/24 to not 192.168.200.0/24 via bge0
add 1003 nat 1 all from not 192.168.200.0/24 to 9.9.9.9 via bge0
# А это только для 2го способа
add 1004 nat 1 all from 172.16.0.0/24 to not 172.16.0.0/24 via bge0
add 1004 nat 1 all from not 172.16.0.0/24 to 9.9.9.9 via bge0
.

В этом спосбе, когда поднимается tap0 VPN, тупо делаем на OpenVPN сервере, который нас водит в Internet

Код: Выделить всё

route add 172.16.0.0/24 192.168.200.1
После этого, OpenVPN сервер, начинает спокойно, напрямую общаться с компами в локалке 172.16.0.0/24.

На домашней машине роутере (она же VPN клиент)

Код: Выделить всё

route add 192.168.200.0/24 192.168.200.254 (если его нет по netstat -rn)
А далее, для всех тех адресов в Internet, на которые нам нужно ходить через VPN

Код: Выделить всё

route add 1.2.3.4 192.168.200.254
route add 4.3.2.1 192.168.200.254
Достоинства:
  1. Не дергается файрвол. Куда и как ходить, OpenVPN сервер может говорить OpenVPN клиенту сам через PUSH route как разрулить трафик, т.е. на клиенте почти ничего не придется делать. Однако если файрвол все же нужно дернуть, опять же, никто не запрещает запользовать up-script
  2. При меньшем кол-ве NAT-ов, по идее должна быть повыше скорость
  3. Можно спокойно пробросить порты из интернета, на любую машину в домашней локальной сети. Например для какой-нибудь машины из дом. сети, которой нужно держать открытый наружу (в инет) порт, а провайдер вас держит за NAT-ом жестко. Например торент.
Недостатки:
  1. Те маршруты, которые будут PUSH-иться VPN клиенту с сервера, будут идти для всех клиентов, даже если им это не нужно. Однако опять же, возможно это фиксится с помощью up-скрипта.
  2. Если кто-то получит шел на сервере, сможет шастать по всей домашней локалке, если локалку хорошенько не защитить IPFW.
Заключение
Ну вот в целом и все о чем я хотел поведать. Так решил я свою проблему. Оба способа имею свои недостатки и преимущества, но на самом деле, я уверен, золотой срединой был бы способ №3, который сочетал бы в себе плюсы обоих приведенных. Было бы интересно, кто и что мог бы предложить из хороших идей, для отработки такого способа...?
Ну например как защитить компы в домашней локальной сети, в случае если злоумышленник получит шел на сервере, и т.д. и т.п... Я, конечно же буду и сам с этим разбираться, но может у кого-то уже есть подобный опыт, и умные идеи были бы очень кстати. Думаю это не только одному мне интересно...

P.S. Конфиги OpenVPN клиента и сервера могу привести если нужно...
P.P.S. Интересно, для раздела новичков, не слишком грузовой материал получился?;)