Разобрался.... Пишу данный опус в том числе как напоминание для себя (вдруг еще когда пригодится), а своих записей не найду...
В целом перешел на 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. Соотвественно.
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
Не залезая в дебри, и не проводя кучу тестов, что могу отметить в таком способе.
Достоинства:- достаточно гибкая вещь, с помощью лишь IPFW можно достаточно гибко подогнать нужный трафик под нужный FIB и соответственно отправить по нужному каналу. Ну например для yandex.ru гоним трафик через FIB0 (дефолтный), а для google.com гоним через FIB1 (VPN). Можно заставить ходить по VPN на отдельные порты, балансировать трафик с помощью разных там skipto (но это уже совсем другая история) и т.д.
- Сеть 172.16.0.0/24 для злодеев, если проникнут на сервер в тырнете, останется недоступной.
Несдостатки:
- Ну в целом, как таковых я их не увидел, за исключением той мелочи, что домашняя машина-шлюз, в этом случае, в правила 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-ы на домашнюю машину шлюз забил бы, и файрвол дернул бы...
- Мелочь, но есть, при такой реализации я не видел с 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
После этого, 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
Достоинства:
- Не дергается файрвол. Куда и как ходить, OpenVPN сервер может говорить OpenVPN клиенту сам через PUSH route как разрулить трафик, т.е. на клиенте почти ничего не придется делать. Однако если файрвол все же нужно дернуть, опять же, никто не запрещает запользовать up-script
- При меньшем кол-ве NAT-ов, по идее должна быть повыше скорость
- Можно спокойно пробросить порты из интернета, на любую машину в домашней локальной сети. Например для какой-нибудь машины из дом. сети, которой нужно держать открытый наружу (в инет) порт, а провайдер вас держит за NAT-ом жестко. Например торент.
Недостатки:
- Те маршруты, которые будут PUSH-иться VPN клиенту с сервера, будут идти для всех клиентов, даже если им это не нужно. Однако опять же, возможно это фиксится с помощью up-скрипта.
- Если кто-то получит шел на сервере, сможет шастать по всей домашней локалке, если локалку хорошенько не защитить IPFW.
Заключение
Ну вот в целом и все о чем я хотел поведать. Так решил я свою проблему. Оба способа имею свои недостатки и преимущества, но на самом деле, я уверен, золотой срединой был бы
способ №3, который сочетал бы в себе плюсы обоих приведенных. Было бы интересно, кто и что мог бы предложить из хороших идей, для отработки такого способа...?
Ну например как защитить компы в домашней локальной сети, в случае если злоумышленник получит шел на сервере, и т.д. и т.п... Я, конечно же буду и сам с этим разбираться, но может у кого-то уже есть подобный опыт, и умные идеи были бы очень кстати. Думаю это не только одному мне интересно...
P.S. Конфиги OpenVPN клиента и сервера могу привести если нужно...
P.P.S. Интересно, для раздела новичков, не слишком грузовой материал получился?;)