Назад | Перейти на главную страницу

Преобразование NAT с iptables + OpenVPN без воздействия на хост

Я хочу использовать устройство Linux в качестве шлюза по умолчанию для маршрутизации трафика вне хоста через соединение OpenVPN. без воздействуя на хосты, маршрутизирующие Интернет. Я не хочу, чтобы трафик для хоста выходил через VPN, только тот трафик, который идет с других устройств.

Я успешно настроил NAT, у меня есть трафик с устройств, использующих мой хост в качестве выходного шлюза по умолчанию, используя любой маршрут по умолчанию на хосте (например, если VPN открыт, он проходит через VPN, если нет, проходит через хосты нормальное интернет-соединение, с хостом в качестве дополнительного перехода в traceroute)

Однако я не могу успешно настроить это так, чтобы соединение OpenVPN не повлиять на сеть хостов и иметь трафик шлюза маршрута хоста через интерфейс OpenVPN

Что я сделал: - Настроил переадресацию IP и проверил, что он работает - смог остановить обновление OpenVPN маршрута по умолчанию на хосте с помощью route-nopull и pull-filter ignore redirect-gateway

Я предполагаю, что это либо динамическая часть (извлечение информации о маршруте из открытой конфигурации vpn), либо, надеюсь, «нет, действительно, просто примените эти маршруты для флага / настройки трафика NAT».

Конфигурация сети:

Не сижу сейчас за компьютером, но вот моя общая идея:

Первый из:

Пусть у Raspberry есть статический ip-адрес со своим шлюзом по умолчанию - это скучный роутер.

Если скучный маршрутизатор выступает в роли DHCP-сервера, то отключите его! Пусть Raspberry будет вместо этого DHCP-сервером (или другим хостом в сети).

Пусть DHCP-сервер транслирует устройство Raspberry в качестве маршрутизатора по умолчанию для сети вместо утомительного маршрутизатора.

Тогда Traceroute будет:

Хост -> Raspberry -> Скучный роутер-> Интернет

А вот и волшебство.

Если вы хотите перенаправить трафик для прохождения через VPN вместо выхода из дома по умолчанию, вам следует использовать source based routing на малине.

Traceroute для того конкретного хоста, который проходит через VPN, будет выглядеть следующим образом:

Хост -> Малина -> Туннель Openvpn -> Интернет.

Чтобы это работало ip forwarding должен быть включен на Raspberry и на сервере VPN.

Я расширю ответ, когда вернусь с работы домой. :-)

РЕДАКТИРОВАТЬ

Краткий обзор маршрутизации на основе источника:

Я использую эта страница в качестве основы для моего решения.

Идея состоит в том, что вы определяете, как трафик перенаправляется в зависимости от того, откуда он исходит.

Таблица маршрутизации по умолчанию в Linux называется main. Вы можете увидеть имена всех ваших таблиц маршрутизации с помощью команды ip rule show.

Он должен выдавать этот вывод по умолчанию:

0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

Raspberry выполнит все соответствующие правила и отправит пакет, используя первое совпадающее правило.

Поскольку таблица main содержит правило, говорящее примерно так:

default via <boring routers ip address> dev eth0

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

Но вот что интересно: вы можете создать отдельную таблицу маршрутизации для всех хостов, которые хотите отправить через VPN-соединение. Для простоты назовем эту таблицу маршрутизации openvpn.

Вы должны изменить /etc/iproute2/rt_tables так это выглядит примерно так:

#
# reserved values
#
255     local
254     main
253     default
200     openvpn # <-- Note THIS line!
0       unspec
#
# local
#
#1      inr.ruhep

Допустим, вы хотите перенаправить другую машину с IP-адресом 192.168.0.100 через VPN, тогда вы создадите правило, говорящее примерно так:

ip rule add from 192.168.0.100 table openvpn

Если мы предположим, что IP-адрес вашего VPN-шлюза внутри туннеля - 10.0.0.1, вы можете использовать следующую команду для установки маршрута по умолчанию:

ip route add default via 10.0.0.1 table openvpn dev tun0

Если все хосты в вашей сети используют Raspberry в качестве шлюза, то весь их трафик будет перенаправлен на маршрутизатор. Кроме если трафик исходит из 192.168.0.100. В этом случае он будет перенаправлен по каналу VPN.

Это то, что вы ищете? :-)