
Проблемы с асимметричной маршрутизацией сводят меня с ума!
Я пытаюсь построить многосетевой сервер с 3 сетевыми картами. Каждая сетевая карта подключена к 3 разным подсетям:
eth0: подключено к локальной сети, 10.99.72.38; функция: трафик управления
eth1: подключено к локальной сети, 10.99.70.150; функция: трафик пользователя
eth2: подключено к глобальной сети, 10.99.74.85; функция: трафик пользователя
Я использую образ Amazon Linux (Linux 3.14.20-20.44.amzn1.x86_64 x86_64), но могу перейти на CentOS, если это действительно будет иметь значение.
Функциональность, которую я пытаюсь реализовать:
eth0: Управление трафиком
- адрес: 10.99.72.38
- Я хочу, чтобы это был «изолированный» интерфейс, принимающий и отвечающий только на адреса в диапазоне 10.0.0.0/8.
- Думайте об этом как о сетевой карте «ssh только из локальной сети».
- Можно ответить ТОЛЬКО через eth0
- Все остальные пункты назначения заблокированы, то есть через этот интерфейс невозможно получить доступ ни к каким другим пунктам назначения.
- НЕ БУДЕТ использоваться eth1 или eth2 для ответного трафика, поступающего на eth0.
eth1: Пользовательский трафик в/из локальной сети
- Адрес: 10.99.70.150
- принимает любой пользовательский трафик из локальной сети в любое место назначения
- направляет пакеты через eth1 для трафика, предназначенного для 10.xxx
- направляет пакеты через eth2 для любого другого пункта назначения (маршрут по умолчанию)
- НЕ будет маршрутизировать входящие пакеты через eth0
eth2: Пользовательский трафик в/из WAN
- адрес: 10.99.74.85
- принимает любой пользовательский трафик из eth1 и отправляет пакеты из eth2 в любое место назначения, кроме 10.xxx
- принимает ответные пакеты на eth2 и направляет через eth1 любой трафик, предназначенный для 10.xxx
- НЕ будет маршрутизировать входящие пакеты через eth0
Я создал таблицу iproute2 в rt_tables под названием 'mgmt' и добавил правила маршрутизации на основе политик с высоким приоритетом, чтобы попытаться изолировать этот интерфейс, но независимо от того, что я пытаюсь, основная таблица маршрутизации по-прежнему, похоже, вызывается, поскольку eth0 является маршрутом по умолчанию. Проблемы включают в себя:
- Входящие пакеты с eth1 маршрутизируются через eth0 (мне это не нужно!)
- Входящие пакеты с eth2, предназначенные для 10.xxx, маршрутизируются через eth0 (мне это не нужно!)
- Когда я удаляю маршрут eth0 по умолчанию из main, я полностью теряю функциональность eth0, даже при наличии маршрута в таблице mgmt, но eth1 затем отвечает правильно.
Начиная с самого начала, неизмененная таблица маршрутов (route -n):
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.99.72.1 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 10.99.70.1 0.0.0.0 UG 10001 0 0 eth1
0.0.0.0 10.99.74.1 0.0.0.0 UG 10002 0 0 eth2
10.99.70.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
10.99.72.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.99.74.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
Неизмененные правила IP:
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
Буду очень признателен за любую помощь в правильной формулировке конкретных правил маршрутизации, таблиц и маршрутов, а также за демонстрацию того, как будут выглядеть окончательные таблицы маршрутизации и правила!
решение1
Вам следует избавиться от настройки шлюза по умолчанию для eth0
и eth1
. Как это сделать, зависит от вашего дистрибутива.
Вам, вероятно, не нужна маршрутизация политик. Я думаю, то, что вам нужно, лучше всего достигается с помощью Netfilter / iptables
.
iptables -I INPUT 1 -i eth0 ! -s 10.99.72.0/24 -j DROP
iptables -I FORWARD 1 -i eth0 -j DROP
iptables -I FORWARD 2 -o eth0 -j DROP
iptables -I INPUT 2 -i eth1 ! -s 10.0.0.0/8 -j DROP
iptables -I FORWARD 3 -i eth1 -j ACCEPT
iptables -I INPUT 3 -i eth2 -m conntrack --ctstate NEW -j DROP
iptables -I FORWARD 4 -i eth2 -j ACCEPT
Вероятно, это можно сделать и без Netfilter, но с маршрутизацией политик.