Я хочу использовать устройство Linux в качестве шлюза по умолчанию для маршрутизации трафика вне хоста через соединение OpenVPN. без воздействуя на хосты, маршрутизирующие Интернет. Я не хочу, чтобы трафик для хоста выходил через VPN, только тот трафик, который идет с других устройств.
Я успешно настроил NAT, у меня есть трафик с устройств, использующих мой хост в качестве выходного шлюза по умолчанию, используя любой маршрут по умолчанию на хосте (например, если VPN открыт, он проходит через VPN, если нет, проходит через хосты нормальное интернет-соединение, с хостом в качестве дополнительного перехода в traceroute)
Однако я не могу успешно настроить это так, чтобы соединение OpenVPN не повлиять на сеть хостов и иметь трафик шлюза маршрута хоста через интерфейс OpenVPN
Что я сделал: - Настроил переадресацию IP и проверил, что он работает - смог остановить обновление OpenVPN маршрута по умолчанию на хосте с помощью route-nopull
и pull-filter ignore redirect-gateway
Я предполагаю, что это либо динамическая часть (извлечение информации о маршруте из открытой конфигурации vpn), либо, надеюсь, «нет, действительно, просто примените эти маршруты для флага / настройки трафика NAT».
Конфигурация сети:
192.168.0.0/24
Не сижу сейчас за компьютером, но вот моя общая идея:
Первый из:
Пусть у 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.
Это то, что вы ищете? :-)