Правильний шлях до цього - прив’язати () до інтерфейсу, який ви хочете використовувати для вихідних пакетів. Оскільки потім ви можете встановити маршрути за допомогою команд 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. Більшість людей ніколи не мають справу з якимись іншими таблицями. Щоб створити таблицю під назвою альтернативна, ми додамо наступний рядок до /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-адреса. Потім буде спробувати основна таблиця та таблиця за замовчуванням. За замовчуванням таблиця зазвичай порожня, тому якщо основне не відповідає, немає маршруту для розміщення. По-перше, давайте заповнювати таблицю чергуватись з правилами 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, встановлене у ланцюжку ПЕРЕДАЧА або таблиці nat, або таблиці mangle. Для цього вам все одно знадобляться модифіковані таблиці маршрутів, наведені вище.
iftopі кожен з них показує правильний тип трафіку. Дуже дякую.