Назад | Перейти на главную страницу

Как настроить два маршрута по умолчанию в Linux

TL; DR

Как настроить в linux два маршрута по умолчанию (соответствующие двум интерфейсам), чтобы входящий трафик с обоих интерфейсов принимался.

Сценарий

У меня есть хост с двумя сетевыми адаптерами eth0 и eth1. Он подключен к двум сетям, скажем:

(Обе сети подключены к Интернету.)

Маршруты (ip route show):

default via 1.1.1.1 dev eth0 metric 1
default via 2.2.2.1 dev eth1 metric 2
1.1.1.0/24 dev eth0 src 1.1.1.4
2.2.2.0/24 dev eth1 src 2.2.2.4

(Более низкий показатель означает более высокий приоритет.)


Теперь, когда кто-то пингует 2.2.2.4 с какого-то внешнего хоста (скажем 4.4.4.4), ответа нет.

Выход tcpdump -i eth1 на моем хосте:

22:41:27.431539 IP 4.4.4.4 > 2.2.2.4: ICMP echo request, id 8625, seq 4, length 64
22:41:28.439492 IP 4.4.4.4 > 2.2.2.4: ICMP echo request, id 8625, seq 5, length 64
22:41:29.447666 IP 4.4.4.4 > 2.2.2.4: ICMP echo request, id 8625, seq 6, length 64
22:41:30.455528 IP 4.4.4.4 > 2.2.2.4: ICMP echo request, id 8625, seq 7, length 64

После некоторых исследований выяснилось, что когда сетевой стек Linux получает пакет от 4.4.4.4, он проверяет свою таблицу маршрутизации, чтобы узнать, какой интерфейс должен был использоваться для 4.4.4.4 (который eth0 в таблице маршрутизации). Теперь, когда пакет пришел из eth1 интерфейс, Linux просто отбрасывает его (эта политика, вероятно, предназначена для предотвращения подмены IP-адреса).


Я хочу:

Используя iproute2, вы можете сделать что-то вроде этого:

echo "1 admin" >> /etc/iproute2/rt_tables
echo "2 users" >> /etc/iproute2/rt_tables

ip rule add from 192.168.122.40/32 dev eth0 table admin
ip rule add from 192.168.123.41/32 dev eth1 table users

ip route add default via 192.168.122.1 dev eth0 table admin
ip route add default via 192.168.123.1 dev eth1 table users

Теперь у вас будет две таблицы маршрутизации с двумя шлюзами.

Это явление называется unicast rpf (пересылка обратного пути) как стандартный, но обратный фильтр пути в Linux. Вы можете отключить это без каких-либо серьезных негативных последствий (если вы не провайдер .. и маршрутизатор).

echo 0 > /proc/sys/net/ipv4/conf/default/rp_filter

Тогда ваш пример должен работать так, как вы хотите.

Если ваше приложение привязывается к 0.0.0.0 также необходимо добавить такие правила, как:

ip rule add from 0.0.0.0/32 to 192.168.122.0/24 dev eth0 table admin

ip rule add from 0.0.0.0/32 to 192.168.123.0/24 dev eth1 table users