Как настроить в linux два маршрута по умолчанию (соответствующие двум интерфейсам), чтобы входящий трафик с обоих интерфейсов принимался.
У меня есть хост с двумя сетевыми адаптерами eth0
и eth1
. Он подключен к двум сетям, скажем:
Разработчик: eth0
, IP: 1.1.1.4
, Сетевая маска: 255.255.255.0
, Шлюз: 1.1.1.1
Разработчик: eth1
, IP: 2.2.2.4
, Сетевая маска: 255.255.255.0
, Шлюз: 2.2.2.1
(Обе сети подключены к Интернету.)
Маршруты (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-адреса).
Я хочу:
Исходящий трафик (исходящий локально) должен использовать eth0
интерфейс по умолчанию.
Входящий трафик должен приниматься с обоих интерфейсов. (Так 4.4.4.4
должен иметь возможность пинговать оба 1.1.1.4
и 2.2.2.4
)
Используя 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