Правильний шлях до цього - прив’язати () до інтерфейсу, який ви хочете використовувати для вихідних пакетів. Оскільки потім ви можете встановити маршрути за допомогою команд 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
і кожен з них показує правильний тип трафіку. Дуже дякую.