LINUX.ORG.RU
ФорумAdmin

На шлюзе 2 isp, а пакеты ходят только через default gw

 , , ,


0

1

Доброго дня. Делаю ping через основной интерфейс, он проходит, а через запасной выходит destination host unreachable.

Меняю местами шлюз по умолчанию с основного на резервный - меняется и интерфейс где прорывается пинг. Локальной сети нет, только 2 интернета. Скрипт:

#!/bin/bash

# Основной интерфейс
PRIMARY_IF="eth0"
PRIMARY_IP="10.0.2.15"
PRIMARY_NET="10.0.2.0/24"
PRIMARY_GW="10.0.2.1"

# Запасной интерфейс
RESERVE_IF="eth1"
RESERVE_IP="20.0.2.4"
RESERVE_NET="20.0.2.0/24"
RESERVE_GW="20.0.2.1"

# Заглушка
LOOP_IF="lo"
LOOP_IP="127.0.0.1"
LOOP_NET="127.0.0.0/8"

# Включаем пересылку пакетов между сетевыми интерфейсами
echo '1' > /proc/sys/net/ipv4/ip_forward

# Очистка таблиц маршрутизации по провайдерам
ip route flush table PRIMARY
ip route flush table RESERVE

# Таблица маршрутизации основного интерфейса (PRIMARY)
ip route add $PRIMARY_NET dev $PRIMARY_IF src $PRIMARY_IP table PRIMARY
ip route add $RESERVE_NET dev $RESERVE_IF table PRIMARY
ip route add $LOOP_NET dev $LOOP_IF table PRIMARY

# Таблица маршрутизации резервного интерфейса (RESERVE)
ip route add $RESERVE_NET dev $RESERVE_IF src $RESERVE_IP table RESERVE
ip route add $PRIMARY_NET dev $PRIMARY_IF table RESERVE
ip route add $LOOP_NET dev $LOOP_IF table RESERVE

# Правила маршрутизации для интерфейсов
ip rule add from $PRIMARY_IP table PRIMARY
ip rule add from $RESERVE_IP table RESERVE

# Основная таблица маршрутизации
ip route add $PRIMARY_NET dev $PRIMARY_IF src $PRIMARY_IP
ip route add $RESERVE_NET dev $RESERVE_IF
ip route add $LOOP_NET dev $LOOP_IF
#-------------------------------
ip route add $RESERVE_NET dev $RESERVE_IF src $RESERVE_IP
ip route add $PRIMARY_NET dev $PRIMARY_IF
ip route add $LOOP_NET dev $LOOP_IF

# Шлюз по умолчанию
ip route add default via $PRIMARY_GW # или change

# Очистка кеша маршрутизатора
ip route flush cache

exit 0;

В /etc/iproute2/rt_tables таблицы добавлены? Если нет, то их надо или добавить, или использовать числовые идентификаторы вместо PRIMARY и RESERVE.

Вообще, делается это так:

  1. Создаётся новая таблица маршрутизации (один раз)
  2. В таблице прописываются все необходимые маршруты (ip r a default via <gw> src <iface_ip> table <table_name>)
  3. В таблицу загоняется трафик (ip ru a from <iface_ip> table <table_name>)
  4. Пункты 2 и 3 повторяются для всех интерфейсов
  5. Добавляется маршрут по умолчанию через интересующий интерфейс (ip r a default via <gw> dev <iface>)
koi-sama
()
Ответ на: комментарий от koi-sama

Так точно, таблицы добавлены и работоспособны.
Все пункты выполнены, скрипт отрабатывает маршруты видятся.
Только таблиц у меня две, по штуке на провайдера. Маршрут по умолчанию есть, могу его удалить/добавить/поменять.

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

ну дык, у тебя интерфейс eth1 ничего не знает, куда роутить трафик на все адреса, кроме сети 20.0.2.0/24

покажи «ip r»

anonymous
()
Ответ на: комментарий от anonymous
# ip r
default via 10.0.2.1 dev eth0
10.0.2.0/24 dev eth0  proto kernel scope link src 10.0.2.15
20.0.2.0/24 dev eth1  proto kernel scope link src 20.0.2.4
127.0.0.0/8 dev lo scope link
enzo_brn
() автор топика
Ответ на: комментарий от anonymous

Спасибо) как раз сегодня просматривал обе части этой статьи, пробовал как там, но тоже не помогло.

enzo_brn
() автор топика
Ответ на: комментарий от koi-sama

Можно попросить схематический пример в какую таблицу и какой маршрут примерно добавить, а дальше до меня дойдет.)

enzo_brn
() автор топика
Ответ на: комментарий от koi-sama

ага, и выкинуть лишнее — соседний интерфейс и lo

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

у тебя:

# Таблица маршрутизации основного интерфейса (PRIMARY)
ip route add $PRIMARY_NET dev $PRIMARY_IF src $PRIMARY_IP table PRIMARY
ip route add $RESERVE_NET dev $RESERVE_IF table PRIMARY
ip route add $LOOP_NET dev $LOOP_IF table PRIMARY

в примере:

ip route add $P1_NET dev $IF1 src $IP1 table T1
ip route add default via $P1 table T1

чувствуешь разницу?

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

Прошу прощения, просто нет консоли чтобы с буфером. Я запутался с 10-ю блокнотами и переписыванием, завтра покажу результат!)

enzo_brn
() автор топика
Ответ на: комментарий от koi-sama

Спасибо) Завтра отпишу что получилось!)

enzo_brn
() автор топика

Привел интерфейсы виртуалки с дебианом и скрипт в нормальный вид.
Как и прежде отправить пинг удается только с интерфейса на котором весит шлюз по умолчанию.
Есть 2 сети c Интернетом (vbox NAT +dhcp) enp0s8 и enp0s9
И 1 локальная (vbox bridge) enp0s3 с физическим доступом к вн. сети компании.

root@myhost:/# ip r
default via 10.0.3.2 dev enp0s8
10.0.3.0/24 dev enp0s8  proto kernel  scope link  src 10.0.3.15
10.0.4.0/24 dev enp0s9  proto kernel  scope link  src 10.0.4.15
192.168.0.0/24 dev enp0s3  proto kernel  scope link  src 192.168.0.88

root@myhost:/# ip ru s
0:      from all lookup local
32764:  from 10.0.4.15 lookup RESERVE
32765:  from 10.0.3.15 lookup PRIMARY
32766:  from all lookup main
32767:  from all lookup default


Скрипт
#!/bin/bash

# Основной интерфейс
PRIMARY_IF="enp0s8"
PRIMARY_IP="10.0.3.15"
PRIMARY_NET="10.0.3.0/24"
PRIMARY_GW="10.0.3.2"

# Запасной интерфейс
RESERVE_IF="enp0s9"
RESERVE_IP="10.0.4.15"
RESERVE_NET="10.0.4.0/24"
RESERVE_GW="10.0.4.2"

# 'enp0s3' Локальная сеть без выхода в Интернет

# Включаем пересылку пакетов между сетевыми интерфейсами
echo '1' > /proc/sys/net/ipv4/ip_forward

# Очистка таблиц маршрутизации провайдеров
ip r f tab PRIMARY
ip r f tab RESERVE

# Таблица маршрутизации основного интерфейса (PRIMARY)
ip r a $PRIMARY_NET dev $PRIMARY_IF src $PRIMARY_IP tab PRIMARY
ip r a default via $PRIMARY_GW tab PRIMARY

# Таблица маршрутизации резервного интерфейса (RESERVE)
ip r a $RESERVE_NET dev $RESERVE_IF src $RESERVE_IP tab RESERVE
ip r a default via $RESERVE_GW tab RESERVE

# Правила маршрутизации для интерфейсов
ip ru a from $PRIMARY_IP tab PRIMARY
ip ru a from $RESERVE_IP tab RESERVE

# Шлюз по умолчаию
ip r ch default via $PRIMARY_GW

# Очистка кеша маршрутизатора
ip r f cache

exit 0;

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

Проблема решена!

anonymous и koi-sama большое спасибо что откликнулись. Проблема была в virtualbox т.е.у меня не получилось эмулировать сети провайдера. Сделал на физической машине, с двумя реальными провайдерами и локальной сетью, пинги беспрепятственно идут через оба wan-интерфейса на которых есть интернет.
Дальше много букв размышления вслух, для тех кто как и я вдруг наткнется на те же грабли.
Что сделал: ничего - просто настроил interfaces настройками, что дали провайдеры, ну и ЛС.
А эти вспомогательные таблицы маршрутизации и правила, лишь для того чтобы получать ответ на интерфейс с которого делал запрос, не более.
Ну и про пересылку пакетов между интерфейсами, использую эту фичу чтобы"расшарить" интернет для клиентов локальных сетей, в паре с прокси и правилами iptables для «заварота» почти всего трафика на прокси порт.

enzo_brn
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.