Правильный способ сделать это - привязать () к интерфейсу, который вы хотите использовать для исходящих пакетов. Так как Вы можете настроить маршруты с 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и каждый из них показывает правильный тип трафика. Огромное спасибо.