Как настроить маршрутизацию через сервер Linux с одним сетевым адаптером?
У меня есть локальная сеть. Есть маршрутизатор на который у меня нет полного доступа и я не могу настроить на нем маршрутизацию (маршрутизатор МГТС - есть доступ к iptables, но нет доступа к ip route). Я хочу сделать так, чтобы появилась возможность маршрутизировать траффик. Есть сервер Linux, на котором крутится, например, 2 VPN клиента - один VPN для соседней локальной сети, второй VPN для другой локальной сети. На сервере есть одна сетевая карта. Для обычных клиентов вопрос решился просто - я запускаю на своем Linux сервере DHCP и добавляю маршруты в DHCP. Но для клиентов Android это не работает - у них используется только default gateway. Поэтому я хочу, чтобы весь ip траффик от Android клиентов проходил через мой сервер Linux на котором бы я все правильно маршрутизировал. Большинство инструкций описывают как настроить NAT, причем как правило с 2 сетевыми картами (что логично). А как сделать маршрутизацию если карта одна.
Я попробовал тупо включить на Linux сервере net.ipv4.ip_forward=1 и использовать его в качестве шлюза по умолчанию на клиенте. Но это не сработало.
Можно, конечно, закостылить и сделать вид, что сервер находится в другой подсети.
Допустим роутер 192.168.1.1/24
Сервер 192.168.1.2
VPN1: 192.168.2.0, VPN2: 192.168.3.0
Вешаем на один адаптер сервера 2 интерфейса - eth0, eth0:0. Первый интерфейс делаем 192.168.2.1/25. Добавляем второй интерфейс серверу eth0:0 и назначаем ему IP 192.168.1.128/25. Android клиенту даем адрес 192.168.1.129 и шлюзом по умолчанию назначаем 192.168.1.128. Во-первых какая-то дичь, а во-вторых не уверен, что это будет работать. Как это правильно и просто сделать?
Сколько в линуксе сетевых карт - особо без разницы, виртуальные интерфейсы работают ровно так же, как настоящие. Можете на один физический интерфейс повесить сколько угодно адресов и маршрутизировать на здоровье.
Большинство инструкций описывают как настроить NAT, причем как правило с 2 сетевыми картами (что логично)
Не знаю, насколько это логично; стараюсь писать правила более универсально, не привязывая к интерфейсам без необходимости. Для вашего случая:
-A POSTROUTING -s 192.168.1.0/25 ! -d 192.168.1.0/25 -j MASQUERADE
Вешаем на один адаптер сервера 2 интерфейса - eth0, eth0:0. Первый интерфейс делаем 192.168.2.1/25. Добавляем второй интерфейс серверу eth0:0 и назначаем ему IP 192.168.1.128/25.
IP-aliases are an obsolete way to manage multiple IP-addresses/masks per interface. Newer tools such as iproute2 support multiple address/prefixes per interface, but aliases are still supported for backwards compatibility.
У этого решения 2 минуса. Во-первых если делать NAT, то в данном случае SNAT достаточен. Во-вторых хотелось бы обойтись обычными средствами маршрутизации - зачем делать NAT 2 раза. Мой роутер уже делает NAT, остальное хотелось бы разрулить обычными средствами маршрутизации.
Если бы у меня была возможность прописать на роутере маршрут, то я бы просто прописал на роутере маршруты: все, что для VPN1.ip, все что для VPN2.ip отправляй на Linux server IP и не задавал этот вопрос.
Я не могу настроить маршрутизацию на маршрутизаторе, как глупо это ни звучит - таковы условия задачи.
Теоретически все должно быть очень просто. Есть маршрутизатор (192.168.1.1), VPN сервер (192.168.1.2), клиент (192.168.1.10). Клиент отправляет IP пакет src:192.168.1.10, dst:8.8.8.8. Таблица маршрутизации на клиенте говорит - отправляй этот пакет через VPN сервер (192.168.1.2). Пакет приходит на VPN сервер. Таблица маршрутизации на VPN сервере говорит - dst:8.8.8.8 - отправляй этот пакет на 192.168.1.1. И пакет уходит на маршрутизатор (192.168.1.1). Задача решена. Маршрутизатор получает пакет src:192.168.1.10, dst:8.8.8.8, видит, что его отправил клиент (192.168.1.10). Надо просто понять как это сделать. Что характерно таблица маршрутизации на VPN сервере и клиенте уже правильно настроена. Но есть какой-то маленький нюанс.
pinoquinho, без использования NAT у вас получается несимметричный маршрут. Наружу пакеты проходят через линуксовый сервер, а внутрь - мимо линуксового сервера. Иногда такая схема может работать, но чаще вызывает проблемы. Устройства в сети получают ответные пакеты не от того хоста, от которого ожидают.
Видимо да, маршрут получается ассиметричный, но это не на уровне IP, а на транспортном уровне. То есть на транспортном уровне IP мы отправляем пакет на 8.8.8.8, он уходит в сеть через Mac адрес Linux VPN server (192.168.1.2), а приходит - не знаю как. Маршрутизатор 192.168.1.1 получает пакет с Mac адреса Linux VPN server - как он его назад отправит, так тот и придет. Опять же таки не знаю, проверяется ли как-нибудь Mac адреса. Но в принципе неплохо было бы проверить - вот только не знаю как это настроить. Поэтому и задаю вопрос - может кто-нибудь знает как?
Ну и, кстати, судя по всему абсолютно ничего криминального в этом нет. IPVS/LVS, говорят, именно так и работает:
Вот тут говорят, что у IPVS есть 3 режима работы, в том числе Direct Routing (gatewaying) - https://habr.com/ru/post/104621/
Вот тут на картинке нарисована асиметричная схема https://habr.com/ru/post/252415/