LINUX.ORG.RU
ФорумAdmin

Маршрутизация через сервер Linux с одним сетевым адаптером

 , , ,


0

2

Добрый день. Я хочу свою локальную сеть соединить с двумя другими локальными сетями через VPN. VPN крутится на выделенном linux сервере, настроить маршрутизацию на роутере я не могу.

Более детальное описание. У меня есть локальная сеть. Есть маршрутизатор на который у меня нет полного доступа и я не могу настроить на нем маршрутизацию (маршрутизатор МГТС - есть доступ к iptables, но нет доступа к ip route). Я хочу сделать так, чтобы появилась возможность маршрутизировать траффик. Есть сервер Linux, на котором крутится, 2 VPN клиента - один VPN для соседней локальной сети, второй VPN для другой локальной сети. На сервере есть одна сетевая карта. Для обычных клиентов вопрос решился просто - я запускаю на своем Linux сервере DHCP и добавляю соответсвующие VPN маршруты в DHCP - все хорошо. Но для клиентов Android это не работает - у них используется только default gateway из DHCP. Поэтому я хочу, чтобы весь ip траффик от Android клиентов проходил через мой сервер Linux на котором бы я все правильно маршрутизировал (то есть мой Linux сервер будет использоваться как default gateway для Android клиентов). Большинство инструкций описывают как настроить NAT на сервере, причем как правило с 2 сетевыми картами. А как сделать маршрутизацию если карта одна. Хотелось бы именно нормальную маршрутизатию. Если пакет предназначен для обного из VPN, то он бы маршрутизировался в VPN. Если нет, то «магически уходил бы» на роутер.

Я попробовал тупо включить на Linux сервере net.ipv4.ip_forward=1 и использовать его в качестве шлюза по умолчанию на клиенте. Но это не сработало. Трафик в VPN маршрутизируется, на сервер ничего не уходит.

Можно, конечно, закостылить и сделать вид, что сервер находится в другой подсети. Допустим роутер 192.168.1.1/24 Linux Сервер 192.168.1.2 VPN1: 192.168.2.0, VPN2: 192.168.3.0

Вешаем на один адаптер сервера 2 интерфейса - eth0, eth0:0. Первый интерфейс делаем 192.168.1.2/25. Добавляем второй интерфейс серверу eth0:0 и назначаем ему IP 192.168.1.128/25. Android клиенту даем адрес 192.168.1.129 и шлюзом по умолчанию назначаем 192.168.1.128. Во-первых это какая-то дичь (почему 2 IP на один интерфейс), а во-вторых не уверен, что это будет работать потому что роутер, например, будет считать всю сеть 192.168.1.0/24 локальной и как он будет отправлять ответ клиенту - напрямую ли. NAT на Linux сервере делать тоже не хочется - хочется, чтобы роутер видел настоящих клиентов.

Кто-нибудь знает, как это правильно и просто сделать? Или хотя бы подсказать где именно рыть.

Это возможно.
Вариант 1. В sysctl net.ipv4.conf.all.send_redirects=0 и net.ipv4.conf.$IFNAME.send_redirects=0
Клиенту defgw - прописываем ваш сервер.
Имейте ввиду, что если все это происходит в одной сети + не используется nat, то через ваш сервер пакеты пойдут только в одну сторону, от клиента, ответ же клиент получит напрямую от роутера.
Вариант 2. arp роутинг

anc ★★★★★ ()
Ответ на: комментарий от anc

все это происходит в одной сети + не используется nat, то через ваш сервер пакеты пойдут только в одну сторону, от клиента, ответ же клиент получит напрямую от роутера Меня бы это более чем устроило.

Если кратко - не работает. У меня уже стояло net.ipv4.conf.all.send_redirects=0 и net.ipv4.conf.$IFNAME.send_redirects=0 и ничего не работало. Ну я на всякий случай поменял и еще раз попробовал. Результат нулевой.

arp routing - честно говоря не знаю что такое. Знаю, что есть proxy arp - это когда две сетки, связаны по IP, но не связаны по L2 (то есть ethernet пакеты между сетками не ходят), а мы их связываем без всяких ip gateway, ip routing table и всем клиентам в этих сетках начинает казаться, что у них просто одна большая локальная сеть. Роутер сообщает всем локальным клиентам, что mac адрес «нелокальных» клиентов == mac роутера. Клиенты шлют свои пакеты в локалку, их получает роутер и маршрутизирует в другую локалку. Это явно не мой случай, мне нужна маршрутизация на уровне IP.

Может arp routing это что-то другое, но гугол так вот на раз два не сказал мне что это такое.

ded_perdyn ()

В общем пока ничего не получилось.

Насколько я понимаю проблему - принимая пакет linux видит, что он не предназначен ему, что он мог бы его отправить дальше, но отправить пришлось бы через тот же интерфейс и он его не отправляет.

Хотел попробовать iptalbes -j ROUTE, но такой опции давно как нет. Попробовал iptables -j MARK, а потом смаршрутизировать пакет через другую таблицу маршрутизации. Не сработало. Попробовал даже как изначально планировал и описывал - завел на сервере 2 адреса из разных подсеток 192.168.1.2/25, 192.168.1.128/25, в надежде и сказал клиенту, что default gateway - 192.168.1.128, в надежде, что запрос смаршрутизируется клиент -> 192.168.1.128/25 -> 192.168.1.2/25 -> роутер, ну или как-то так. И все равно нет.

ded_perdyn ()
Ответ на: комментарий от ded_perdyn

Если кратко - не работает. У меня уже стояло net.ipv4.conf.all.send_redirects=0 и net.ipv4.conf.$IFNAME.send_redirects=0 и ничего не работало.

А forwarding разрешали?

echo 1 > /proc/sys/net/ipv4/ip_forward

arp routing - честно говоря не знаю что такое. Знаю, что есть proxy arp

Оно самое proxy arp.

anc ★★★★★ ()
Ответ на: vlan? от MindLess

Форвардинг пакетов в ядре включен net.ipv4.ip_forward = 1. Выяснилось, что пакеты теряются где-то между прохождениями таблиц filter FORWARD и mangle POSTROUTING.

Ну vlan это, наверное хорошо. Но как мне кажется я что-то где-то как-то накосячил и из-за этого не работает то, что должно. Ну и на роутере (МГТС gpon) нет поддержки через тот интерфейс, который у меня есть.

На всякий случай все параметры прилагаю. Мне кажется в ядре какой-то параметр выключен или наоборот.

ded_perdyn ()
Ответ на: комментарий от ded_perdyn

Оказалось iptables *filter DEFAULT FORWARD policy было DENY. Обнаружил включив iptables -t raw -j TRACE.

Ну то есть стандартное «чукча не читатель, чукча писатель». Выложить постом выше выхлоп iptables-save авось кто-то за меня его прочитает...

anc ★★★★★ ()