Правильный способ сделать это - привязать () к интерфейсу, который вы хотите использовать для исходящих пакетов. Так как Вы можете настроить маршруты с ip route
и ip rule
команды управления , как пакеты направляются на основании их исходящего интерфейса. Для моего примера я буду использовать следующую сеть:
- eth0:
- Адрес: 192.168.0.2/24
- Шлюз по умолчанию: 192.168.0.1
- eth1:
- Адрес: 192.168.1.2/24
- Шлюз по умолчанию: 192.168.1.1
Я создам две таблицы маршрутизации: одну для исходящего трафика для eth0, называемую альтернативой, и одну таблицу для eth1, называемую основной. Таблица маршрутизация магистрали всегда существует и нормальная таблица , которая используется route
и ip route
командами. Большинство людей никогда не имеют дело с другими таблицами. Чтобы создать таблицу под названием alternate, мы добавим следующую строку /etc/iproute2/rt_tables
:
10 alternate
Основная таблица имеет приоритет по умолчанию 254. Правила, для которых действует таблица маршрутизации, контролируются ip rule
командой. По умолчанию эта команда выведет список существующих правил, который должен выглядеть примерно так:
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
Это в основном говорит, что он будет искать маршрут в таблице, local
которая является специальной таблицей, поддерживаемой ядром для локальных маршрутов, таких как мой собственный IP-адрес. Затем он попытается использовать таблицу main и table default. Таблица по умолчанию обычно пуста, поэтому, если в main нет совпадений, нет маршрута к хосту. Во-первых, давайте заполним таблицу чередуя с правилами для eth0.
sudo ip route add table alternate 192.168.0.0/24 dev eth0
sudo ip route add table alternate 192.168.1.0/24 dev eth1
sudo ip route add table alternate default via 192.168.0.1
Обычно вы хотите, чтобы alternate
таблица выглядела аналогично main
таблице. Разница лишь в том, когда маршрутизация должна быть другой. Вы можете не захотеть включать вторую строку выше, если вы буквально хотите, чтобы весь трафик NFS, HTTP и т. Д. Проходил через шлюз по умолчанию на eth0, даже если он предназначен для сети на eth1. Следующим шагом является добавление правила для использования этой альтернативной таблицы маршрутизации:
sudo ip rule add from 192.168.0.0/24 pref 10 table alternate
Это правило говорит, что любой трафик, приходящий с адреса в сети 192.168.0, будет использовать alternate
таблицу маршрутизации вместо обычной main
таблицы. Последний шаг - убедиться, что все клиенты, которые должны его использовать, eth0
связываются с ним. С wget
, например, установить --bind-address=192.168.0.2
, для NFS установитьclientaddr=192.168.0.2
опция монтирования Если вы используете LibWWW с Perl, вы можете установить опцию localaddr в LWP :: UserAgent для управления локальным интерфейсом, с которым он связан. Если у вас есть клиент, которым вы не можете управлять связыванием, и исходный код компиляции недоступен, вы можете использовать правило iptables для изменения его адреса, но это скорее хак и может не сработать. Вам понадобится правило SNAT, настроенное в цепочке PREROUTING таблицы nat или таблицы mangle. Вам все еще понадобятся измененные таблицы маршрутизации, приведенные выше, чтобы это работало.
iftop
и каждый из них показывает правильный тип трафика. Огромное спасибо.