Є кілька можливостей, залежно від того, як ви хочете вирішити, які пакети куди йти. Більшість із них потребуватиме певного розуміння того, як мережа TCP / IP працює в Linux. Основними інструментами, які потрібно знати, щоб робити складні речі, є iptables(Ubuntu: iptables
) та iproute2 ( ipкоманда) (Ubuntu: iproute
, iproute-doc
).
Якщо ви можете повністю розрізнити цільову IP-адресу, це просто: маршрутизуйте IP-адреси відповідно до своїх побажань. Наприклад, наступні команди викликають всі пакети для 1.2.3. x і 1.2.4.2 для переходу через ppp0інші пакети та інші пакети eth0.
route add -net 1.2.3.4/24 ppp0
route add -host 1.2.4.2 ppp0
route add -net 0.0.0.0/0 eth0
Для більш складних вимог потрібно почати використовувати iptablesі ip route. Наприклад, наступні команди встановлюють спеціальні таблиці маршрутизації, щоб усі пакети, позначені 1, виходили через, eth0а всі пакети, позначені 2, виходили через ppp0(за винятком пакетів, призначених для localhostприєднання до інтерфейсу петлі).
ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth0
ip rule add fwmark 2 table 2
ip route add 127.0.0.0/8 table 2 dev lo
ip route add 0.0.0.0/0 table 2 dev ppp0
Тепер ви можете використовувати, iptablesщоб "погладити" вихідні пакети, додавши позначку, яка визначатиме, яким маршрутом вони рухаються. Наприклад, ось як надіслати весь вихідний SMTP-трафік (порт 25) через eth0і весь трафік, породжений програмою, що працює як користувач proxyчерез ppp0.
iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -m owner --uid-owner proxy -j MARK --set-mark 2
Дивіться також 2 мережеві інтерфейси, підключені до Інтернету. Виберіть той, який потрібно використовувати відповідно до доменного імені, і прив’яжіть програмне забезпечення до різних мережевих інтерфейсів .
Вам потрібно буде домовитись виконання цих команд, коли підключені обидва інтерфейси. Я рекомендую написати сценарій під назвою, /etc/network/if-up.d/0justin-routesякий виконує потрібні команди. Цей сценарій буде виконуватися щоразу, коли буде піднято мережевий інтерфейс; оскільки його ім'я починається з а, 0він запуститься на початку цього процесу, перед тим як встановити специфічну програму, яка може очікувати, що маршрути будуть встановлені. Є симетричний /etc/network/if-down.d/випадок, якщо ви також хочете робити щось, коли один з інтерфейсів виходить з ладу. (Усі асоційовані маршрути будуть автоматично стертись, що може залишити деякі пакети прокрученими, коли ви хочете, щоб вони повернулися до іншого інтерфейсу.)
Сценарії ifup задокументовані в interfaces(5) man page. Головне, що потрібно знати, - це те, що назва інтерфейсу, що виховується або знижується, знаходиться в змінній оточення IFACE. Ви можете дізнатися, чи не працює інший інтерфейс if ifconfig | sed 's/ .*//' | grep -Fqx 'eth0'; then ….